【问题标题】:Why am I getting a 'data will be truncated' exception?为什么我会收到“数据将被截断”异常?
【发布时间】:2015-06-01 16:30:19
【问题描述】:

我有一些执行存储过程的代码,而该存储过程又只是运行 INSERT + SELECT 以反馈给调用数据适配器

Public Function mGetDataSet_Trans(ByVal aStrQuery As String, ByRef aObjDS As DataSet, ByVal aStrDSName As String, ByVal aCon As SqlConnection, ByRef aTrans As SqlTransaction) As Boolean

    Dim pObjDataAdaptor As New SqlClient.SqlDataAdapter

    mGetDataSet_Trans = False

    Try
      pObjDataAdaptor.SelectCommand = New SqlCommand(aStrQuery, aCon, aTrans)
      pObjDataAdaptor.Fill(aObjDS, aStrDSName)
      mGetDataSet_Trans = True

    Catch SqlExp As SqlException
      //do stuff

      Throw SqlExp
    End Try
End Function

没有什么太复杂的;创建一个数据适配器,给它一个命令和连接,填充一个通过引用传递的新数据集对象,如果有异常则回滚事务。

aStrQuery 基本上是这样的:

    "EXECUTE USPSave 

    @FID='1090802', 
    @PID='4739933', 
    @aAType='4', 
    @aADate='6/1/2015 12:00:00 AM', 
    @aDiag1='ABC.12', 
    @aDiag2='ABC.12', 
    @aDiag3='ABC.12AB', 
    @aChangedBy='123'"

    // SELECT ... FROM myTable WHERE FID = @FID

USPSave 中,@aDiagXVARCHAR(10),所以那里没有问题。更新的表还定义了 VARCHAR(10) 字段,这也不应该是一个问题。

我完全不知道这个异常可能来自哪里,但它是 TRY 块中的 Fill 调用引发了异常。有什么想法吗?

【问题讨论】:

  • 请编辑您的问题以包括您的存储过程和相关表 ddl。
  • 我建议使用参数集合而不是传入整个字符串来执行。他们这样写很容易受到sql注入。
  • @SeanLange aStrQuery 是安全构建的——它不仅仅是从 UI 中撕下的一些串联字符串..
  • 我并不是说它只是一些字符串。我建议您传递一个参数集合,以便您可以轻松构建正确的参数化语句。这也可以解决问题,因为您知道每个参数的数据有多长。
  • @SeanLange 哦,我误会了。我现在明白你的意思了。

标签: asp.net sql-server vb.net


【解决方案1】:

没有太多事情要做,但这里有一个猜测:

"字段为 VARCHAR(10)"

"@aADate='6/1/2015 12:00:00 AM', "

我认为 aADate 字段太长,您被告知它将被截断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2013-02-10
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多