問題描述
在做.NET Core demo的時候使用 ExecuteSqlCommand
調用執行是出現如下錯誤
Microsoft.Data.SqlClient.SqlException (0x80131904): The parameterized query ‘(xxx’ expects the parameter ‘@xxx’, which was not supplied.
原因分析
之前在使用EF的時候完全沒有問題,後改用調用sp後出現問題,又排查了sql語句以及參數都沒有發現錯誤,後來在Postman發現測試數據這個值是null值,後賦值給這個字段再次跑postman發現可以跑過。分析是因爲直接賦值null給sp的過程中出錯,但是該字段並不是必填項,可以有空的時候,後調查使用 DBNull.Value
來解決
解決辦法
在SqlParameter賦值的時候使用 DBNull.Value
來做一次判斷:
SqlParameter paraXxxx = new SqlParameter("@Xxxx", regRequest.Xxxx ?? DBNull.Value);
按照上述代碼修改後發現有編譯錯誤:
CS0019 Operator ‘??’ cannot be applied to operands of type ‘string’ and ‘DBNull’
問題原因:
字符串和 DBNull
之間不能自動進行轉換
解決辦法
可以有如下的代碼進行轉換:
SqlParameter paraXxxx = new SqlParameter("@Xxxx", (object)regRequest.Xxxx ?? DBNull.Value);
或
SqlParameter paraXxxx = new SqlParameter("@Xxxx", regRequest.Xxxx ?? Convert.DBNull);
或者
SqlParameter paraXxxx = new SqlParameter("@Xxxx", regRequest.Xxxx ?? (object)DBNull.Value);
至此問題已解決