知道错误是什么,但我无法弄清楚如何解决它

时间:2013-06-06 16:09:34

标签: c#

这是我的代码:

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

这是我的错误消息:

Unable to cast object of type 'System.Data.DataColumn' to type '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.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++;
        }

1 个答案:

答案 0 :(得分:2)

您正尝试从列中访问值。在.NET以及大多数其他框架中,当您拥有表结构时,首先访问行中的值,然后访问列,而不是直接访问列。

我不知道您应该使用的确切属性,因为我从未使用过该API,但我确信它应该是这样的:

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

修改:ExcelData是DataTable。因此,上面的代码应该是正确的。对于DataRow集合,第一个索引器是实际行索引,第二个索引器是列。我以为它是某个Office API的其他类。