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

时间:2010-11-04 17:55:20

标签: 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);
myReader = myCommand.ExecuteReader();

我需要控件的数据源来从myReader获取数据集。

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

6 个答案:

答案 0 :(得分:42)

你没有。改为使用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);
}

答案 1 :(得分:21)

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

DataTable myTable = new DataTable();

myTable.Load(myCommand.ExecuteReader());

然后将DataTable返回给客户端。

答案 2 :(得分:4)

您可以更改代码,使其返回数据集,而不是返回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会为您打开和关闭数据库连接。

答案 3 :(得分:4)

IDataReader reader;
DataSet ds;

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

答案 4 :(得分:1)

如果您的SelectCommand是存储过程,则适配器的Fill方法将引发异常。 在这些情况下,您可以使用:

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

答案 5 :(得分:0)

以下代码段在SqlServer上对我来说效果很好:

public DataSet executeProcedure(String procudureName, params SqlParameter[] sqlParameters)
{
    return executeSqlCommand(procudureName, CommandType.StoredProcedure, sqlParameters);
}
public DataSet executeSql(String commandText, params SqlParameter[] sqlParameters)
{
    return executeSqlCommand(commandText, CommandType.Text, sqlParameters);
}
public DataSet executeSqlCommand(String commandText, CommandType Commandtype, params SqlParameter[] sqlParameters)
{
    DataSet myset = new DataSet();
    using (var command = Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = commandText;
        command.CommandType = Commandtype;
        foreach (var _kv in sqlParameters)
        {
            DbParameter _dbpara = command.CreateParameter();
            _dbpara.ParameterName = _kv.ParameterName;
            _dbpara.Value = _kv.Value;
            command.Parameters.Add(_dbpara);
        }
        Database.OpenConnection();
        DbDataAdapter adapter = DbProviderFactories.GetFactory(Database.GetDbConnection()).CreateDataAdapter();
        adapter.SelectCommand = command;
        adapter.Fill(myset);
    }
    return myset;
}

可以从DbDataAdapter类中检索DbProviderFactories实例。

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