2013-01-11 37 views
4

試圖瞭解爲什麼當在Sql server 2008 Clr程序集中使用上下文連接時,我不必將null轉換爲DBNull使用上下文連接時不需要將null轉換爲DBNull

我用下面的CLR過程:

[SqlProcedure] 
    public static void ParamTest(SqlBoolean useNormalConnection) 
    { 
     bool mode = useNormalConnection.Value; 

     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = "INSERT INTO TestNote (UserId, [Text]) VALUES (@UserId, @Text)"; 

      cmd.Parameters.Add("UserId", SqlDbType.Int).Value = null; 
      cmd.Parameters.Add("Text", SqlDbType.NVarChar).Value = "hello!"; 

      if (mode) 
      { 
       using (SqlConnection con = new SqlConnection(@"Data Source=localhost\SQL2008;Initial Catalog=TestDb;Integrated Security=True")) 
       { 
        con.Open(); 
        cmd.Connection = con; 
        cmd.ExecuteNonQuery(); 
       } 
      } 
      else 
      { 
       using (SqlConnection con = new SqlConnection("context connection=true;")) 
       { 
        con.Open(); 
        cmd.Connection = con; 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 
    } 

exec ParamTest 0將工作

exec ParamTest 1不會工作給予以下異常消息:

參數化查詢「(@UserId INT,@ text nvarchar(6))INSERT INTO TestNote(UserId'expect'參數'@UserId',它不是 提供的。

爲什麼傳遞null在使用上下文連接時工作?

+0

我的SQL Server安裝在這臺機器上壞了,所以無法測試自己 - 如果在添加參數時在參數名稱中包含「@」,它會有什麼不同嗎? –

+0

包含'@'沒有效果。 – Shikyo

回答

1

我不知道答案是肯定的,但我猜測它是在幕後使用不同的提供者來進行上下文連接,並且只是一個實現差異。我不會指望將該值設置爲空來工作。對於不同版本的.NET Framework,這種行爲也有所不同 - 例如對於根據this的.NET 3.5,您需要使用DBNull,但是如果切換到.NET 4.5文檔,則根本不會提及DBNull。

+0

在仔細檢查連接對象後,我注意到當使用上下文連接時,'SqlConnection.InnerConnection'具有不同的類型。通過上下文連接,它是'SqlInternalConnectionSmi',沒有'SqlInternalConnectionTds'。可能與它有關。 – Shikyo

相關問題