我知道错误是什么,但不知道如何解决

本文关键字:何解决 解决 不知道 错误 是什么 我知道 | 更新日期: 2023-09-27 18:17:19

我的代码:

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

下面是我的错误提示:

<>之前无法强制转换"System.Data"类型的对象。datacolum列'来键入'System.IConvertible'。之前

我试图获得列"SysID"的值并将其转换为整数。但是,编译器认为我正在尝试转换实际列,而不是值。我怎么也想不明白这是怎么回事。我知道我遗漏了一些明显的东西,我甚至尝试添加.value(例如: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. 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++;
        }

我知道错误是什么,但不知道如何解决

您试图访问列中的值。在。net以及大多数其他框架中,当你有一个表结构时,你首先从行访问值,然后从列访问值,而不是直接从列访问值。

我不知道你应该使用的确切属性,因为我从来没有使用过那个API,但我很确定它应该是这样的:

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

Edit:所以ExcelData是一个DataTable。因此上面的代码应该是正确的。对于DataRow集合,第一个索引器是实际的行索引,第二个索引器是列索引。