私は一時テーブルを作成し、同じコマンドと接続を使用して別の2つのステートメントを作成しています。ただし、作成する前にパラメータを挿入してテーブルを作成すると、「無効なオブジェクト名」が表示されます。私はそれを作成した後に追加する場合、それは正常に動作します。パラメータを持つコマンドを使用するときに一時テーブルの '無効なオブジェクト名'
一時テーブルはセッション全体を持続するはずですので、パラメータがコマンドオブジェクトに追加されたときに重要なことはわかりません。
は失敗します。
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
SqlExceptionがスローされました "無効なオブジェクト名 '#Test'" – mford
はい、SQLインジェクションに対する追加の保護機能が追加されているため、標準です。必要な場合は、ストアドプロシージャを使用して作業を実行したり、コマンドを1つのクエリに結合したりすることができます。 – Trisped