我正在創建一個臨時表並使用相同的命令和連接使用兩個單獨的語句來填充臨時表。但是,如果我在創建之前插入參數並創建了表,我會收到'無效的對象名'。如果我在創建後添加它,它工作正常。當使用帶參數的命令時,臨時表的'無效對象名'
臨時表應該持續整個會話,所以當參數添加到命令對象時,我看不出什麼問題。
失敗:
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.Parameters.Add(new SqlParameter("@ID", 1234));
cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY, I INT NOT NULL)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO #Test VALUES (@ID, 1)";
cmd.ExecuteNonQuery();
..... more code that uses the table
}
WORKS:
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY, I INT NOT NULL)";
cmd.ExecuteNonQuery();
cmd.Parameters.Add(new SqlParameter("@ID", 1234));
cmd.CommandText = "INSERT INTO #Test VALUES (@ID, 1)";
cmd.ExecuteNonQuery();
..... more code that uses the table
}
編輯:
SQL事件探查闡明這更多的光線。
如果該命令有任何參數,則底層代碼將發出「exec sp_executesql」。如果清除參數,則底層代碼會發出更直接的「CREATE TABLE」。臨時表在sp_executesql後清理,這解釋了我在這裏看到的內容。
對我來說,這將是SqlCommand(或相關)代碼中的一個錯誤,但由於我現在有一個解釋,我可以繼續前進。
你得到了什麼錯誤信息 – HatSoft 2012-07-31 17:52:43
這是一個拋出的SqlException,「無效的對象名'#Test'」 – mford 2012-07-31 18:56:11
是的,這是標準的,因爲它增加了少量的SQL注入額外保護。如果需要,您可以使用存儲過程來完成這項工作,或將這些命令組合成一個查詢。 – Trisped 2012-07-31 19:54:34