我不太多使用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中。
答案 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
}