2012-07-31 54 views
12

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.

+0

Thông báo lỗi nào bạn nhận được – HatSoft

+0

Đó là một SqlException bị ném, "Tên đối tượng không hợp lệ '#Test'" – mford

+0

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

Trả lời

0

Tôi nghi ngờ trạng thái thực thi đầu tiên không thành công vì nó khẳng định rằng mỗi thông số phải được sử dụng.

+0

Nó không hoạt động theo cách đó trên bất kỳ tuyên bố nào khác. Đối tượng lệnh có thể có bất kỳ số tham số nào và nó chỉ sử dụng các tham số được sử dụng trong câu lệnh. – mford

+0

Ngoài ra, việc tạo ra không phải là thất bại. Xem chỉnh sửa ở trên để biết thêm thông tin. – mford

7

Sự cố trong thực tế là trong câu lệnh "exec sp_executesql". Khi ADO phát hiện rằng có các tham số được khai báo trong sqlCommand, sử dụng theo mặc định "sp_executesql" thay vì "exec". Nhưng trong trường hợp này, lệnh đầu tiên là tạo ra một bảng TEMPORAL và, như đã biết, các bảng thời gian chỉ hợp lệ bên trong một thủ tục được lưu trữ (sp_executesql) và bị xóa khi thoát. Vì vậy, câu lệnh INSERT thứ hai không còn hợp lệ trong mã ví dụ đầu tiên. Trong bảng thứ hai, bảng thời gian được tạo thành công và câu lệnh chèn được thực hiện bình thường. Hy vọng nó giúp.

Các vấn đề liên quan