我有一个问题,我执行一个dinamic t-sql查询,返回一个如下的数据透视表:
code description Price col1 col2 col3 col4 col5 ............. column n
acx cable1 123 2 0 0 0 1
bbb vitro 35 0 1 0 58 0
我想创建一个这样的类:
public class excelInventory
{
public string code { get; set; }
public string description { get; set; }
public decimal col1 { get; set; }
public decimal col2 { get; set; }
public decimal col3 { get; set; }
public decimal col4 { get; set; }
public decimal col5 { get; set; }
}
然后我在excelInventory列表中使用dataReader和inser读取查询结果:
SqlDataReader oDataReader = oCommand.ExecuteReader();
List<excelInventory> excelin = new List<excelInventory>();
while (oDataReader.Read())
{
excelInventory inv = new excelInventory();
inv.code = oDataReader.GetValue(0).ToString();
inv.description = oDataReader.GetValue(1).ToString();
if (string.IsNullOrEmpty(oDataReader.GetValue(2).ToString())) { inv.stock = 0; }
else { inv.stock = decimal.Parse(oDataReader.GetValue(2).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(3).ToString())) { inv.precio = 0; }
else { inv.precio = decimal.Parse(oDataReader.GetValue(3).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(4).ToString())) { inv.col1 = 0; }
else { inv.col1 = decimal.Parse(oDataReader.GetValue(4).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(5).ToString())) { inv.col2 = 0; }
else { inv.col2 = decimal.Parse(oDataReader.GetValue(5).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(6).ToString())) { inv.col3 = 0; }
else { inv.col3 = decimal.Parse(oDataReader.GetValue(6).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(7).ToString())) { inv.col4 = 0; }
else { inv.col4 = decimal.Parse(oDataReader.GetValue(7).ToString()); }
if (string.IsNullOrEmpty(oDataReader.GetValue(8).ToString())) { inv.col5 = 0; }
else { inv.col5 = decimal.Parse(oDataReader.GetValue(8).ToString());
excelin.Add(inv);//Add the object to a list
}
但问题是返回的列数并不总是相同所以我需要修改程序代码来改变类的属性数,也许下次我启动sql查询返回10列,所以这个无效。
我不知道我是否可以在执行时添加属性到excelInventory,所以我想使用二维数组,我可以在datareader之后声明数组并使用dataReader.FieldCount来知道列数。
但是我如何声明数组以及如何在根据行数读取数据读取器时重新定义数组?
答案 0 :(得分:1)
是的,您可以使用数组并查找数组的大小,您可以使用datatable
中有多少行,以及存在多少列。但是,我更喜欢使用List<decimal>
,因此我不必担心datatable
返回的列数。使用此解决方案的代码看起来像
public class excelInventory
{
public excelInventory(){
cols = new List<decimal>();
}
public string code { get; set; }
public string description { get; set; }
public List<decimal> cols{get;set;}
}
首先,您需要初始化列表。您可以在构造函数中执行此操作,就像我在修改后的代码中所做的那样。然后,当您将值分配给cols
时,您需要遵循以下语法
cols.Add(dr.getValue(2)); //you can access this element later by cols[0]
cols.Add(dr.getValue(3)); //you can access this element later by cols[1]