在使用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