我有一个奇怪的问题,我有一个存储过程将数据插入数据库,当我们在SQL Server 2005中有数据库时,它工作正常,但我们已升级到SQL Server 2008 R2,现在它失败了两个成功的条目。
从SQL异常返回的错误是
字符串或二进制数据将被截断 声明已被终止
之前有没有人遇到过这类问题?正如我所说,自从我们迁移到SQL Server 2008以来,这才刚刚开始。
我还应该说,我知道截断错误意味着什么,但这是问题,我检查了发送到数据库的值和长度,并且它们都没有超出正在插入的字段大小。此外,我可以从Management Studio多次运行它,它永远不会失败。所以我认为它与连接或sql命令对象有关吗?
与数据库连接的代码如下
Public Function AddDataToDatabase(ByVal ModuleName As String, ByVal ModuleKey As Integer, ByVal ShapeDescription As String, ByVal ShapeNotes As String, ByVal ShapeType As String, ByVal ShapeStatus As String, ByVal FeatureType As String) As AttributeEditingResult Implements IDataService.AddDataToDatabase
Dim sqlConn As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MDC_Reference").ConnectionString)
Dim sqlCmd As SqlClient.SqlCommand = New SqlCommand
sqlCmd.CommandText = ConfigurationManager.AppSettings.Get("sp_Insert")
sqlCmd.CommandType = CommandType.StoredProcedure
sqlCmd.Connection = sqlConn
Dim myReader As SqlClient.SqlDataReader
Dim TableKey As Integer = 0
Dim Result As New AttributeEditingResult With {
.Success = False, _
.TableKey = TableKey}
sqlCmd.Parameters.Clear()
sqlCmd.Parameters.Add(New SqlParameter("@ModuleName", SqlDbType.VarChar, 50))
sqlCmd.Parameters.Add(New SqlParameter("@ModuleKey", SqlDbType.Int))
sqlCmd.Parameters.Add(New SqlParameter("@ShapeDescription", SqlDbType.VarChar, 255))
sqlCmd.Parameters.Add(New SqlParameter("@ShapeNotes", SqlDbType.VarChar, 1024))
sqlCmd.Parameters.Add(New SqlParameter("@ShapeType", SqlDbType.VarChar, 10))
sqlCmd.Parameters.Add(New SqlParameter("@ShapeStatus", SqlDbType.VarChar, 50))
sqlCmd.Parameters.Add(New SqlParameter("@FeatureType", SqlDbType.VarChar, 50))
sqlCmd.Parameters("@ModuleName").Value = ModuleName
sqlCmd.Parameters("@ModuleKey").Value = ModuleKey
sqlCmd.Parameters("@ShapeDescription").Value = ShapeDescription
sqlCmd.Parameters("@ShapeNotes").Value = ShapeNotes
sqlCmd.Parameters("@ShapeType").Value = ShapeType
sqlCmd.Parameters("@ShapeStatus").Value = ShapeStatus
If FeatureType = "NULL" Then
sqlCmd.Parameters("@FeatureType").Value = DBNull.Value
Else
sqlCmd.Parameters("@FeatureType").Value = FeatureType
End If
Try
sqlConn.Open()
myReader = sqlCmd.ExecuteReader()
While myReader.Read
Result.TableKey = CInt(myReader(0))
End While
sqlConn.Close()
sqlCmd.Dispose()
Result.Success = True
Catch ex As SqlException
sqlConn.Close()
sqlCmd.Dispose()
Result.Success = False
Result.ErrorMessage = ex.Message & vbNewLine & ex.StackTrace
End Try
Return Result
End Function
答案 0 :(得分:0)
之前我已经看过很多这个错误,并且每次都与varchar(x)相关,然后将数据插入表中,并且该特定字段的设置长于x个字符。
你提到它不是场长,但对我而言,这是我唯一一次看到这个错误。也许你的情况不同。
你有很多字符串,它们是数据库中定义的有限长度。拿每一个并测试它的长度并记录错误,或者根据适当的情况自行截断字符串。
在C#中它看起来像这样,
if (ModuleName.Length > 50)
{
ModuleName = ModuleName.Substring(0, 50);
}
失败和错误的问题在于它不会告诉您错误发生在哪个字段。
我自己写了一个验证器,它查看了我的数据库(使用实体框架),将字段长度与传入数据进行了比较,并在字段太长时记录错误。在我的情况下截断是不合适的,操作只是必须终止。