2011-12-16 21 views
1

データベースにデータを挿入するストアドプロシージャがあり、SQL Server 2005でデータベースを使用していてもSQLにアップグレードしたときに問題なく動作していました。 Server 2008 R2となり、2回成功すると失敗します。ストアドプロシージャの呼び出しがWebサービスから失敗します

文字列またはバイナリデータが
を切り捨てられる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

値はvarcharsよりも長いのですか? – SQLMason

+0

'SqlConnection'、' SqlCommand'と 'SqlDataReader'を' Using'ブロックに配置してみてください。問題が数回試行された後に発生するという事実は、リソースリークがある可能性があることを示しています。 –

+0

私が下で言うこと以外にも、John Saundersからのコメントを使用して文を使用することについてのコメントを2番目にする必要があります。 – peter

答えて

0

未満であると、各時間がVARCHAR(X)に関連し、その特定してテーブルにデータを挿入しますフィールドはx文字より長く設定されます。

あなたはそれがフィールドの長さではありませんが、私にとってはそのエラーを見た唯一の時間だと言います。おそらくあなたのケースは異なるでしょう。

データベースに定義されている有限の長さの文字列がかなりあります。適切なものに応じて、それぞれを取り出して長さをテストし、エラーを記録するか、文字列を自分自身で切り捨てます。それは次のようになりますC#ので

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

失敗し、エラーの問題は、それがエラーがで発生したフィールドを教えてくれないということです。

自分のデータベースに(エンティティフレームワークを使用して)見て、フィールド長を入力データと比較し、フィールドが長すぎるとエラーをログするバリデータを書きました。私の場合は切り捨てが適切ではなかったため、操作を終了するだけでした。

関連する問題