쓰다보니 msdn 요약판이 되어버리고 있는데, 그만큼 내용이 많음
DataReader냐 DataSet냐 선택하는 기준은 모호하지만, 보통의 경우라면 단순쿼리 결과만을 사용하고 싶을테니 DataReader가 바람직해 보임.
응 그렇군 하는 부분인데 되려 적어 놓으려니 어색하네.
DB에 연결/명령을 실행/결과를 검색하는데 사용되는 개체들.
MySql은 외부 Framework 사용
Connection | 연결 |
Command | 명령어 |
DataReader | 실행과 결과 |
DataAdapter | 데이터와 DataSet과 연결 |
그리고
Transation | |
CommandBuilder | Command 개체의 Parameters 컬렉션을 채우는 도우미 개체 |
ConnectionStringBuilder | Connection 개체에서 사용하는 연결 문자열을 만들고 관리할 수 있는 개체 |
Parameter | 명령과 SP에 대한 입/출/반환값 매개변수 정의 |
Excpetion | |
Error | |
ClientPermission |
SQL Server | “MSSql Server 7.0 ≤” 시 또는 단일 프로그램의 경우 사용 권장 |
OLE DB | “MSSql Server 6.5 ≥” 시 또는 MSAccess DB 사용시 권장 |
나머지는 이름대로.
설명 : MSDN 연결풀링사용
풀링 집합의 규칙
// using을 사용해서, using 구문 안에서만 커넥션(연결)을 사용하고 close한다. using( SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind") ) { connection.Open(); // Pool A is created. }
연결문자열에 MinPoolSize가 1 이상이면, 프로세스 종료시까지 연결풀이 남아 있게 된다. 반대의 경우, 비활성 기간(아래참고) 후에 연결은 모두 닫힌다.
풀이 닫히더라도 트랜잭션이 진행/보류 중인 연결에 재 연결 되도록 내부 처리 된다고 한다.
ConnectionString을 통해 연결풀링 로직 조정 가능
링크로 연결된 사이트에 사용가능한 옵션이 자세히 나와 있지만 몇가지 정리
OLE DB와 비슷해 보이지만, 약간 다르다네.(한가지인가봐)
그리고
형식
보통 사용하는 것들
Server | 연결할 SQL 인스턴스나 네트워크 주소 server=tcp:servername, port |
Data Source | |
Address | |
Network Address | |
Addr | |
database | 데이터베이스 이름 |
Initial Catalog | |
Connect Timeout | 이름 그대로, 초단위 |
User ID | 이름 그대로 |
Password or Pwd | 이름 그대로 |
Persist Security Info | false : 암호와 같은 정보는 다시 리턴되지 않음 (default) |
그외
Trusted_Connection | true : 윈도우즈 계정 로그인 false : 아이디 암호로 로그인 |
Network Library | 연결 프로토콜 default –> dbmssocn(TCP/IP), dbnmpntw(명명된 파이프), dbmsrpcn(멀티프로토콜), dbmsadsn(Apple Talk), dbmsgnet(VIA), dbmslpcn(공유 메모리), dbmsspxn(IPX/SPX) |
Net | |
Integrated Security | |
Asynch | 비동기 지원 (true or false) |
AttachDBFilename | 사용할 DB 파일명 |
Initial File Name | |
Encrypt | 서버에 인증서가 설치되어 있고, https 통신을 할 경우 |
Type System Version | 서버에 맞는 문자열 값 사용 Type System Version=SQL Server 2000; Type System Version=SQL Server 2005; Type System Version=Latest; |
연결 풀링에 대한 것
키워드 | 기본값 | 설명 |
---|---|---|
Pooling | true | 풀링 사용 여부 |
Connection Lifetime | 0 == 최대연결시간제한 | 반환시 ((현재시간-만든시간)초 < Connection Lifetime초) 이면 삭제 |
Connection Reset | true | 풀에서 제거될때 연결이 다시 설정되는가? 아니면 리셋되는가 |
Enlist | true | true면 현재 트랜잭션 컨텍스트에 자동 연결,참여 |
Load Balance Timeout | 0 | 연결풀에서 연결이 소멸되기까지 시간(초) |
Max Pool Size | 100 | 이름 그대로 |
Min Pool Size | 0 | 이름 그대로 |
(상황)
(정리)
(팁)
이렇게 하면 연결 수를 줄일 수 있다. 근데 보안은?
// Assumes that connection is a valid SqlConnection object. SqlCommand salesCommand = new SqlCommand("SalesByCategory",connection); salesCommand.CommandType = CommandType.StoredProcedure; // 파라미터 타입 설정 후, 값 대입 // 널이 경우 DBNull.Value를 대입 SqlParameter parameter = salesCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15); parameter.Value = "Beverages"; connection.Open(); SqlDataReader reader = salesCommand.ExecuteReader(); Console.WriteLine("{0}, {1}", reader.GetName(0), reader.GetName(1)); while (reader.Read()) { Console.WriteLine("{0}, ${1}", reader.GetString(0), reader.GetDecimal(1)); } reader.Close(); connection.Close();
Output 과 ReturnValue 를 받고 사용하는 방법 참고
// Assumes that connection is a valid SqlConnection object. SqlCommand command = new SqlCommand("SampleProc", connection); command.CommandType = CommandType.StoredProcedure; SqlParameter parameter = command.Parameters.Add("RETURN_VALUE", SqlDbType.Int); parameter.Direction = ParameterDirection.ReturnValue; parameter = command.Parameters.Add("@InputParm", SqlDbType.NVarChar, 12); parameter.Value = "Sample Value"; parameter = command.Parameters.Add("@OutputParm", SqlDbType.NVarChar, 28); parameter.Direction = ParameterDirection.Output; connection.Open(); SqlDataReader reader = command.ExecuteReader(); Console.WriteLine("{0}, {1}", reader.GetName(0), reader.GetName(1)); while (reader.Read()) { Console.WriteLine("{0}, {1}", reader.GetInt32(0), reader.GetString(1)); } reader.Close(); connection.Close(); Console.WriteLine(" @OutputParm: {0}", command.Parameters["@OutputParm"].Value); Console.WriteLine("RETURN_VALUE: {0}", command.Parameters["RETURN_VALUE"].Value);
나머지 타입의 예제는 MSDN 참조
sqlCommand (Data Provider for SQL Server)
OleDbCommand / OdbcCommand (Data Provider for OLE DB / ODBC)
SELECT * FROM Customers WHERE CustomerID = ?
사용할 네임스페이스
using System.Data; using System.Data.OleDb;
연결하고 SQL을 실행해 볼 수 있는 빠른 example
string _connstr = @"Provider=SQLOLEDB.1;" + "Data Source=ip,port;" + "Initial Catalog=DB-Name;" + "User Id=ID-string;" + "Password=Password-IfItis;"; OleDbConnection _dbConn = new OleDbConnection( _connstr ); OleDbCommand _cmd = _dbConn.CreateCommand(); _dbConn.Open(); // 실제 연결 시도. try catch 블럭으로 실패 하는 경우 잡아낼 것 _cmd.CommandText = @"select * from SomeTable"; OleDbDataReader reader = _cmd.ExecuteReader(); while( reader.Read() ) // 결과가 있다면 말이지.. { Console.WriteLine( "\t{0}\t{1}", reader[0], reader[1] ); } // 클린 부분은 나중에