在使用dapper進行數據查詢時遇到的一個問題,今天進行問題重現作一個記錄,省得忘記之後又犯一樣的錯誤。sql
本身要實現的是: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(); }
運行以後報錯,以下:app
找問題緣由是就是以爲本身寫的沒有錯,那究竟是哪裏出了問題吶,又不想去研究源碼,那就找看咋個拿到生成的sql語句,比對下sql語句,看哪裏有問題。工具
接下來就根據數據庫的工具,進行跟蹤獲得sql語句,以下:spa
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語句就容易多了。code
原來生成的sql語句這裏多了一對括號,引發了這個錯誤。blog
去代碼裏面找這個括號是哪裏來的,根據括號的位置嘗試將本身代碼中的括號去掉,修改本身的代碼爲:源碼
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語句:string
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
這下正常了,多的括號沒有了。io
原來在作這樣的查詢時,參數不須要用括號括起來,dapper會給咱們自動加上括號。
@UserId