使用dapper遇到的问题及解决方法

在使用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
相关文章
相关标签/搜索