Dapper sql in


應用場景:

使用 sql的 Case When Then 批量更新某張表,底層數據庫用到了Dapper

代碼示例:

public int UpdateClientReceivedResult(Dictionary<string, string> dict)
        {
            var dynamicSqlParam = new DynamicParameters();
            var sbSet = new StringBuilder(256);
            sbSet.Append(" (CASE SmsFlowID ");
            int idx = 0;
            foreach (var kv in dict)
            {
                sbSet.Append(string.Format(" WHEN @SmsFlowID{0} THEN @ClientReceivedResult{0} ", idx));
                dynamicSqlParam.Add(string.Format("SmsFlowID{0}", idx), kv.Key, null, null, null);
                dynamicSqlParam.Add(string.Format("ClientReceivedResult{0}", idx), kv.Value, null, null, null);
                idx += 1;
            }
            sbSet.Append(" ELSE ClientReceivedResult END) ");

            var sbWhere = new StringBuilder(256);
            sbWhere.Append(" AND SmsFlowID in @ids ");
            dynamicSqlParam.Add("ids", dict.Keys.ToArray(), null, null, null);

            string sql = string.Format("UPDATE [SmsSendResult] SET  [ClientReceivedResult]={0} WHERE 1=1 {1}", sbSet,
                sbWhere);
            int affectNum = -1;
            using (var conn = new SqlConnection(SmsDBConnString))
            {
                affectNum = conn.Execute(sql, dynamicSqlParam);
            }
            return affectNum;
        }

最終生成的sql:

UPDATE [SmsSendResult] SET  [ClientReceivedResult]= (CASE SmsFlowID  WHEN @SmsFlowID0 THEN @ClientReceivedResult0  WHEN @SmsFlowID1 THEN @ClientReceivedResult1  WHEN @SmsFlowID2 THEN @ClientReceivedResult2  WHEN @SmsFlowID3 THEN @ClientReceivedResult3  WHEN @SmsFlowID4 THEN @ClientReceivedResult4  WHEN @SmsFlowID5 THEN @ClientReceivedResult5  WHEN @SmsFlowID6 THEN @ClientReceivedResult6  WHEN @SmsFlowID7 THEN @ClientReceivedResult7  ELSE ClientReceivedResult END)  WHERE 1=1  AND SmsFlowID in @SmsFlowID

代碼說明:
這個方法的作用是,根據傳進來的Dict<SmsFlowID,ClientReceivedResult>批量更新SmsSendResult對應的值,為了限定更新的條數,需要用到where in操作,in后面的參數名必須要注意一下,盡量不和別的參數名字有重復,我之前sbWhere是這么寫的:

var sbWhere = new StringBuilder(256);
sbWhere.Append(" AND SmsFlowID in @SmsFlowID ");
dynamicSqlParam.Add("SmsFlowID", dict.Keys.ToArray(), null, null, null);

結果運行報異常:說什么已存在相同參數名SmsFlowID1。。。找了半天,原來是in的參數名字的問題!Dapper對於 where col in @arg 會將動態參數的數組類型的參數自動轉化為 where col in (@arg1,@arg2....),這樣就重名了,所以找了半天原因,原來是這么個回事,修改后程序運行正常


免責聲明!

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



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