2011-11-29 21 views
1

我試圖做一個「助手」類,您只需傳遞驅動程序和參數,並且類爲您執行連接和連接字符串程序集。用於通用訪問的IDataReader

我一直在使用System.Data的接口,如IDataReader,IDbConnection。

現在使用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; 

一個我通過我的司機爲System.Data.SqlClient的 SQL Server和MySql.Data此刻

連接方法。 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服務器?任何幫助?

+1

不相關,但是你的錯誤處理沒有什麼特別的用處,並且有很多傷害 - 特別是在錯誤情況下沒有處理連接,並且你正在破壞堆棧跟蹤。一個單一的'catch {if(conn!= null){conn.Dispose();拋出; }'會更加可取,IMO –

+0

顯示閱讀器代碼,你有沒有進入'while(reader.Read())'塊?如果沒有,我懷疑你的SQL是責任;這應該工作... –

+0

感謝您的提示將相應地改變它。 –

回答

1

你在這裏沒有提供很多線索,因爲這裏的大部分有趣的代碼是可能是圍繞命令設置。如果在執行時,它永遠不會進入while (reader.Read()) {...}塊,那麼它是可能是 TSQL或參數相關的(特別是空值,這很容易導致沒有行)。

由於您的數據是以DataTable爲中心且您已經擁有提供商工廠,因此此處的另一種可能性是從工廠使用CreateDataAdapter(),並讓工廠擔心TSQL與DataTable的綁定。否則,請重新檢查您所提供的TSQL是否有效,合理且正確參數化。

最終,Read()循環本身很好,並且非常適用於所有實例化例程。例如,它非常接近精巧的工作方式,並且在一系列數據庫上運行良好。