我在C#(MS VS2008)中做一个基本的事情,除了适当的代码之外,还有更多关于适当设计的问题。
我正在创建一个数据表,然后尝试从一个数据读取器(基于SQL存储过程)加载该数据表。我想知道的是,加载数据表的最有效方法是执行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()); }
您可以DataTable使用Load()接受的方法直接从数据读取器加载IDataReader。
DataTable
Load()
IDataReader
var dataReader = cmd.ExecuteReader(); var dataTable = new DataTable(); dataTable.Load(dataReader);