尝试加载DataSet,但它始终为null。常规的sqlReader.GetValue()不是

时间:2010-07-15 14:32:10

标签: c# .net-3.5 dataset

我不太多使用DataSet。通常发现自己使用ORM或只是一个基本的sqlReader.Read(),然后是一些GetValues()。我正在研究一些在整个地方都有DataSet的遗留代码,而修复一个bug却试图干掉其中一些。

但是,我似乎无法将数据加载到非类型化的DataSet中。

public static DataSet ExecuteStoredProcedure(string storedProcedure, DBEnum db, IEnumerable<SqlParameter> parameters)
{
    DataSet result = new DataSet();
    using (SqlConnection connection = SqlHelper.GetSqlConnection(db))
    {
        SqlCommand command = connection.CreateCommand();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = storedProcedure;

        if (parameters != null)
            foreach (SqlParameter parameter in parameters)
                command.Parameters.Add(parameter);

        connection.Open();
        DataTable table = new DataTable();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            table.Load(reader);
        }
        result = table.DataSet; // table.DataSet is always empty!
   }
   return result;
}

我假设table.Load(读者)完成了所有必要的reader.Read()调用...但我继续尝试使用和不使用reader.Read()在table.Load()之前果。

我知道被调用的存储过程实际上是返回数据。如果我做这样的事情,我看到数据就好了:

using(SqlDataReader reader = command.ExecuteReader())
{
    reader.Read();
    object test = reader.GetValue(0); // returns the expected value
}

似乎我在这里错过了一些简单的东西,但我现在已经在这一段时间里摸不着头脑了。

这是在.NET 3.5中。

5 个答案:

答案 0 :(得分:2)

如果可以,我建议您使用SqlDataAdapter填充DataTable

using(SqlDataAdapter sqlDA = new SqlDataAdapter(command))
{
    sqlDA.Fill(table);
}

答案 1 :(得分:0)

您的逻辑显示DataTable正在从读取器加载数据,但DataTable从未添加到数据集中。

答案 2 :(得分:0)

我认为应首先创建数据集。实际上,您可以使用DataSet.Load而不是DataTable.Load。 DataSet.Load应该创建数据表,但它不会反过来。

答案 3 :(得分:0)

DataSet包含DataTables,而不是相反。因此,如果要创建要返回的DataSet,则可能需要创建新数据集,然后在返回之前将DataTable添加到其中。如果DataTable不在DataSet中,则对其父数据集的引用将始终为null。

据说我也建议Jason Evans建议使用teh SqlDataAdapter。

答案 4 :(得分:0)

将数据集视为表的集合,以及可选的有关它们之间关系的信息。

在您的示例代码中,您将创建一个不属于DataSet的独立Table。要以实用方式创建属于数据集的表,您可以执行以下操作:

DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add();
//or
ds.Tables.Add(MyAlreadyCreatedTable);
上面的Jason Evans也是正确的,正如他演示的那样,使用SqlDataAdaptors填充DataTables和DataSet更加简单。

最后,编写的方法意味着返回一个DataSet。但它只从它调用的存储过程中捕获单个结果集。程序可能会返回任意数量的单独结果。

您需要做的就是更改以下内容:

    DataTable table = new DataTable();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        table.Load(reader);
    }

//you can skip creating a new DataTable object
using (SqlDataAdapter da = new SqlDataAdapter(command))
{
    da.Fill(result); // the result set you created at the top
}