使用dapper遇到的問題及解決方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM