2012-02-08 19 views
7

Đoạn code dưới đây tạo ra các lỗi sau:Biến không tham số SQL với MySql Connector/Net và Dapper?

Parameter '@ID' must be defined.

Tôi có làm gì sai hay không là nó có thể sử dụng các biến trong truy vấn SQL với MySQL mà không phải là thông số Dapper?

Trong ví dụ này, @Slug là thông số Dapper, nhưng @ID thì không. Tôi đang sử dụng MySQL vì vậy tôi không cần phải DEFINE @ID - nó được định nghĩa trong lần sử dụng đầu tiên.

var sql = @"SELECT @ID := id, slug, Title, Text FROM posts WHERE slug = @Slug; SELECT * FROM comments where postid = @ID;"; 
using (var connection = GetOpenConnection()) 
{ 
    var posts = connection.QueryMultiple(sql, new { Slug = slug }) 
     .Map<Post, Comment, int> 
     (
     Post => Post.ID, 
     Comment => Comment.ID, 
     (post, comments) => { post.Comments = comments; } 
     ); 
    return posts.FirstOrDefault(); 
} 

Trả lời

18

Nó chỉ ra "MySql Connector/Net" tạo ra lỗi.

Để sử dụng Biến SQL phi tham số với MySql Connector/Net, bạn phải thêm các tùy chọn sau đây để chuỗi kết nối của bạn:

  • "Cho phép biến tài = True"

Xem: http://blog.tjitjing.com/index.php/2009/05/mysqldatamysqlclientmysqlexception-parameter-id-must-be-defined.html

+0

Cảm ơn, tôi vừa gặp lỗi tương tự trước đây. –

+0

Wow, điều đó thực sự đã giúp tôi. Cảm ơn nhiều! – harriyott

+0

Cảm ơn rất nhiều blog rất hữu ích !!! – Rida

0

Bạn cần phải khai báo biến ID trong mã sql của bạn:

var sql = @"DECLARE @ID Int; 
      SELECT @ID := id, slug, Title, Text FROM posts WHERE slug = @Slug; 
      SELECT * FROM comments where postid = @ID;"; 
+1

Tôi thực sự đang sử dụng MySQL mà tôi cho rằng tự động xác định loại của nó khi được gán giá trị lần đầu tiên. Nếu tôi cắt dán dán truy vấn SQL ở trên vào MySQL Workbench và chạy nó, nó chạy tốt. Vì vậy, tôi không nghĩ rằng đó là lỗi đến từ. –

2

Tôi không nghĩ rằng đây là một vấn đề hoạt bát; dapper chỉ lấy SQL mà bạn cung cấp và thêm bất kỳ thành viên nào từ đối tượng "args" mà nó rõ ràng là thấy trong SQL.

Cách để điều tra điều này là thử chạy cùng với DbCommand trực tiếp - tôi đoán là nó sẽ không giống nhau. Sẽ có một số thủ thuật SQL để làm cho nó hoạt động, nhưng đó là giữa bạn và MySQL. Tất cả đoan trang đang làm là:

  • tạo ra một lệnh với sql của bạn
  • xác định một tham số gọi là "slug" và thiết lập giá trị
  • cách gọi các sql và phân tích các kết quả

nó doesn 't chạm vào "ID" và chính xác là nó không làm như vậy.

+1

Bạn đã chính xác - Tôi đã thử nghiệm nó bằng DbCommand và gặp lỗi tương tự. –

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