2010-05-27 90 views
2

ExecuteQuery中存在一個奇怪的問題,因爲它在執行參數化查詢時不起作用。LINQ to SQL:ExecuteQuery在執行參數化查詢時不起作用

下返回1個記錄:

db.ExecuteQuery<Member>(@"SELECT * 
          FROM Member 
          INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
          WHERE [aspnet_Users].[UserName] = 'Marina2'"); 

然而,參數化的版本不返回任何結果:

db.ExecuteQuery<Member>(@"SELECT * 
          FROM Member 
          INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
          WHERE [aspnet_Users].[UserName] = '{0}'", "Marina2"); 

我在做什麼錯?

+0

唉,發現問題了。這是圍繞{0}的單引號。但是,我仍然想知道爲什麼會導致問題。 – ajbeaven 2010-05-27 04:46:47

+1

使用單引號會導致問題,因爲如果需要,Linq to SQL正在確定參數的類型並將它們放入。因此不必擔心是否添加它們。 – 2010-05-27 04:49:30

回答

2

嘗試:

db.ExecuteQuery<Member>(@"SELECT * 
    FROM Member 
    INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
    WHERE [aspnet_Users].[UserName] = {0}", "Marina2"); 

通知,帕拉姆沒有引號。 Linq to SQL會自動知道用引號格式化它。

作爲每MSDN

的參數在查詢文本通過使用由Console.WriteLine()和的String.Format()中使用的相同的捲曲數表示。實際上,String.Format()實際上是在您提供的查詢字符串上調用的,用生成的參數名稱(例如@ p0,@ p1 ...,@ p(n))替換花括號參數。

因此,如果您留下的引號內容與[Username] = '@p0'匹配,但您可以運行分析器並捕獲確切的SQL來驗證。