2017-06-28 187 views
0

我正在Visual Studio上构建一个涉及一些SQL的控制台应用程序。基本上,我有一个包含大量列的数据库表,我需要将它们设置为变量,并有一种方法可以高效地处理它们。现在我正在考虑一个数组,然后我可以循环。这里有几分我的代码看起来像现在:c#变量声明

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#和这种发展,所以让我知道是否有这样做更有效的方式,或者如果我需要发布更多的代码。谢谢!

+2

有一个名为DataTable的类。它是一个带有行和列的荣耀阵列。容易从DataReader填充一个https://msdn.microsoft.com/en-us/library/7x8ccbsb(v=vs.110).aspx – Steve

+3

我不清楚你在问什么。你只是问你是否应该使用数组从数据库中读取?我想你*可以*,没有什么能阻止你。虽然它可能会在很多方面成为问题。为什么不创建一个代表数据记录的类?包括正确的类型,你需要的任何数据验证,将要执行的任何操作等等。然后,在'while'循环中,你可以从每条记录创建该类的实例,并将它们添加到一个整体数组中(或者'List ' )那个班? – David

+0

您期望有多少行? –

回答

3

如果你有很多栏目,通过索引而不是名称访问它们会更有效:

string[] array = new string[myReader.FieldCount]; 
for(int i=0; i<myReader.FieldCount; i++) 
{ 
    array[i] = myReader[i].ToString(); 
} 

另外,如果你事先知道的列数(通常情况下),您可以将数组声明从while(myReader.Read())中移出,由于重复使用相同的数组而导致内存分配减少。

另一个建议是,你可能不希望将所有东西都转换为字符串...声明对象数组并根据需要处理每种数据类型。整数可能应该被认为是某个实体的整数属性,而不是保存在字符串数组中。

我个人会声明一些实体并声明这些实体的列表。然后从数据库填充列表:

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 

另一种方法可能是不救一切到内存中(因为你现在做的),但在飞行过程中的数据 - 一切都取决于你的需求和数据集的大小。但无论如何,我建议将数据解析到某个实体并使用它。

3

您不需要自定义类型。 .NET已经给你DataSetDataTable。你需要DataTable,因为它只是一个结果集,结果看起来和你在SSMS结果窗口中看到的一样。

var dt = new DataTable(); 
dt.Load(myReader); 
+0

考虑到OP的数据集的大小,他们不想将整个事物放入内存中,所以最好是一次一个地传输数据并在每一行上工作。 – Servy

+0

这是一个设计选择,是否在一组查询中检索数据。 OP没有提到有关这方面的任何信息。问题是关于如何容纳那么多列而不是如何容纳那么多行。 – niksofteng

+0

是的,OP选择*特定的设计选择来传输数据,因为它们有很多,并提出了一个关于如何处理它们流式传输的数据的问题,并且您建议将整个数据代码*戏剧性*更糟糕的是将非常大的数据集全部拉入内存中,以前不是,因为零值增加了。你不会仅仅因为“因为你喜欢它”而在客观上使代码变得更糟。 – Servy