Tôi đang tạo bảng tạm thời và điền vào nó bằng hai câu lệnh riêng biệt bằng cùng một lệnh và kết nối. Tuy nhiên, tôi nhận được một 'Tên đối tượng không hợp lệ' nếu tôi tạo bảng có tham số được chèn trước khi tạo. Nếu tôi thêm nó sau khi tạo, nó hoạt động tốt.'Tên đối tượng không hợp lệ' cho bảng tạm thời khi sử dụng lệnh với tham số
Bảng tạm thời được cho là sẽ kéo dài toàn bộ phiên, vì vậy tôi không thấy điều gì quan trọng khi tham số được thêm vào đối tượng lệnh.
KHÔNG:
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
}
CÔNG TRÌNH:
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
}
chỉnh sửa:
SQL Profiler sáng tỏ hơn về vấn đề này.
Nếu lệnh có bất kỳ tham số nào, mã cơ bản sẽ phát hành "exec sp_executesql". Nếu các tham số được xóa, mã cơ bản sẽ đưa ra một "TẠO TẠO" trực tiếp hơn. Bảng tạm thời được làm sạch sau sp_executesql, giải thích những gì tôi thấy ở đây.
Với tôi, đây sẽ là một lỗi trong mã SqlCommand (hoặc có liên quan) nhưng kể từ bây giờ tôi có một lời giải thích tôi có thể tiếp tục.
Thông báo lỗi nào bạn nhận được – HatSoft
Đó là một SqlException bị ném, "Tên đối tượng không hợp lệ '#Test'" – mford
Có, đây là tiêu chuẩn vì nó bổ sung một số lượng nhỏ bảo vệ bổ sung chống lại SQL injection. Nếu bạn cần, bạn có thể sử dụng Thủ tục được lưu trữ để thực hiện công việc hoặc kết hợp các lệnh vào một truy vấn. – Trisped