0

これが私のコードです:

mod.SystemID = Convert.ToInt32(ExcelData.Columns["SysID"]);

これが私のエラーメッセージです:

タイプ 'System.Data.DataColumn' のオブジェクトをタイプ 'System.IConvertible' にキャストできません。

列「SysID」の値を取得して整数に変換しようとしています。ただし、コンパイラは、値ではなく実際の列を変換しようとしていると考えています。私の人生では、これを理解することはできません。明らかな何かが欠けていることはわかっています。 .value(example: Columns["SysID"].value;) を追加しようとしましたが、そうではありません。誰かが私がここで見逃しているものを教えてもらえますか?

ありがとう!

編集: わかりやすくするために、プログラム全体を以下に追加しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace CopyExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            var fileName = string.Format("{0}\\MaintList.xlsx", "C:\\Import");
            var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);
            var db = new ModulesDataContext();
            var adapter = new OleDbDataAdapter("SELECT * FROM [AM IST$]", connectionString);
            var ds = new DataSet();

            adapter.Fill(ds, "ExcelData");

            DataTable ExcelData = ds.Tables["ExcelData"];

            foreach (DataRow row in ExcelData.Rows)
            {
                Module mod = new Module();

                mod.SystemID = Convert.ToInt32(ExcelData.Columns["SysID"]);
                mod.Module1 = ExcelData.Columns["Num"].ToString();
                mod.Title = ExcelData.Columns["Title"].ToString();

                db.Modules.InsertOnSubmit(mod);
                db.SubmitChanges();
            }
        }
    }
}

別の編集:

さて、私はこれに問題を与える行を変更しようとしました:

mod.SystemID = Convert.ToInt32(ExcelData.Rows[row]["SysID"]);

ただし、エディターはその下に波線を配置し、プログラムを実行しようとするとエラー メッセージが表示されます。

エラー 1 'System.Data.DataRowCollection.this[int]' に最適なオーバーロードされたメソッドに無効な引数がいくつかあります

コードに次の変更を加えたところ、完全に機能するようになりました。

        var counter = 0;
        foreach (DataRow row in ExcelData.Rows)
        {
            Module mod = new Module();

            mod.SystemID = Convert.ToInt32(ExcelData.Rows[counter]["SysID"]);
            mod.Module1 = ExcelData.Rows[counter]["Num"].ToString();
            mod.Title = ExcelData.Rows[counter]["Title"].ToString();
            mod.Type = "ICW";

            db.Modules.InsertOnSubmit(mod);
            db.SubmitChanges();
            counter++;
        }
4

1 に答える 1

2

列から値にアクセスしようとしています。.NET や他のほとんどのフレームワークでは、テーブル構造がある場合、列から直接ではなく、最初に行から値にアクセスし、次に列から値にアクセスします。

私はその API を使用したことがないため、使用する必要がある正確なプロパティはわかりませんが、次のようなものにする必要があると確信しています。

mod.SystemID = Convert.ToInt32(ExcelData.Rows[foo]["SysID"]);

編集:したがって、ExcelDataはDataTable. したがって、上記のコードは正しいはずです。DataRow コレクションの場合、最初のインデクサーは実際の行インデックスで、2 番目のインデクサーは列用です。Office API の別のクラスだと思っていました。

于 2013-06-06T16:12:58.637 に答える