【问题标题】:Specified cast is not valid.. in sql data record [closed]指定的转换无效..在sql数据记录中[关闭]
【发布时间】:2017-08-09 08:43:35
【问题描述】:

我使用以下代码将列表值插入到表中。 我参考这个链接来实现这个过程。 Passing list of objects to a SQL Server stored procedure and insert records using asp.net core

private List<SqlDataRecord> GetHotelList(List<HotelInfo> list, string RequestRef)
        {
            List<SqlDataRecord> datatable = new List<SqlDataRecord>();

            SqlMetaData[] sqlMetaData = new SqlMetaData[12];
            sqlMetaData[0] = new SqlMetaData("HotelID", SqlDbType.Int);
            sqlMetaData[1] = new SqlMetaData("RequestReference", SqlDbType.VarChar, 15);
            sqlMetaData[2] = new SqlMetaData("FromDate", SqlDbType.DateTime);
            sqlMetaData[3] = new SqlMetaData("ToDate", SqlDbType.DateTime);
            sqlMetaData[4] = new SqlMetaData("Nights", SqlDbType.Int);
            sqlMetaData[5] = new SqlMetaData("MealPlan", SqlDbType.VarChar, 10);
            sqlMetaData[6] = new SqlMetaData("LastUpdatedBy", SqlDbType.VarChar, 50);
            sqlMetaData[7] = new SqlMetaData("LastUpdatedDate", SqlDbType.DateTime);
            sqlMetaData[8] = new SqlMetaData("Status", SqlDbType.Int);
            sqlMetaData[9] = new SqlMetaData("StarCategory", SqlDbType.Int);
            sqlMetaData[10] = new SqlMetaData("CreatedDateTime", SqlDbType.DateTime);
            sqlMetaData[11] = new SqlMetaData("CreatedUserId", SqlDbType.VarChar, 15);

            foreach (var info in list)
            {
                SqlDataRecord row = new SqlDataRecord(sqlMetaData);
                int? hotelId = GetHoteId(info.HotelName);
                row.SetValues(hotelId, RequestRef, info.FromDate, info.ToDate, info.Nights, info.MealPlan, info.StarCategory, info.Status, info.LastUpdatedBy, DateTime.Now, DateTime.Now, info.CreatedUserId);
                datatable.Add(row);
            }

            return datatable;
        }

但我在 row.SetValues() 中收到“指定的演员表无效”错误。我能得到任何线索吗?

谢谢。

【问题讨论】:

  • hotelId 设为可为空是最好的主意。
  • 拥有一个我们可以实际检查的minimal reproducible example 会有很大帮助,但乍一看,您似乎以与元数据数组不同的顺序将参数传递给SetValues - 具体来说,您似乎将Status 传递到LastUpdatedDate 可能出现的位置。

标签: c# sql-server asp.net-mvc stored-procedures


【解决方案1】:

看起来你的值的顺序是关闭的。具体来说,您有:

sqlMetaData[5] = new SqlMetaData("MealPlan", SqlDbType.VarChar, 10);
sqlMetaData[6] = new SqlMetaData("LastUpdatedBy", SqlDbType.VarChar, 50);
sqlMetaData[7] = new SqlMetaData("LastUpdatedDate", SqlDbType.DateTime);
sqlMetaData[8] = new SqlMetaData("Status", SqlDbType.Int);
sqlMetaData[9] = new SqlMetaData("StarCategory", SqlDbType.Int);
sqlMetaData[10] = new SqlMetaData("CreatedDateTime", SqlDbType.DateTime);

但是当你插入时

info.MealPlan,
info.StarCategory,
info.Status,
info.LastUpdatedBy,
DateTime.Now,
DateTime.Now

注意 StarCategory、Status 和 LastUpdatedBy 是如何不合适的。

【讨论】:

    【解决方案2】:

    您没有向我们展示在这种情况下至关重要的 SQL Sever 部分。请使用您要插入的相应 SQL Server 代码表更新您的问题,并且您使用的存储过程将是最好的。

    您可能正在做一些 CAST (Cast and Convert 函数不正确的值转换。

    【讨论】:

      【解决方案3】:

      row.SetValues 方法需要对象

      试试这个

      row.SetValues(new object[]{hotelId, RequestRef, info.FromDate, info.ToDate, info.Nights, info.MealPlan, info.StarCategory, info.Status, info.LastUpdatedBy, DateTime.Now, DateTime.Now, info.CreatedUserId});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2017-03-12
        相关资源
        最近更新 更多