SQL 2005データベースに対してEntity Framework 5、Codeを使用しています。私は、ストアドプロシージャを実行するメソッドを持つリポジトリを持っています。このメソッドは次のようになります。エンティティフレームワーク5 TSQLがSQL 2005呼び出しストアドプロシージャと互換性がありません
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);
}
私が試したもう1つの変種は、
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));
}
これを実行するとエラーが発生します。
System.Data.SqlClient.SqlException(0x80131904): 'SearchPotentialDuplicates'の近くの構文が正しくありません。
私はminiprofilerを使用して生成されたSQLを取得しました。
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
私がコピーしようとしたとSSMSにこれを貼り付け、それが1行で宣言して割り当てるの構文は
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".
がサポートされていないので、これは新しいSQL 2008のもの(http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/12/05/sql-server-2008-t-sql-declare-and-set-in-the-same-statement.aspx)でエラーが発生しましたSQL 2005ではサポートされていません。
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
が問題ありません。だから私の質問は、エンティティのフレームワークは、この精神的な構文を使用して来る方法です?私はいくつかのグーグル・グーグルを行い、人々はProviderManifestTokenについて話しましたが、これは明らかにSQLバージョン間ではなく、SQL CEのような全く異なるプラットフォームに行く場合にのみ必要です。だから私は行方不明の設定ですか、私は別の方法で実行するようにクエリを変更することはできますか?
ありがとうございます!
おそらく、旧式の変数宣言を使用してSQL Server 2005のサポートを提供していた可能性がありますが、私はそれを「精神的な構文」と呼んでいません。私はSQL Server 2008よりも古いものをターゲットにしていなければ、T-SQLで変数を宣言することが誰にとっても好意的な方法であるべきだと思います。 –
hahaはい、間違ってはいけません - それは間違いなくきれいな構文です私は宣言/割り当てを2行に分けなければならないといつも盗んだ!しかし、ターゲットプラットフォームがそれをサポートしている場合は、より良いことです! – Shawson
ADO.NetとSqlCommandはどうですか?このアプローチを使用して、格納されたprocsを呼び出すためのラッパーを作成できます。私はそれが古い方法であり、あなたの質問に答えないと知っていますが、あなたの問題を解決することができます。 –