我正在用C# (MS VS2008)做一件基本的事情,我有一个关于正确设计而不是具体代码的问题。
我正在创建一个datatable,然后尝试从datareader (基于SQL存储过程)加载datatable。我想知道的是,加载datatable的最有效方法是执行while语句,还是有更好的方法。
对我来说,唯一的缺点是我必须手动输入我想要在while语句中添加的字段,但我也不知道如何自动执行,因为我不希望SP中的所有字段都只选择字段,但在我看来这并不是什么大问题。
我在我所做的事情的总体下面包含了代码片段,尽管对我来说,代码本身并不重要,甚至不是我所问的。更多的是想知道我的方法,如果我的策略是错误的/低效的,我会在稍后纠缠代码帮助。
var dtWriteoffUpload = new DataTable();
dtWriteoffUpload.Columns.Add("Unit");
dtWriteoffUpload.Columns.Add("Year");
dtWriteoffUpload.Columns.Add("Period");
dtWriteoffUpload.Columns.Add("Acct");
dtWriteoffUpload.Columns.Add("Descr");
dtWriteoffUpload.Columns.Add("DEFERRAL_TYPE");
dtWriteoffUpload.Columns.Add("NDC_Indicator");
dtWriteoffUpload.Columns.Add("Mgmt Cd");
dtWriteoffUpload.Columns.Add("Prod");
dtWriteoffUpload.Columns.Add("Node");
dtWriteoffUpload.Columns.Add("Curve_Family");
dtWriteoffUpload.Columns.Add("Sum Amount");
dtWriteoffUpload.Columns.Add("Base Curr");
dtWriteoffUpload.Columns.Add("Ledger");
cmd = util.SqlConn.CreateCommand();
cmd.CommandTimeout = 1000;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_writeoff_data_details";
cmd.Parameters.Add("@whoAmI", SqlDbType.VarChar).Value =
WindowsIdentity.GetCurrent().Name;
cmd.Parameters.Add("@parmEndDateKey", SqlDbType.VarChar).Value = myMostRecentActualDate;
cmd.Parameters.Add("@countrykeys", SqlDbType.VarChar).Value = myCountryKey;
cmd.Parameters.Add("@nodekeys", SqlDbType.VarChar).Value = "1,2";
break;
dr = cmd.ExecuteReader();
while (dr.Read())
{
dtWriteoffUpload.Rows.Add(dr["country name"].ToString(), dr["country key"].ToString());
}
发布于 2014-04-22 21:54:07
可以使用接受DataTable
的Load()
方法直接从数据读取器加载IDataReader
。
var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
发布于 2013-09-23 22:42:41
如果您正在尝试加载DataTable
,那么请使用SqlDataAdapter
:
DataTable dt = new DataTable();
using (SqlConnection c = new SqlConnection(cString))
using (SqlDataAdapter sda = new SqlDataAdapter(sql, c))
{
sda.SelectCommand.CommandType = CommandType.StoredProcedure;
sda.SelectCommand.Parameters.AddWithValue("@parm1", val1);
...
sda.Fill(dt);
}
您甚至不需要定义列。只需创建DataTable
并对其执行Fill
操作。
这里,cString
是连接字符串,sql
是存储过程命令。
发布于 2015-04-18 00:45:49
正如Sagi在他们的回答中所说的那样,DataTable.Load是一个很好的解决方案。如果您尝试从单个读取器加载多个表,则不需要调用DataReader.NextResult。DataTable.Load方法还使读取器前进到下一个结果集(如果有)。
// Read every result set in the data reader.
while (!reader.IsClosed)
{
DataTable dt = new DataTable();
// DataTable.Load automatically advances the reader to the next result set
dt.Load(reader);
items.Add(dt);
}
https://stackoverflow.com/questions/18961938
复制相似问题