使用 SqlDataReader 将数据行返回到列表 <string>
Returning Data Rows to List<string> with SqlDataReader
我正在尝试创建一个通用的 SqlDataReader,它将具有 33 列的 table 转换为列表。我希望每个列表项都包含每一行的所有 33 列值。
但是,我的代码将每个值分配给一个单独的列表项。
所以我有 33,000 个列表项,而不是 1000 个列表项 = 1000 行数据。
我更愿意使用列表而不是数据table,因为我需要做的列表比较要简单得多。
我怎样才能拥有 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;
}
}
...更新...
更正为以下内容。 returns 列表项正确。但是,我的列表包含 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);
}
}
}
}
您可以在列表中使用数组来实现您想要做的事情。这是一个使用您的代码的简单示例:
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;
}
请注意,如果您想使用列表,您需要使用逗号分隔符或类似的东西将值嵌入单个字符串。
您执行此任务的最佳选择是 DataTable,但您不想使用它。因此,网络选项将是,根据查询输出创建 class,然后使用 List<objectOftheClass>
。但是在您的情况下,输入查询将一直更改,因此常见的 class 将没有意义,因为您正试图使其通用。因此,您可以遵循的选项是 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>
?为什么不 `List?:
reader 将为您提供与 table 中相同类型的列数据。如果是object就不用每次都转换了。
** 注意:-** 将方法签名中的参数的 String
更改为 string
。你可以找个理由here
您可以像这样使用 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;
}
}
我正在尝试创建一个通用的 SqlDataReader,它将具有 33 列的 table 转换为列表。我希望每个列表项都包含每一行的所有 33 列值。
但是,我的代码将每个值分配给一个单独的列表项。
所以我有 33,000 个列表项,而不是 1000 个列表项 = 1000 行数据。
我更愿意使用列表而不是数据table,因为我需要做的列表比较要简单得多。
我怎样才能拥有 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;
}
}
...更新...
更正为以下内容。 returns 列表项正确。但是,我的列表包含 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);
}
}
}
}
您可以在列表中使用数组来实现您想要做的事情。这是一个使用您的代码的简单示例:
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;
}
请注意,如果您想使用列表,您需要使用逗号分隔符或类似的东西将值嵌入单个字符串。
您执行此任务的最佳选择是 DataTable,但您不想使用它。因此,网络选项将是,根据查询输出创建 class,然后使用 List<objectOftheClass>
。但是在您的情况下,输入查询将一直更改,因此常见的 class 将没有意义,因为您正试图使其通用。因此,您可以遵循的选项是 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>
?为什么不 `List?:
reader 将为您提供与 table 中相同类型的列数据。如果是object就不用每次都转换了。
** 注意:-** 将方法签名中的参数的 String
更改为 string
。你可以找个理由here
您可以像这样使用 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;
}
}