【问题标题】:SQL String or binary data would be truncatedSQL 字符串或二进制数据将被截断
【发布时间】:2017-04-10 02:45:13
【问题描述】:

我正在尝试在数据库中搜索最大 ID,然后为每个新条目将其递增 1,如下所示:

var query2 = dbb.Database.SqlQuery<patient_visit>("SELECT MAX(CAST(SUBSTRING(pvid, 3, 10) AS int)) FROM patient_visit");

            if (query2 != null)
            {
                objDetails.pvid = query2.ToString();
                objDetails.pvid += 1;
                objDetails.pvid = "PV" + objDetails.pvid;
            }

string sql = "INSERT INTO patient_visit (pvid,paid) " +
                         "VALUES('" + objDetails.pvid + "', '" + paid + "')";

但是当我尝试将它插入数据库时​​,它给出了错误

EntityFramework.SqlServer.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

附加信息:字符串或二进制数据将被截断。

我尝试在 SQL Server 中运行查询并检查“pvid”的值,它是 10,所以在我将“PV”包含到整数 pvid 之后,它应该是 12。所以应该没问题,但为什么我得到那个错误了吗?请问谁能帮帮我?

[Key]
    [MaxLength(20), MinLength(12)]
    public string pvid { get; set; }

当我用硬代码 ID 替换 pvid 时,它工作得很好。为什么会这样?

P/S:我知道简单地将输入数据与查询连接起来是不可取的,但我也尝试过使用参数化查询进行查询,但它给出了同样的错误。

string sql = "INSERT INTO patient_visit (pvid,paid) " +
                         "VALUES(@pvid, @paid)";
List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pvid", objDetails.pvid));
parameterList.Add(new SqlParameter("@paid", paid));
SqlParameter[] parameters = parameterList.ToArray();
dbb.Database.ExecuteSqlCommand(sql, parameters);

【问题讨论】:

  • 您能告诉我们为什么您使用字符串 pvid 并在可以使用自动增量字段的地方增加 1 吗?
  • @maSTARrHiAn 我正在为我的数据库使用 SQL Server 2012。我对它不是很熟悉,可以用 SQL Server 2012 完成吗?怎么样?

标签: sql ef-code-first asp.net-mvc-viewmodel


【解决方案1】:

检查您尝试将数据放入的列的字段长度。

我在列是 varchar(10) 之前遇到过这个问题,我试图连接两个每个 6 个字符的 char 字符串。使它们长 12 个字符。 2 比目标字段长。

您的问题可能类似。

【讨论】:

  • 如何查看字段长度?
  • @Nurul:您查看表中列的定义,在插入发生之前,当您调试时,您检查长度您作为值传入的字符串.....
  • @marc_s 我在哪里检查?在 Visual Studio 或 SQL Server 的 Locals 控制台中?对不起,我对此一无所知:(
  • @Nurul:您必须在 SQL Server Management Studio 中检查列的 长度 - 正如它们在 SQL Server 表中定义的那样。这告诉你每个字符串可以有多长 - 最多。然后,当您在 Visual Studio 中调试代码并到达应插入数据的位置时,请检查 在 Visual Studio、“Locals”中或仅通过将鼠标悬停在变量上,每个字符串 真正的长度 - 至少其中一个字符串将比表格定义的最大允许长度 - 这就是错误说
  • @marc_s 当我将鼠标悬停在 pvid 上时,我看不到确切的值,它只显示搜索查询中使用的查询字符串,"PVSELECT MAX(CAST(SUBSTRING (pvid, 3, 10) AS int)) FROM patient_visit1"
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多