从Web Service调用存储过程失败

时间:2011-12-16 03:28:56

标签: sql wcf stored-procedures

我有一个奇怪的问题,我有一个存储过程将数据插入数据库,当我们在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

1 个答案:

答案 0 :(得分:0)

之前我已经看过很多这个错误,并且每次都与varchar(x)相关,然后将数据插入表中,并且该特定字段的设置长于x个字符。

你提到它不是场长,但对我而言,这是我唯一一次看到这个错误。也许你的情况不同。

你有很多字符串,它们是数据库中定义的有限长度。拿每一个并测试它的长度并记录错误,或者根据适当的情况自行截断字符串。

在C#中它看起来像这样,

if (ModuleName.Length > 50)
{
    ModuleName = ModuleName.Substring(0, 50);
}

失败和错误的问题在于它不会告诉您错误发生在哪个字段。

我自己写了一个验证器,它查看了我的数据库(使用实体框架),将字段长度与传入数据进行了比较,并在字段太长时记录错误。在我的情况下截断是不合适的,操作只是必须终止。