2

こんにちは、奇妙なエラーが発生しました。別の目が必要です

私はこのコードを持っています:

    con.Open();
    var cmd = new SqlCommand("INSERT INTO [lntmuser].[attach] ([sysid],[name],[att_size],[cid],[flags],[contents]) VALUES (@sysid, @name, @att_size, @cid, @flags, @contents)", con) { CommandType = CommandType.Text };
    (Blah, Blah, ASIGN FIRST 5 VALUES, These All work)
    cmd.Parameters.AddWithValue("@contents", SqlDbType.Image).Value = aa.contents ?? (object) DBNull.Value;

aa.contents は byte[] 型です。最初はなしで試しました

"?? (object) DBNull.Value;" 

そして、「挿入は@contentsパラメーターを期待しています」というメッセージが表示されたので、??を追加しました (オブジェクト) DBNull.Value; 単体テストを実行すると、次のような醜いエラーが発生します。

RestoreTest.TestMultiParAttLookUp : FailedSystem.Data.SqlClient.SqlException : Operand  type clash: nvarchar is incompatible with image
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean  breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler,  SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject  stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,   RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,  RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at bcDAL.RestoreFunc.ExecuteSQL(List`1 emailIds, List`1 attIds, String conStrA, String  conStrM) in RestoreFunc.cs: line 173
at bcDAL.RestoreFunc.RestoreEntry(String sysid, String conStrA, String conStrM) in  RestoreFunc.cs: line 22
at tcUnitTests.RestoreTest.TestMultiParAttLookUp() in RestoreTest.cs: line 18       

nvarchar が登場したのはどこですか? 私はこの質問を見ていましたが、値を割り当てる前にSQLデータ型を明示的に述べています。

ちょっと寝たいかも(笑)。前もって感謝します。

4

1 に答える 1

2

DBNull.Valueここでの問題は、参照された質問で述べたように、ADO.NET が型を認識できないことです。答えが言うように、ADO.NETはそれがどのデータ型であるかを判断できないため、デフォルトで1つになります。

それはそれほどきれいではなく、他のものと同じ慣習に従っていませんが、仕事は完了します. これを 1 行ではなく 2 行以上にすることを提案します。

var contentsParam = new SqlParameter("@contents", SqlDbType.Image);
contentsParam.Value = aa.contents ?? (object) DBNull.Value;
cmd.Parameters.Add(contentsParam);   
cmd.ExecuteNonQuery();
于 2012-04-17T03:28:51.617 に答える