首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从数据读取器填充数据表

从数据读取器填充数据表
EN

Stack Overflow用户
提问于 2013-09-23 22:30:13
回答 5查看 295.5K关注 0票数 118

我正在用C# (MS VS2008)做一件基本的事情,我有一个关于正确设计而不是具体代码的问题。

我正在创建一个datatable,然后尝试从datareader (基于SQL存储过程)加载datatable。我想知道的是,加载datatable的最有效方法是执行while语句,还是有更好的方法。

对我来说,唯一的缺点是我必须手动输入我想要在while语句中添加的字段,但我也不知道如何自动执行,因为我不希望SP中的所有字段都只选择字段,但在我看来这并不是什么大问题。

我在我所做的事情的总体下面包含了代码片段,尽管对我来说,代码本身并不重要,甚至不是我所问的。更多的是想知道我的方法,如果我的策略是错误的/低效的,我会在稍后纠缠代码帮助。

代码语言:javascript
复制
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());
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-22 21:54:07

可以使用接受DataTableLoad()方法直接从数据读取器加载IDataReader

代码语言:javascript
复制
var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
票数 331
EN

Stack Overflow用户

发布于 2013-09-23 22:42:41

如果您正在尝试加载DataTable,那么请使用SqlDataAdapter

代码语言:javascript
复制
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是存储过程命令。

票数 14
EN

Stack Overflow用户

发布于 2015-04-18 00:45:49

正如Sagi在他们的回答中所说的那样,DataTable.Load是一个很好的解决方案。如果您尝试从单个读取器加载多个表,则不需要调用DataReader.NextResult。DataTable.Load方法还使读取器前进到下一个结果集(如果有)。

代码语言:javascript
复制
// 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);
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18961938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档