Tôi đang sử dụng Entity Framework 5, Mã đầu tiên chống lại cơ sở dữ liệu SQL 2005. Tôi có một kho lưu trữ, với một phương thức thực hiện một thủ tục lưu sẵn- Phương thức này trông như thế này;Khuôn khổ thực thể 5 TSQL không tương thích với SQL 2005 gọi thủ tục được lưu trữ
public IEnumerable<PossibleDuplicateCustomer> GetPossibleDuplicates(Customer customer)
{
return DbContext.Database.SqlQuery<PossibleDuplicateCustomer>(
"EXEC SearchPotentialDuplicates @CustomerId = {0}, @FirstName = {1}, @LastName = {2}, @dob = {3}",
customer.CustomerId,
customer.CustomerFirstName,
customer.CustomerLastName,
customer.Dob);
}
Một biến thể khác mà tôi đã thử là;
public IEnumerable<PossibleDuplicateCustomer> GetPossibleDuplicates(Customer customer)
{
return DbContext.Database.SqlQuery<PossibleDuplicateCustomer>(
"SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob",
new SqlParameter("CustomerId", customer.CustomerId),
new SqlParameter("FirstName", customer.CustomerFirstName),
new SqlParameter("LastName", customer.CustomerLastName),
new SqlParameter("dob", customer.Dob));
}
Khi tôi thực hiện điều này, tôi nhận được lỗi;
System.Data.SqlClient.SqlException (0x80131904): Cú pháp không đúng gần 'SearchPotentialDuplicates'.
Vì vậy, tôi đã lấy sql được tạo bằng miniprofiler- đã cho tôi;
DECLARE @p0 int = 12644,
@p1 nvarchar(4) = N'adam',
@p2 nvarchar(3) = N'ant',
@p3 datetime = '1951-11-01T00:00:00'
EXEC SearchPotentialDuplicates @CustomerId = @p0, @FirstName = @p1, @LastName = @p2, @dob = @p3
tôi đã cố gắng sao chép và dán này vào SSMS và nó đã cho một lỗi vì cú pháp khai báo và gán trong một dòng không được hỗ trợ
Msg 139, Level 15, State 1, Line 0
Cannot assign a default value to a local variable.
Msg 137, Level 15, State 2, Line 6
Must declare the scalar variable "@p0".
Đây là một mới sql 2008 điều (http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/12/05/sql-server-2008-t-sql-declare-and-set-in-the-same-statement.aspx) và không hỗ trợ trong SQL 2005- Thay đổi truy vấn thành;
DECLARE @CustomerId int ,
@FirstName nvarchar(25),
@LastName nvarchar(25) ,
@dob datetime
SET @CustomerId = 12645
SET @FirstName = N'adam'
SET @LastName = N'ant'
SET @dob = '1951-11-01T00:00:00'
exec SearchPotentialDuplicates @CustomerId, @FirstName, @LastName, @dob
hoạt động tốt! SO câu hỏi của tôi là làm thế nào đến khuôn khổ thực thể đang sử dụng cú pháp tinh thần này? Tôi đã thực hiện một số googling và mọi người nói về ProviderManifestToken nhưng điều này dường như chỉ cần thiết nếu đi đến một nền tảng hoàn toàn khác như ce sql, không phải giữa các phiên bản sql. Vì vậy, có một thiết lập tôi đang mất tích, hoặc tôi có thể thay đổi các truy vấn để buộc nó để thực hiện theo một cách khác nhau?
Cảm ơn tất cả!
Có thể cho rằng, họ có thể đã cung cấp hỗ trợ cho SQL Server 2005 bằng cách sử dụng khai báo biến kiểu cũ, nhưng tôi sẽ không gọi đó là "cú pháp tinh thần"; Tôi nghĩ rằng nó nên được mọi người ưa thích cách tuyên bố một biến trong T-SQL, miễn là bạn không nhắm mục tiêu bất cứ điều gì cũ hơn SQL Server 2008. –
haha có, không làm cho tôi sai-nó chắc chắn là cú pháp sạch hơn-Đó là luôn luôn bugged tôi phải chia tờ khai/phân công trên hai dòng! Nhưng nó chỉ tốt hơn nếu nền tảng đích hỗ trợ nó! – Shawson
Còn ADO.Net và SqlCommand thì sao? Bạn có thể viết một wrapper để gọi procs được lưu trữ bằng cách sử dụng phương pháp này. Tôi biết đó là phương pháp cũ và nó không trả lời câu hỏi của bạn, nhưng nó có thể giải quyết vấn đề của bạn. –