【问题标题】:Know what the error is, but I can't figure out how to solve it知道错误是什么,但我不知道如何解决它
【发布时间】:2013-06-06 16:09:34
【问题描述】:

这是我的代码:

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

这是我的错误信息:

无法将“System.Data.DataColumn”类型的对象转换为“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++;
        }

【问题讨论】:

  • ExcelData 是数据表吗?如果不知道 ExcelData.Columns 的索引运算符是如何工作的,就很难完全回答这个问题。
  • 列没有值。每一行的每一列都有一个值。
  • 我猜你应该阅读行,而不是列。
  • 尝试转换绑定项
  • 正如其他人所暗示的,如果ExcelData 是表,那么执行:ExcelData.Rows[0]["SysID"] 来获取值。

标签: c#


【解决方案1】:

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

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

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

编辑:所以 ExcelData 是 DataTable。因此上面的代码应该是正确的。对于 DataRow 集合,第一个索引器是实际的行索引,第二个索引器用于列。我原以为这是来自某些 Office API 的其他类。

【讨论】:

  • 我实际上之前尝试过这样做,使用 row 而不是 foo。编辑器给了我一条错误消息(在我上面的帖子中注明)。
  • 我发现我不能使用我的行变量,但我可以使用一个计数器变量,并在循环时增加它并将它用于我的行计数器(即 mod.SystemID = Convert. ToInt32(ExcelData.Rows[counter]["SysID"]) ) 感谢您让我走上正轨!
  • 第一个括号内的参数必须是整数。但好吧,你想通了。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2019-09-10
相关资源
最近更新 更多