Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用访问的IDataReader_C#_Mysql_Sql Server_Database_Ado.net - Fatal编程技术网

C# 通用访问的IDataReader

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

我试图创建一个“Helper”类,在这个类中,您只需传递驱动程序和参数,该类就可以为您完成连接和连接字符串组装

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

现在,在使用MySQL对其进行测试后,代码运行良好,但只要我指向并为SQL Server(Microsoft)配置它,它就不会返回任何已处理的行。我已经做了一些调试,来自SQL server的信息出现在IDataReader中,但似乎我无法迭代它

我当前的代码:

Helper类中的Connect方法

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的行为正常;如果您已经通过调试器观察到数据,那么您已经使用了它,并且它已经消失了。避免那样做。