2011-11-29 4 views
1

나는 드라이버와 매개 변수를 전달하기 만하면되는 "도우미"클래스를 만들고 클래스는 연결 및 연결 문자열 어셈블리를 수행합니다.일반 액세스 용 IDataReader

IDataReader, IDbConnection과 같은 System.Data의 인터페이스를 사용하고 있습니다.

이제 MySQL을 사용하여 테스트 한 후 코드가 완벽하게 작동하지만 SQL Server (Microsoft) 용으로 코드를 지정하고 구성하면 처리 된 행이 반환되지 않습니다. 일부 디버깅을 수행 한 및 SQL 서버 정보를 IDataReader에 나타나지만 그것을 통해 반복 할 수없는 것?

내 현재 코드 : 도우미 클래스

try 
{ 
    factory = System.Data.Common.DbProviderFactories.GetFactory(driver); 
    _con = factory.CreateConnection(); 
    _con.ConnectionString = buildConnectionString.ToString(); 
    _con.Open(); 
} 
catch (System.Data.Common.DbException ex) 
{ 
    _con = null; 
    throw ex; 
} 
catch (Exception ex) 
{ 
    _con = null; 
    throw ex; 
} 
return _con; 

A I는 SQL Server 및 MySql.Data에 대한의 System.Data.SQLClient로 내 드라이버를 통과하고있어 순간에

연결 방법. MySQL 용 MySqlClient.

System.Data.IDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
while (reader.Read()) 
{ 
    System.Data.DataRow row = table.NewRow(); 
    // Insert info from Reader into the Row 
    table.Rows.Add(row); 
} 

reader.Close(); 

나는 그것이 IDataReader에이 유형을 처리하려고하는 방법을 함께 할 수있는 뭔가가 있지만 MySQL을위한 있지만 SQL Server에 대해 완벽하게 작동하고 같은이에있는 모든 문서를 찾을 수없는 의심? 어떤 도움?

+1

과 관련이 없지만 오류 처리는 아무 것도하지 않는 것이 특히 유용합니다. 특히 오류 사례에 연결을 처리하지 않아서 스택 추적을 파괴하고 있습니다. 하나의'catch {if (conn! = null) {conn.Dispose(); } 던졌습니다; }'이 표시 코드와 함께 IMO –

+0

이 더 좋을 것입니다. 'while (reader.Read()) 블록 안에 들어갔습니까? 그렇지 않다면, 나는 당신의 SQL이 탓이라고 의심한다; 그게 작동해야합니다 ... –

+0

팁 주셔서 감사합니다 그에 따라 변경됩니다. –

답변

1

재미있는 코드의 대부분은 여기에서 명령 설정과 관련되어 있기 때문에 많은 실마리를 제공하지 않습니다. 실행시에 while (reader.Read()) {...} 블록을 입력하지 않으면 일 것입니다. TSQL 또는 매개 변수와 관련이 있습니다 (특히 널 (null)로 인해 행이 생기지 않음). 데이터가 -centric DataTable이며, 이미 공급자 공장을 가지고 있기 때문에

, 여기에 또 다른 가능성은 공장에서 CreateDataAdapter()를 사용하고 A DataTable에 TSQL의 결합에 대한 공장 걱정을하게하는 것입니다. 그렇지 않으면, 당신이 제공하는 TSQL이 타당하고, 현명하며, 올바르게 매개 변수화되었는지를 고음 검사하십시오.

궁극적으로 Read() 루프 자체는 훌륭합니다. 모든 materialization 루틴이 수행하는 작업과 거의 같습니다. 예를 들어, dapper가 작동하는 방식에 매우 가깝고 다양한 데이터베이스에서 작동합니다.

관련 문제