【问题标题】:Specified cast is not valid when I try to cast to (int?)当我尝试转换为 (int?) 时,指定的转换无效
【发布时间】:2020-06-18 09:23:51
【问题描述】:

我有这段代码可以将数据保存到数据库

for (int i = 0; i < dt.Rows.Count; i++)
        {
            var row = dt.Rows[i];

            await stock.AddProjectNeedsBoltsTest(Convert.ToInt32(row["Quantité"]),
                (int?)row["Filetage"],
                Convert.ToInt32(row["idProject"]),
                (int?)row["idCategory"],
                (int?)row["idType"]).ConfigureAwait(true);
        }

这是 AddProjectNeedsBoltsTest 背后的代码

public async Task AddProjectNeedsBoltsTest(int Quantity, int? Filetage, int IdProject, int? IdCategory, int? IdType)
    {
        DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
        await Task.Run(() => DAL.Open()).ConfigureAwait(false);
        SqlParameter[] param = new SqlParameter[5];

        param[0] = new SqlParameter("@Quantity", SqlDbType.Int)
        {
            Value = Quantity
        };

        param[1] = new SqlParameter("@Filetage", SqlDbType.Int)
        {
            Value = Filetage.HasValue ? Filetage : (object)DBNull.Value
        };

        param[2] = new SqlParameter("@IdProject", SqlDbType.Int)
        {
            Value = IdProject
        };

        param[3] = new SqlParameter("@IdCategory", SqlDbType.Int)
        {
            Value = IdCategory.HasValue ? IdCategory : (object)DBNull.Value
        };

        param[4] = new SqlParameter("@IdType", SqlDbType.Int)
        {
            Value = IdType.HasValue ? IdType : (object)DBNull.Value
        };

        await Task.Run(() => DAL.ExcuteCommande("AddProjectNeedsBoltsTest", param)).ConfigureAwait(false);
        DAL.Close();

    }

这是我的存储过程

    CREATE PROCEDURE dbo.AddProjectNeedsBoltsTest
        @Quantity int
       ,@Filetage int
       ,@IdProject int
       ,@IdCategory int
       ,@IdType int
AS
INSERT INTO [dbo].[ProjectNeedsBolts]
       ([Quantity]
       ,[Filetage]
       ,[IdProject]
       ,[IdCategory]
       ,[IdType])
 VALUES
       (@Quantity
       ,@Filetage
       ,@IdProject
       ,@IdCategory
       ,@IdType)

现在当我点击保存按钮时出现此错误

Smart Industrial Management.exe 中出现“System.InvalidCastException”类型的异常,但未在用户代码中处理 附加信息:指定的演员表无效。

关于这行代码的调试

(int?)row["Filetage"]

我收到此错误消息

无法将 'row["Filetage"]' 拆箱为 'int?'

更新:这是我的数据表

DataTable dt = new DataTable();
    void CreateDataTable()
    {
        dt.Columns.Add("Quantité");
        dt.Columns.Add("Filetage");
        dt.Columns.Add("idProject");
        dt.Columns.Add("idCategory");
        dt.Columns.Add("idType");

        gridControl1.DataSource = dt;
    }

如果我尝试使用

dt.Columns.Add("Filetage", typeof(int?));

我收到错误消息

DataSet 不支持 System.Nullable

【问题讨论】:

  • 那么...row["Filetage"] 中有什么内容
  • @TheGeneral 它可以保存 int 值或 null
  • 这是假设,你检查过值吗?
  • 明确:row["Filetage"].GetType().FullName 是什么?
  • @M.Bouabdallah 好吧,是的;您不能将string 转换为int? - 在我看来,您的数据库架构非常错误 - 如果它代表int,则该列应该是int;如果你不能改变它,你将不得不期待字符串,并进行自己的格式化(记住考虑数据存储在什么文化中,这可能与运行机器上的文化不同,或者数据库服务器的文化)

标签: c# sql-server winforms


【解决方案1】:

确实,DataTable 不支持 int? - 您可以将其添加为 int - DataTable 处理可空性单独。对于演员表,有两种可能:

  1. 值为DBNull
  2. 值是别的东西——不是int;也许是 longstring

对于 1 - 只需检查值是否为 is DBNull,如果是:不要尝试将其转换为 int - 自己处理 null

对于 2 - 您必须自己进行解析/转换代码,但坦率地说:最好修复数据库,使其正确

但是,坦率地说:我要说的是:像 Dapper 这样的工具可以让这一切消失 - 不,DataTable,不用担心。您只需将 List&lt;ProjectNeedsBolts&gt; 之类的东西用于 POCO:

public class ProjectNeedsBolts {
    public int Quantity {get;set;}

    public int IdType {get;set;}
}

(或int?,或您需要的任何其他内容),然后让库为您完成所有工作:

await conn.ExecuteNonQueryAsync(
    "AddProjectNeedsBoltsTest",
    new { Quantity, Filetage, IdProject, IdCategory, IdType }
    commandType: CommandType.StoredProcedure).ConfigureAwait(false);

或:

var data = await conn.QueryAsync<ProjectNeedsBolts>(
    "your select sql",
    new {...} // parameters
}).ConfigureAwait(false);

【讨论】:

  • 是的,我已经开始学习 Dapper,如果你能推荐任何特别针对 winform 的课程,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多