c#变量声明

时间:2017-06-28 13:37:20

标签: c# sql visual-studio-2017

我正在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#和这种开发有些新意,所以让我知道是否有更有效的方法来实现这一点,或者我是否需要发布更多代码。谢谢!

3 个答案:

答案 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已经为您提供了DataSetDataTable。您需要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

希望它有所帮助。