ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • c#에서 mysql (MySqlCommand) 사용하기 예시
    프로그래밍/DB 2016. 11. 24. 21:22
    반응형

     



    c#에서 MySQL을 엑세스하기 위해서는 일반적으로 MySQL을 위한 ADO.NET 드라이버인 MySQL Connector/Net을 사용하는데, 이 MySQL Connector/Net은 MySQL 웹사이트에서 무료 다운 받아 설치할 수 있다. 드라이버를 설치한 후에 C# 프로젝트에서 MySql.Data.dll를 참조한 후 MySql.Data.MySqlClient 네임스페이스를 참조하면, MySQL버젼의 ADO.NET 클래스들 (예: MySqlConnection, MySqlCommand, MySqlDataReader 등)을 이용할 수 있다. 


    1. mysql connectin을 만든다. connection이 정상적으로 열리지 않을 경우 에러 메세지 출력

     

     

                MySqlConnection conn = new MySqlConnection("SERVER=server ip or address(ex:kugancity.tistory.com);DATABASE=dbname;UID=user_id;PWD=password;");

                try
                {
                    // 데이터베이스를 open 한다. 
                    conn.Open();
                    Console.WriteLine(string.Format("connection is '{0}'", conn.State));

                 }
                catch (Exception ex)
                {
                    // 연결되지 못했거나, 오류가 발생하면 출력한다. 
                    MessageBox.Show("can not open connection!");
                    string line = string.Format("{0},", ex);
                    MessageBox.Show(line);
                }

     

    2. MySqlCommand 클래스 사용하여 데이터베이스 operation 작업하기 


    MysqlCommand object를 사용하여 데이터베이스 operation을 수행할 수 있습니다. 

    MysqlCommand object에서 자주 사용하는 세 가지 함수는 아래와 같습니다. 

       

        ExecuteReader - 데이터를 받아오는 쿼리문에 사용합니다. 데이터는 MySqlDataReader 라는 클래스의 객체로 리턴됩니다. 

        ExecuteNonQuery - 데이터 삽입/삭제 시 사용합니다. 

        ExecuteScalar - 하나의 값이 리턴되는 쿼리문에 사용합니다. 



    아래는 각 함수를 사용하는 예시들 입니다. 


    - 테이블 데이터 받아오기  (ExecuteReader 함수 사용)


       MySqlDataReader 클래스는 SQL Server와 연결을 유지한 상태에서 한번에 한 레코드(One Row)씩 데이타를 가져오는데 사용됩니다.      MySqlCommand.ExecuteReader()로부터 리턴되는 MySqlDataReader 객체는 (파일의 BOF와 같이) 첫 Row 이전에 포인터를 위치시키기 때문에 개발자는 MySqlDataReader의 Read()메서드를 써서 처음 Row로 이동해 주어야 합니다. MySqlDataReader는 하나의 Connection에 하나만 Open되어 있어야 하며, 사용이 끝나면 Close() 메서드를 호출하여 닫아 줍니다. 


     

              

    try

            {

                string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'";

                MySqlCommand cmd = new MySqlCommand(sql, conn);

                MySqlDataReader rdr = cmd.ExecuteReader();


                while (rdr.Read())

                {

                    Console.WriteLine(rdr[0]+" -- "+rdr[1]);

                }

                rdr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }


     

    만약 이미 DataReader가 하나의 connection에 열려있는데 이 datareader instance나 connection을 다시 사용하려고 하면 아래와 같은 에러가 발생하니 유의하자. 


    there is already an open datareader associated with this connection which must be closed first


    이 에러가 발생하는 원인과 해결방법은 다른 포스팅에서 자세하게 설명을 해 놓았습니다. 



    - 특정 테이블의 전체 row 개수 구하기. (ExecuteScalar 함수 사용)

     

                MySqlCommand cmd = new MySqlCommand("select count(*)  from table_name;", conn);
                try
                {
                    index = Convert.ToInt32(cmd.ExecuteScalar()) + 1;
                }
                catch (Exception ex)
                {
                    // 연결되지 못했거나, 오류가 발생하면 출력한다. 
                    Console.WriteLine("{0} Exception caught.", ex);
                }

     

     

    -  insert 문 수행 (ExecuteNonQuery 함수 사용)

     

                    MySqlCommand cmd_insert = new MySqlCommand(total_line, conn);
                    try
                    {
                        cmd_insert.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        // 연결되지 못했거나, 오류가 발생하면 출력한다. 
                         string line = string.Format("{0},", ex);
                        MessageBox.Show(line);
                     }

     

    3. connection 닫기

     

     

     // 데이터베이스를 close 한다.  
     conn.Close();
     Console.WriteLine(string.Format("connection is '{0}'", conn.State));

     


    참고: http://www.csharpstudy.com/Practical/Prac-mysql.aspx

    https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-sql-command.html

    https://blogs.msdn.microsoft.com/spike/2009/08/20/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-closed-first-explained/

    http://www.csharpstudy.com/Data/SQL-command.aspx



    728x90
    반응형
Designed by Tistory.