我试图创建一个通用的SqlDataReader,它将一个包含33列的表转换为一个列表。我希望每个列表项包含每行的所有33列值。
但是,我的代码是将每个值分配给单个列表项。
因此,我有33,000个列表项,而不是1000个列表项= 1000行数据。
我更喜欢在数据表上使用列表,因为我需要做的列表比较要简单得多。
如何拥有1000个列表项,每个项目包含33个值?
public static List<string> loadSQL(String query, String connectString)
{
List<string> dataList = new List<string>();
using (SqlConnection connection = new SqlConnection(connectString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i ++)
{
dataList.Add(Convert.ToString(reader.GetValue(i)));
}
}
}
}
return dataList;
}
}
...更新......
更正为以下内容。它正确返回列表项。但是,我的列表包含33,000个项目,每个项目包含33个项目。如何控制循环使其在1000行后停止?
using (SqlConnection connection = new SqlConnection(connectString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
List<string> tempRow = new List<string>();
for (int i = 0; i < reader.FieldCount; i ++)
{
tempRow.Add(Convert.ToString(reader.GetValue(i)));
}
dataList.Add(tempRow);
}
}
}
}
答案 0 :(得分:4)
执行此任务的最佳选择是DataTable,但您不想使用它。所以net选项将是,基于查询输出创建一个类然后使用List<objectOftheClass>
。但是在你的情况下,输入查询将一直被更改,因此公共类将没有意义,因为你试图使它通用。因此,您可以关注的选项是List<List<string>>
或List<List<object>>
。按此,方法签名将如下所示:
public static List<object[]> loadSQL(string query, string connectString)
{
List<object[]> dataList = new List<object[]>();
using (SqlConnection connection = new SqlConnection(connectString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
object[] tempRow = new object[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
{
tempRow[i] = reader[i];
}
dataList.Add(tempRow);
}
}
}
}
return dataList;
}
为什么List<object>
?为什么不`列表?:
读者会在表格中将列数据作为相同类型的列提供给您。如果它是对象,那么你不需要每次都转换它。
注意: - 将String
更改为string
以获取方法签名中的参数。您可以找到原因here
答案 1 :(得分:0)
您可以使用列表中的数组来实现您要执行的操作。以下是使用代码的简单示例:
public static List<string[]> loadSQL(String query, String connectString)
{
List<string[]> dataList = new List<string[]>();
using (SqlConnection connection = new SqlConnection(connectString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
int rowcounter = 0;
while (reader.Read())
{
string[] value = new string[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i ++)
{
value[i] = Convert.ToString(reader.GetValue(i));
}
dataList.Add(value);
rowcounter++;
}
}
}
return dataList;
}
警告,如果你想使用List,你需要使用逗号分隔符或类似的东西将值嵌入一个字符串。
答案 2 :(得分:0)
您可以像这样使用List<List<string>>
:
public static List<List<string>> loadSQL(String query, String connectString)
{
List<List<string>> dataList = new List<List<string>>();
using (SqlConnection connection = new SqlConnection(connectString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
var l = new List<string>();
for (int i = 0; i < reader.FieldCount; i ++)
{
l.Add(Convert.ToString(reader.GetValue(i)));
}
dataList.Add(l);
}
}
}
return dataList;
}
}