2

小さな 4 列のスプレッドシート (.xlsx) からデータを取得する C# プログラムがあります。最初の列は問題なく読み取りますが、2 番目の列になると次のエラーが発生します。

「指定されたキャストは無効です」

セルの形式を確認して再確認しましたが、問題なく読み取れる最初の列と 2 番目の列に違いはありません。以下は、スプレッドシートの最初の行の値です。各値は、1 つの個別の列を表します。

121220 330004 デュアル 2012 年 2 月 22 日

そして、ここに私が使用しているコードがあります。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);
        }
    }
}

編集

実行時にリーダー オブジェクトを分析したところ、次のことがわかりました。base を何度も展開し、System.Data.OleDb.OleDbDataReader の _bindings プロパティを開くと、エントリが 1 つしかないことがわかりました ("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 に答える