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

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

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

在我所做的全部工作下面,我已经包含了代码片段,尽管对我来说,代码本身并不显著,甚至不是我想问的.更重要的是,我想知道我的方法,如果我的策略是错误的/低效的,我会在稍后寻求代码帮助.

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());
}

推荐答案

您可以使用接受IDataReaderLoad()方法直接从数据读取器加载DataTable.

var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);

.net相关问答推荐

无法在Designer、VS2022、. NET 8中打开WinForms表单'

为什么我在环境变量中有不同的值?

dotnet ef dbcontext scaffold command --data-annotations 或 -d 命令行参数似乎不起作用

无法加载文件或程序集 不支持操作. (来自 HRESULT 的异常:0x80131515)

如何使用 C# 中的代码更改网络设置(IP 地址、DNS、WINS、主机名)

.NET 中是否有一种简单的方法来获得数字的st、nd、rd和th结尾?

具有透明背景且包含不透明控件的 WPF 窗口

从 Web.Config 中的邮箱友好显示名称存储 Smtp

在 C# 中转义命令行参数

C# 属性实际上是方法吗?

操作对事务的状态无效错误和事务范围

寻找 .NET 的命令行参数解析器

如何在 RabbitMQ 中设置重试次数?

DateTime.Compare 如何判断日期是否小于 30 天?

具有不同身份验证标头的 HttpClient 单个实例

如何在 C# 中使用迭代器反向读取文本文件

通过继承扩展枚举

判断任意字符串是否为有效文件名的最简单方法

通过反射获取公共静态字段的值

多行 C# 插值字符串文字