2

我有一个 C# 程序,它应该从一个小的四列电子表格 (.xlsx) 中提取数据。它读取第一列很好,但是当它到达第二列时,我收到以下错误:

“指定的演员表无效”

我检查并重新检查了单元格的格式,第一列和第二列之间没有区别,第一列读得很好。以下是电子表格中第一行的值。每个值代表一个单独的列。

121220 330004 双 02/22/2012

这是我正在使用的代码。Id 变量加载得很好,这是导致问题的 courseCode。

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;"
    + "Data Source=C:\Projects\sym_AgentServices_INT\Book1.xlsx;"
    + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
string queryString = "SELECT * FROM [CE$]";

try
{
    OleDbDataReader reader;
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        reader = command.ExecuteReader();

        while (reader.Read())
        {
            string Id = "";
            string courseCode = "";
            string partner = "";
            string effectiveDate = "";
            string expirationDate = "";

            Id = reader.GetString(0);
            courseCode = reader.GetString(1);
            partner = reader.GetString(2);
            effectiveDate = reader.GetString(3);
            expirationDate = reader.GetString(4);
        }
    }
}

编辑

我在运行时分析了 reader 对象,发现以下内容:通过多次扩展 base 并打开 System.Data.OleDb.OleDbDataReader 的 _bindings 属性,我发现那里只有一个条目(“0”) . 但是,如果我打开 0,然后展开 _columnBindings 属性,我会发现值 0 - 4。

从阅读器(“reader.GetString(x)”)中提取数据时,我的语法是否不正确?

最终编辑

我强烈建议不要使用 .GetString(x),而是直接使用 reader[x].ToString()。这解决了问题。

4

1 回答 1

1

当我使用 reader[n].ToString() 时,错误消失了:

        string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=d:\temp\Book1.xlsx; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
        string queryString = "SELECT * FROM [CE$]";

        OleDbDataReader reader;
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            OleDbCommand command = new OleDbCommand(queryString, connection);
            connection.Open();

            DataSet ds = new DataSet("Book1");

            IDataAdapter adapter = new OleDbDataAdapter(queryString, connection);
            adapter.Fill(ds);

            reader = command.ExecuteReader();

            while (reader.Read())
            {
                string Id = "";
                string courseCode = "";
                string partner = "";
                string effectiveDate = "";
                string expirationDate = "";

                Id = reader[0].ToString();
                courseCode = reader[1].ToString();
                partner = reader[2].ToString();
                effectiveDate = reader[3].ToString();
                expirationDate = reader[4].ToString();

                //Id = reader.GetString(0);
                //courseCode = reader.GetString(1);
                //partner = reader.GetString(2);
                //effectiveDate = reader.GetString(3);
                //expirationDate = reader.GetString(4);
            }
        }

这是我的测试数据集...

ID  Course Code     Partner Effective Date Expiration Date
100 5               MS      10/3/2012       10/3/2013
200 21-400          Oracle  10/3/2012       10/3/2013
300                 Goog    10/3/2012       10/3/2013
于 2012-10-03T19:40:29.097 回答