在使用dapper進行數據查詢時遇到的一個問題,今天進行問題重現做一個記錄,免得忘記以後又犯同樣的錯誤。 自己要實現的是:select * from tablename where id in(1,2)這樣的一個查詢語句。自己以為的寫法應該是這樣的,代碼如下: 運行之後報錯,如下: 找問題原因是就是 ...
在使用dapper進行數據查詢時遇到的一個問題,今天進行問題重現做一個記錄,免得忘記以後又犯同樣的錯誤。
自己要實現的是:select * from tablename where id in(1,2)這樣的一個查詢語句。自己以為的寫法應該是這樣的,代碼如下:
List<CICUser> userList = new List<CICUser>(); using (IDbConnection conn = new SqlConnection(sqlConnectionString)) { int[] idarr = new int[] { 1, 2, 3 }; string sqlCommandText = @"SELECT * FROM CICUser s WHERE s.UserId IN (@UserId) "; userList = conn.Query<CICUser>(sqlCommandText, new { UserId = idarr },null,true,null, CommandType.Text).ToList(); }
運行之後報錯,如下:
找問題原因是就是覺得自己寫的沒有錯,那到底是哪裡出了問題吶,又不想去研究源碼,那就找看咋個拿到生成的sql語句,比對下sql語句,看哪裡有問題。
接下來就根據資料庫的工具,進行跟蹤得到sql語句,如下:
exec sp_executesql N'SELECT * FROM CICUser s WHERE s.UserId IN ((@UserId1,@UserId2,@UserId3)) ',N'@UserId1 int,@UserId2 int,@UserId3 int',@UserId1=1,@UserId2=2,@UserId3=3
執行該sql語句後報““,”附近有語法錯誤。”,看來就是生成的sql語句出了問題,去研究生成的sql語句就容易多了。
原來生成的sql語句這裡多了一對括弧,引起了這個錯誤。
去代碼裡面找這個括弧是哪裡來的,根據括弧的位置嘗試將自己代碼中的括弧去掉,修改自己的代碼為:
List<CICUser> userList = new List<CICUser>(); using (IDbConnection conn = new SqlConnection(sqlConnectionString)) { int[] idarr = new int[] { 1, 2, 3 }; string sqlCommandText = @"SELECT * FROM CICUser s WHERE s.UserId IN @UserId "; userList = conn.Query<CICUser>(sqlCommandText, new { UserId = idarr },null,true,null, CommandType.Text).ToList(); }
再去運行,成功了,跟蹤得到sql語句:
exec sp_executesql N'SELECT * FROM CICUser s WHERE s.UserId IN (@UserId1,@UserId2,@UserId3) ',N'@UserId1 int,@UserId2 int,@UserId3 int',@UserId1=1,@UserId2=2,@UserId3=3
這下正常了,多的括弧沒有了。
原來在做這樣的查詢時,參數不需要用括弧括起來,dapper會給我們自動加上括弧。
@UserId