0

我想将列的值(即列名)和特定行的行值存储到两个单独的列表中。Provider并且Document都是List<string>. Document但由于与I'm using存在类型冲突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 对其进行了测试,其中每一列/行都有一个值,但在这里我得到了同样的异常。

我究竟做错了什么?

提前致谢!

编辑:

这是两个屏幕截图,显示了阅读器的读取值。

第一个带有列名(值是灰色的,它是敏感数据): 第一个结果

第二个是整行的值: 读取值

4

2 回答 2

1

您需要调用dr.Read()以从结果中读取第一行。

此外,您Document在该代码中是一个被丢弃的局部变量。我猜您想将其分配给同名的属性?您还需要将结果dr.GetValue()转换为字符串。

我认为您将希望同时初始化DocumentandProvider和 callAddRange方法,而不是将它们分配给结果。

于 2017-05-24T11:36:36.133 回答
0

尝试这个

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;
            }
        }
    }
}
于 2017-05-24T11:48:00.613 回答