2011-11-22 23 views
20

(Mã này được sử dụng Dapper Dot Net trong C#)tham số động Dapper ném một SQLException "phải xác định biến vô hướng" khi không sử dụng đối tượng ẩn danh

Mã này hoạt động:

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; 
connection_.Execute(command, new { Name = "myname", Priority = 10 }); 

Mã này ném một SqlException:

class MyAccount 
{ 
    public string Name; 
    public int Priority; 
} 

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; 
var acct = new MyAccount { Name = "helloworld", Priority = 10 }; 
connection_.Execute(command, acct); 

System.Data.SqlClient.SqlException: Phải khai báo các biến vô hướng "@Priority".

Tại sao?

Trả lời

27

Thực hiện mô hình của bạn với tài sản, không lĩnh vực:

class MyAccount 
{ 
    public string Name { get; set; } 
    public int Priority { get; set; } 
} 

Dapper nhìn vào các thuộc tính của đối tượng để có được các thông số, bỏ qua lĩnh vực. Các loại ẩn danh hoạt động vì chúng là implemented with properties.

+1

Thú vị; chúng tôi xem xét các lĩnh vực cho việc thực hiện, vì vậy có thể nó là một chút không nhất quán mà chúng tôi không cho phép sau đó (công chúng, ít nhất), cho parameterisation. Meh ... Bạn đang phải mặc dù - tầm thường để giải quyết bằng cách sử dụng đúng tài sản. –

+2

@MarcGravell dường như vi phạm nguyên tắc ít ngạc nhiên nhất. Tôi muốn bỏ phiếu để thay đổi hành vi hoặc ghi lại yêu cầu. –

1

Tôi cũng gặp vấn đề tương tự với loại dữ liệu. Khi thực hiện một truy vấn với đối tượng động có một thuộc tính DateTime, ngoại lệ: Thành viên CreatedDate của kiểu System.Object không thể được sử dụng như một giá trị tham số.

Nó hoạt động khi tôi sử dụng POCO thay vì động sau này.

1

Mặc dù câu trả lời này không liên quan đến vấn đề của người đăng, tôi đã gặp sự cố tương tự với một bản sửa lỗi khác mà tôi sẽ chia sẻ tại đây.

Tôi đã sai quy định danh sách tham số như một new []{ ... }:

var name = "myName"; 
var priority = 1; 
var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; 
connection_.Execute(command, new []{ priority, name }); 

thả [] giải quyết vấn đề của tôi:

connection_.Execute(command, new { priority, name });