이전 포스트에서 프로젝트에 DB을 추가하는 방법을 봤습니다.
2009/09/01 - [프로그래밍/유용 알고리즘 모음] - Visual Studio에서 DB 연결하기
이번에는 추가한 DB를 C#을 통해 작업을 방법에 대해 포스팅 해볼까 합니다.
일단 현재 제가 ODBC로 작업을 하기 떄문에 ODBC 중심으로 코드를 적을 겁니다.
하지만 C#에서 ODBC나 SQL이나 거의 99% 같은 방식으로 코딩을 할수 있기때문에 다른 형식의 DB를 쓴다 하더라도 적용하는데 문제 없을 겁니다. 단지 변수명을 OdbcConnection 에서 SqlConnection 으로 변경만 해주면 되는 식이니까 말이죠.
일단 DB에 연결을 하기 위해서는 DB 연결 객체를 만들어야 합니다.
연결 객체는 ODBC의 연결 문자열을 필요로 하는데, Visual Sutio에서 DB를 추가할때 생성 해줍니다. 이것을 갖다 쓸수도 있고, 직업 작성 해줄수도 있습니다.
private OdbcConnection m_DBConnection;
m_DBConnection = new OdbcConnection();
m_DBConnection.ConnectionString = "Dsn=DBName;" + "Uid=ID;" + "Pwd=Pass;";
m_DBConnection = new OdbcConnection();
m_DBConnection.ConnectionString = "Dsn=DBName;" + "Uid=ID;" + "Pwd=Pass;";
그 다음 DB에 쿼리를 보내는 방식입니다. 쿼리를 보내는 방식은 여러 방식이 있는데, 현재 제가 쓰는 방식은 밑과 같습니다. 조금 꼼수 같은 방식이죠.
string strCommand = string.Format("exec {0}.dbo.CM_Search_AccountInfo {1},{2},'{3}'",
m_strSearchToServName, comboBox1.SelectedIndex, strArg0, strArg1);
OdbcCommand dbCommand = new OdbcCommand(strCommand, m_DBConnection);
OdbcDataReader dbReader = dbCommand.ExecuteReader();
m_strSearchToServName, comboBox1.SelectedIndex, strArg0, strArg1);
OdbcCommand dbCommand = new OdbcCommand(strCommand, m_DBConnection);
OdbcDataReader dbReader = dbCommand.ExecuteReader();
일단 이 방식은 코드가 짧고 단순해서 좋습니다. strCommand에 쿼리를 보낼 프로시저와 인자들을 문자열로 조합하고, OcbcCommand에 넘겨줍니다. 그 다음 ExcuteReader 함수로 쿼리를 보내면 그 결과 행렬이 OdbcDataReader로 반환 됩니다. 위의 코드 경우의 프로시저를 실행하면 계정 정보 결과가 OdbcDataReader로 넘어오게 되죠.
이 후, dbReader.Read() 호출 하게 되면 결과 값을 읽을수가 있는데, 이 때, 값이 있으면 true, 없으면 false가 반환 됩니다.
true가 반환 된 뒤에는 dbReader[ idx ] 식으로 값에 접근을 할수가 있습니다. 원하는 값을 읽어드리면 되죠.
다음 방식은 정석으로 프로시저를 호출 하는 방법입니다.
OdbcCommand dbCommand = new OdbcCommand();
dbCommand.Connection = m_DBConnection;
dbCommand.CommandType = System.Data.CommandType.StoredProcedure;
dbCommand.CommandText = "{ ? = CALL PROCEDURE(?,?) }";
dbCommand.Parameters.Add("", OdbcType.Int).Direction = System.Data.ParameterDirection.ReturnValue;
dbCommand.Parameters.Add("", OdbcType.Int);
dbCommand.Parameters.Add("", OdbcType.Int).Direction = System.Data.ParameterDirection.Output;
dbCommand.Parameters[1].Value = 10;
dbCommand.ExecuteNonQuery();
dbCommand.Connection = m_DBConnection;
dbCommand.CommandType = System.Data.CommandType.StoredProcedure;
dbCommand.CommandText = "{ ? = CALL PROCEDURE(?,?) }";
dbCommand.Parameters.Add("", OdbcType.Int).Direction = System.Data.ParameterDirection.ReturnValue;
dbCommand.Parameters.Add("", OdbcType.Int);
dbCommand.Parameters.Add("", OdbcType.Int).Direction = System.Data.ParameterDirection.Output;
dbCommand.Parameters[1].Value = 10;
dbCommand.ExecuteNonQuery();
위의 방식과는 많이 다릅니다. 일단 연결 객체를 설정 해주고, 커맨드 타입을 저장 프로시저임을 선언해줍니다. 그 다음, 명령어 문자열을 지정해줍니다. 중간 중간의 ? 는 파라미터 위치를 나타내 줍니다. 앞의 ? 는 리턴 값이고, 프로지서 뒤에 2개의 인자를 받고 있습니다.
이제 지정한 파라미터를 정의 해주어야 합니다. 순서대로 Add 함수를 통해 파라미터를 정의해줍니다. 첫번째 파라미터는 리턴 값이므로 Direction 에 ReturnValue로 정의 해줍니다. 그리고 마지막 파라미터는 Output (다른 인자와 다르게 Return 값 처럼 값을 얻어내는) 으로 설정했습니다.
그리고 정의한 파라미터에 [] 인덱스 접근으로 값을 설정할수 있습니다. 0번과 2번 파라미터는 값을 받는 부분이므로 따로 값을 지정하지 않습니다.
모든 준비를 마쳤으면 ExecuteNonQuery() 함수를 실행해 명령을 수행합니다.
정상정으로 명령이 실행되었으면 Parameters[0]과 Parameters[2]에 값이 들어온것을 확인할수가 있을겁니다.