我正在visual studio上构建一个涉及一些SQL的控制台应用程序。基本上,我有一个包含大量列的数据库表,我需要将它们设置为变量,并有办法有效地解决它们。现在我正在考虑一个我可以循环的数组。这是我的代码现在的样子:
SqlCommand getColumns = new SqlCommand("SELECT * FROM tableName",
connection1);
myReader = getColumns.ExecuteReader();
while (myReader.Read())
{
string[] array = new string { myReader["ColumnName"].ToString(),
myReader["ColumnName2"].ToString, etc...};
for (int i = 0; i <= array.length; i++) {
some action...array[i];
}
}
我承认我对c#和这种开发有些新意,所以让我知道是否有更有效的方法来实现这一点,或者我是否需要发布更多代码。谢谢!
答案 0 :(得分:3)
如果您有很多列,则通过索引而不是名称访问它们会更有效:
string[] array = new string[myReader.FieldCount];
for(int i=0; i<myReader.FieldCount; i++)
{
array[i] = myReader[i].ToString();
}
此外,如果您事先知道列数(通常是这种情况),则可以将数组声明移出while(myReader.Read()),从而导致由于重用相同数组而导致内存分配减少。 / p>
另一个建议是您可能不希望将所有内容转换为字符串...声明对象数组并根据需要处理每种数据类型。整数可能应该被绑定到某个实体的整数属性,而不是保存在字符串数组中。
就个人而言,我会声明一些实体并声明其中的列表。然后从数据库中填充列表:
public class MyEntity
{
public string Name { get; set; }
public int Age { get; set; }
//Other properties
}
//...
SqlCommand getColumns = new SqlCommand("SELECT * FROM tableName",
connection1);
var myDataFromTable = new List<MyEntity>();
myReader = getColumns.ExecuteReader();
while (myReader.Read())
{
myDataFromTable.Add(new MyEntity {
Name = myReader[0] as string,
Age = (int)myReader[1]
//...
});
}
//Process your list of entities here
另一种方法可能不是将所有内容保存到内存中(就像现在一样),而是即时处理数据 - 一切都取决于您的要求和数据集的大小。但无论如何,我建议将数据解析到某个实体并使用它。
答案 1 :(得分:3)
您不需要自定义类型。 .NET已经为您提供了DataSet
和DataTable
。您需要DataTable
,因为它只是一个结果集,结果与您在SSMS结果窗口中看到的结果相同。
var dt = new DataTable();
dt.Load(myReader);
答案 2 :(得分:2)
根据我的理解 - 在做这件事的方式。 我们可以创建一个包含类似于表中列的属性的类。在while循环中,您可以创建该类的对象,然后使用受尊重的列设置属性,并将该对象添加到Arraylist(包含类对象的Arraylist)。
参考链接:https://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx
希望它有所帮助。