これが私のコードです:
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++;
}