Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# 如何从sqldatareader返回数据集?_C#_.net_Winforms - Fatal编程技术网

C# 如何从sqldatareader返回数据集?

C# 如何从sqldatareader返回数据集?,c#,.net,winforms,C#,.net,Winforms,我在公共课上讲过: SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;"); myConnection.Open(); SqlDataReader myReader = null; SqlCommand myCommand = new SqlCommand(InitializeQuery(), myConnection); m

我在公共课上讲过:

SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;");
myConnection.Open();
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand(InitializeQuery(), myConnection);
myReader = myCommand.ExecuteReader();
我需要控件的数据源从myReader获取数据集


不幸的是,这很难做到,因为控件位于表单(单独的类)上。如何将
myReader
数据集返回到表单上控件的
datasource
属性中?

如果可以使用DataAdapter子类或使用以下内容:

DataTable myTable = new DataTable();

myTable.Load(myCommand.ExecuteReader());

然后将数据表返回给客户端。

您不需要。请改用DataAdapter:

var ds = new DataSet();

using(var conn = new SqlConnection(connString))
{
    conn.Open();
    var command = new SqlCommand(InitializeQuery(), conn);
    var adapter = new SqlDataAdapter(command);

    adapter.Fill(ds);
}

您可以更改代码,使其返回数据集,而不是返回SqlDataReader

SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;");
DataSet dst = new DataSet();
SqlDataAdapter dap = new SqlDataAdapter(InitializeQuery(), mConnection);
dap.Fill(dst, "DataSetName");

这种方法的一个优点是Fill为您打开和关闭数据库连接。

如果您的SelectCommand是存储过程,则适配器的Fill方法将出现异常

在这些情况下,您可以使用:

DataTable dt = new DataTable();
dt = sdr.GetSchemaTable();
dt.Constraints.Clear();
dt.BeginLoadData();
dt.Load(sdr);
//dt.EndLoadData(); // Enables constraints again

下面的代码片段对我来说在
SqlServer
上运行良好:

公共数据集executeProcedure(字符串procudureName,参数SqlParameter[]sqlParameters) { 返回executeSqlCommand(procudureName,CommandType.StoredProcedure,sqlParameters); } 公共数据集executeSql(字符串commandText,参数SqlParameter[]sqlParameters) { 返回executeSqlCommand(commandText、CommandType.Text、sqlParameters); } 公共数据集executeSqlCommand(字符串commandText、CommandType CommandType、params SqlParameter[]sqlParameters) { 数据集myset=新数据集(); 使用(var command=Database.GetDbConnection().CreateCommand()) { command.CommandText=CommandText; command.CommandType=CommandType; foreach(参数中的var_kv) { DbParameter_dbpara=command.CreateParameter(); _dbpara.ParameterName=_kv.ParameterName; _dbpara.值=_kv.值; command.Parameters.Add(_dbpara); } OpenConnection(); DbDataAdapter=DBProviderFactorys.GetFactory(Database.GetDbConnection()).CreateDataAdapter(); adapter.SelectCommand=command; 适配器填充(myset); } 返回myset; } 可以从
dbProviderFactorys
类检索
DbDataAdapter
实例

DbDataAdapter=DbProviderFactories.GetFactory(Database.GetDbConnection()).CreateDataAdapter();

如果您只需要一个数据表而不需要整个数据集,这是一个好主意。如果一个简单的查询返回一组行,通常不需要返回所有数据集:)我想利用命令。ExecuteReaderAsync()用于async/Wait,但仍然返回一个数据表。这似乎是实现这一目标的最佳方式。谢谢。@我是个女孩-这会有用的。另一方面,这就是DataAdapter的用途(获取数据的内存表示并将其放入容器中)。我相信DataAdapter将完成连接的打开和关闭。是否也需要将其包装在using语句中?@DOK-Yes。即使适配器包装了打开/关闭调用,当您处理完实例时(例如,在出现异常的情况下),仍然没有什么可以处理的。@JustinNiessner Sanjib Bose的回答有什么问题?看起来我们可以通过这种方式从DataReader加载数据集。我不想使用DataAdapter的原因是-它没有异步实现。不必是数据集-如果合适的话,您可以填充一个更轻量级的DataTable。@DOK数据集名称应该是什么。?@我是女孩-您只需将DataTable传递给.fill方法,而不是DataSet。请参阅:只有当您有多个数据表时,它才需要是一个数据集,特别是当您在这些表之间有关系(例如主键外键)时。这在桌面应用程序中可能更为常见,因为数据会在客户端保留一段时间。如果只有一个DataTable,则不需要数据集。数据集名称可以是任何名称,也可以是零。如果你有不止一个,给它起个名字会很有帮助。同样的事情也适用于数据表。因此,这些名称是可选的。如果只返回一个结果集,请使用DataTable。如果您有多个数据集,请使用数据集。根据展示DataAdapter代码的评论员的说法。如果您想读取数据集,Fill方法有自己的try finally,它会关闭连接,这样您就不必这样做。另见。只要你没有在代码中打开连接,如果出现异常,Fill就会关闭连接。我不明白为什么这个答案会被否定。它确实回答了“从myReader获取数据集”的问题。就这么简单。对于没有数据适配器的Microsoft.Data.Sqlite来说,这是一个很好的答案。
IDataReader reader;
DataSet ds;

while (!reader.IsClosed)
   ds.Tables.Add().Load(reader);