2012-04-17 6 views
2

こんにちは、私は目 ADO例外オペランドタイプ衝突

の別のセットは、奇妙なエラーする必要が取得しています私はこのコードを持っている:

aa.contentsはbyte []型のものであり
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; 

。最初に試してみた

"?? (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が再生に来ましたか? I was looking at this questionしかし、値を割り当てる前にSQLデータ型を明示しています。

私はちょうど睡眠笑を必要とするかもしれません。前もって感謝します。

答えて

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(); 
+0

これは動作しますが、私の眠気の目には、構文以外の違いは何ですか? –

+0

'AddWithValue()。Value ='はそれをすべて一回で行います:型とともに値を設定し、それらが一致することを保証します。値が指定したタイプと一致しない場合は、一致するものにダウングレードします。ここで私の答えでは、あなたは明示的であり、オブジェクトを作成するときに型を設定します。私は本当の答えはありません、私たちは本当に確実にADO.NETのソースを見なければならないでしょう。 –

+0

非常に興味深いおかげで再びp –