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);