C# 通用访问的IDataReader
我试图创建一个“Helper”类,在这个类中,您只需传递驱动程序和参数,该类就可以为您完成连接和连接字符串组装 我一直在使用System.Data中的接口,比如IDataReader、IDbConnection 现在,在使用MySQL对其进行测试后,代码运行良好,但只要我指向并为SQL Server(Microsoft)配置它,它就不会返回任何已处理的行。我已经做了一些调试,来自SQL server的信息出现在IDataReader中,但似乎我无法迭代它 我当前的代码: Helper类中的Connect方法C# 通用访问的IDataReader,c#,mysql,sql-server,database,ado.net,C#,Mysql,Sql Server,Database,Ado.net,我试图创建一个“Helper”类,在这个类中,您只需传递驱动程序和参数,该类就可以为您完成连接和连接字符串组装 我一直在使用System.Data中的接口,比如IDataReader、IDbConnection 现在,在使用MySQL对其进行测试后,代码运行良好,但只要我指向并为SQL Server(Microsoft)配置它,它就不会返回任何已处理的行。我已经做了一些调试,来自SQL server的信息出现在IDataReader中,但似乎我无法迭代它 我当前的代码: Helper类中的Con
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现在我将驱动程序作为SQL Server的System.Data.SqlClient和MySql的MySql.Data.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上却没有?有什么帮助吗?这里没有提供太多线索,因为这里大部分有趣的代码可能都是关于命令设置的。如果在执行时,它从未进入
while(reader.Read()){…}
块,那么它可能与TSQL或参数相关(特别是空值,这很容易导致没有行)
由于您的数据是以DataTable
为中心的,并且您已经有了提供者工厂,因此这里的另一种可能性是使用工厂中的CreateDataAdapter()
,让工厂担心TSQL绑定到DataTable
。否则,请检查您提供的TSQL是否有效、合理且参数化正确
归根结底,
Read()
循环本身很好,几乎就是所有具体化例程所做的。例如,它非常接近dapper的工作原理,并且在一系列数据库中都可以正常工作。这里没有给出很多线索,因为这里大部分有趣的代码可能都是关于命令设置的。如果在执行时,它从未进入while(reader.Read()){…}
块,那么它可能与TSQL或参数相关(特别是空值,这很容易导致没有行)
由于您的数据是以DataTable
为中心的,并且您已经有了提供者工厂,因此这里的另一种可能性是使用工厂中的CreateDataAdapter()
,让工厂担心TSQL绑定到DataTable
。否则,请检查您提供的TSQL是否有效、合理且参数化正确
归根结底,
Read()
循环本身很好,几乎就是所有具体化例程所做的。例如,它非常接近dapper的工作方式,并且在一系列数据库中都可以正常工作。不相关,但您的错误处理没有做任何特别有用的事情,并且造成了很多伤害-特别是,在错误情况下,您没有处理连接,并且正在销毁stacktrace。单个catch{if(conn!=null){conn.Dispose();}throw;}
更可取,在显示读卡器代码的情况下,在(reader.Read())块时,您是否进入?如果不是,我怀疑你的SQL是罪魁祸首;这应该行…谢谢提示,我会相应地更改它。我已经在SQL Server Manager中运行了代码,它按预期返回了行。然后我进行了调试,发现我可以在DataReader中看到行的值(当我检查它时),但它完全跳过了块。如前所述,MySQL的行为正常;如果您已经通过调试器观察到数据,那么您已经使用了它,并且它已经消失了。避免这样做。不相关,但是您的错误处理没有做任何特别有用的事情,而且会造成很多伤害—特别是,您没有在错误情况下处理连接,并且正在销毁stacktrace。单个catch{if(conn!=null){conn.Dispose();}throw;}
更可取,在显示读卡器代码的情况下,在(reader.Read())
块时,您是否进入?如果不是,我怀疑你的SQL是罪魁祸首;这应该行…谢谢提示,我会相应地更改它。我已经在SQL Server Manager中运行了代码,它按预期返回了行。然后我进行了调试,发现我可以在DataReader中看到行的值(当我检查它时),但它完全跳过了块。如前所述,MySQL的行为正常;如果您已经通过调试器观察到数据,那么您已经使用了它,并且它已经消失了。避免那样做。