C# - 尝试将行值添加到列表抛出 InvalidOperationException
C# - Trying to add row values to list throws InvalidOperationException
我想将列的值(即列名)和特定行的行值存储到两个单独的列表中。 Provider
和 Document
都是 List<string>
。但是由于与 Document
存在类型冲突,我使用的是 var Document
,因此编译器接受了它。
以下代码在 var Document = Enumerable.Range(0, dr.FieldCount).Select(dr.GetValue).ToList();
之前都可以正常工作
OleDbCommand cmd = new OleDbCommand(abfrage, conn);
OleDbDataReader dr;
try
{
conn.Open();
dr = cmd.ExecuteReader();
Provider = Enumerable.Range(0, dr.FieldCount)
.Select(dr.GetName)
.ToList();
// Following line will throw exception
var Document = Enumerable.Range(0, dr.FieldCount)
.Select(dr.GetValue)
.ToList();
dr.Close();
dr.Dispose();
}
catch (System.InvalidOperationException inv)
{
MessageBox.Show(inv.Message);
throw;
}
第一个列表正确存储了列名,但另一个列表抛出 InvalidOperationException
并表示行或列中都没有值。这对于某些列是正确的(它们是空的)。我用另一个 DB-Table 测试了它,其中每个 column/row 都有一个值,但我在这里得到了同样的异常。
我做错了什么?
提前致谢!
编辑:
这里有两个屏幕截图,显示了 reader 读取的值。
第一个列名(值是灰色的,它是敏感数据):
first results
第二个具有整行的值:
read values
您需要调用 dr.Read()
来读取结果的第一行。
此外,您在该代码中的 Document
是一个被丢弃的局部变量。我猜您想将其分配给同名的 属性?您还需要将 dr.GetValue()
的结果转换为字符串。
我想你会想要初始化 Document
和 Provider
以及调用 AddRange
方法而不是将它们分配给结果。
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace ConsoleApplication57
{
class Program
{
static void Main(string[] args)
{
OleDbConnection conn = new OleDbConnection("Enter Connection String Here");
string abfrage = "Enter Query Here";
OleDbCommand cmd = new OleDbCommand(abfrage, conn);
OleDbDataReader dr;
List<string> Provider = new List<string>();
int colIndex = 3;
try
{
conn.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
Provider.Add(dr.GetString(colIndex));
}
dr.Close();
dr.Dispose();
}
catch (System.InvalidOperationException inv)
{
MessageBox.Show(inv.Message);
throw;
}
}
}
}
我想将列的值(即列名)和特定行的行值存储到两个单独的列表中。 Provider
和 Document
都是 List<string>
。但是由于与 Document
存在类型冲突,我使用的是 var Document
,因此编译器接受了它。
以下代码在 var Document = Enumerable.Range(0, dr.FieldCount).Select(dr.GetValue).ToList();
OleDbCommand cmd = new OleDbCommand(abfrage, conn);
OleDbDataReader dr;
try
{
conn.Open();
dr = cmd.ExecuteReader();
Provider = Enumerable.Range(0, dr.FieldCount)
.Select(dr.GetName)
.ToList();
// Following line will throw exception
var Document = Enumerable.Range(0, dr.FieldCount)
.Select(dr.GetValue)
.ToList();
dr.Close();
dr.Dispose();
}
catch (System.InvalidOperationException inv)
{
MessageBox.Show(inv.Message);
throw;
}
第一个列表正确存储了列名,但另一个列表抛出 InvalidOperationException
并表示行或列中都没有值。这对于某些列是正确的(它们是空的)。我用另一个 DB-Table 测试了它,其中每个 column/row 都有一个值,但我在这里得到了同样的异常。
我做错了什么?
提前致谢!
编辑:
这里有两个屏幕截图,显示了 reader 读取的值。
第一个列名(值是灰色的,它是敏感数据): first results
第二个具有整行的值: read values
您需要调用 dr.Read()
来读取结果的第一行。
此外,您在该代码中的 Document
是一个被丢弃的局部变量。我猜您想将其分配给同名的 属性?您还需要将 dr.GetValue()
的结果转换为字符串。
我想你会想要初始化 Document
和 Provider
以及调用 AddRange
方法而不是将它们分配给结果。
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace ConsoleApplication57
{
class Program
{
static void Main(string[] args)
{
OleDbConnection conn = new OleDbConnection("Enter Connection String Here");
string abfrage = "Enter Query Here";
OleDbCommand cmd = new OleDbCommand(abfrage, conn);
OleDbDataReader dr;
List<string> Provider = new List<string>();
int colIndex = 3;
try
{
conn.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
Provider.Add(dr.GetString(colIndex));
}
dr.Close();
dr.Dispose();
}
catch (System.InvalidOperationException inv)
{
MessageBox.Show(inv.Message);
throw;
}
}
}
}