5

Tôi đang gọi mã bên dưới.C#, sp_executesql và Cú pháp không chính xác

Trên dòng (IDataReader dr = cmd.ExecuteReader()) sql barfs với cú pháp không đúng gần 'CompanyUpdate'.

using (SqlCommand cmd = new SqlCommand("CompanyUpdate")) 
     { 
      cmd.Parameters.Add("@CompanyID",SqlDbType.Int); 
      cmd.Parameters.Add("@Description",SqlDbType.VarChar,50); 
      cmd.Parameters["@CompanyID"].Value = companyid; 
      cmd.Parameters["@Description"].Value = description; 

      SqlConnection cn = new SqlConnection("Data Source=[datasource];Initial Catalog=dotNext;User ID=[user];Password=[password];Pooling=True;Application Name=dotNext"); 
      cn.Open(); 
      cmd.Connection = cn; 
      using (IDataReader dr = cmd.ExecuteReader()) 
      { 
       if (dr.Read()) 
       { 
        this.CompanyID = dr.GetInt32(0); 
       } 
      } 
     } 

tôi đã có một cái nhìn tại SqlProfiler và nhận thấy như sau:

exec sp_executesql N'CompanyUpdate',N'@CompanyID int,@Description varchar(50)',@CompanyID=56,@Description='APC' 

của gói lệnh wit tôi một sp_executesql. Tất cả các lệnh sql khác của tôi chỉ được thực thi mà không có vấn đề gì.

Vì vậy, câu hỏi của tôi là hai lần: 1. Tại sao lại sử dụng sp_executesql? 2. Tôi đang làm gì sai?

chi tiết: sql2005, C#, vs2005

Trả lời

11

Tôi nhận thấy rằng bạn đã không đặt CommandType để StoredProcedure ... Tôi không biết nếu đó là nguyên nhân của vấn đề của bạn hay không:

cmd.CommandType = CommandType.StoredProcedure; 

Tôi đã làm điều này rất nhiều lần mà bản thân mình không thể đếm được.

Mẹo để kích hoạt bộ nhớ của bạn khi điều này ném ngoại lệ thời gian tiếp theo:

Có SQL Query Profiler mở trong khi bạn đang chạy ứng dụng của bạn. Khi mỗi lệnh thực hiện, nó cho thấy SQL được tạo và chạy ở phía máy chủ. Nếu SQL được tạo bắt đầu bằng sp_executesql theo sau truy vấn của bạn thì truy vấn đó sẽ được chạy dưới dạng truy vấn thông thường - tức là cmd.CommandType = CommandType.Text, nếu bắt đầu bằng exec, rất có thể nó được chạy dưới dạng proc được lưu trữ. Đảm bảo rằng bạn đang nhận đúng SQL được tạo cho loại truy vấn bạn đang cố gắng chạy.

+1

Điều đó thật khó chịu !! Cảm ơn bạn! –

+0

lol - đôi khi nó chỉ mất một bộ khác nhau của mắt ... – BenAlabaster

+0

Argh, cảm ơn. Tại sao trên trái đất sẽ không nó lỗi ra nếu bạn thêm các tham số vào một SqlCommand và không đặt nó vào StoredProcedure ... – jcollum

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