Re: [問題] sqlparameter 問題

看板C_Sharp (C#)作者 (孤單ㄉ翼)時間9年前發表 (2016/07/21 19:24), 9年前編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/2 (看更多)
吃掉... : if (!string.IsNullOrEmpty(txtVendor.Text)) : { : //cmd.CommandText = strSql + "WHERE NAME1 LIKE N'%"+ : txtVendor.Text.Trim() + "%'"; // 這樣寫可以 : : cmd.CommandText = strSql + "WHERE NAME1 LIKE '%@prName%'"; : : cmd.Parameters.Add("@prName", SqlDbType.VarChar).Value = : txtVendor.Text.Trim(); // 這樣寫不行 : cmd.Parameters.AddWithValue("@prName", txtVendor.Text.Trim()); : //這樣寫一樣不行 : : } 問題在於SqlCommand看到你把%@prName%寫在單引號裡面 所以認定他是個字串而不是SQL變數 如果今天你要使用變數,正確的寫法是 "'%' + @prName + '%'" 這樣SQL執行時,會將@prName帶入SqlParameter的值 出現的字串才會等同於"'%" + txtVendor.Text.Trim() + "%'" 吃掉... : 我用這一段把 cmd 組裝的 sql : foreach (SqlParameter p in cmd.Parameters) : { : cmd.CommandText = cmd.CommandText.Replace(p.ParameterName, : p.Value.ToString()); : } : Response.Write(cmd.CommandText); : : 還原如下 : : SELECT CAST(LIFNR AS INT) as 供應商編號, NAME1 as 名稱, ORT01 as 城市, PSTLZ : as 郵遞區號, STRAS as 地址, TELF1 as 聯絡人, TELFX as 電話, ADR6.SMTP_ADDR as : eMail from prd.LFA1 left join prd.ADR6 on LFA1.ADRNR = ADR6.ADDRNUMBER WHERE : NAME1 LIKE N'%泉%' : : 在 sql server management studio 中確定語法是對的... 但是搞不懂為什麼在 c# : 組裝時就出問題 @ @ : : : 爬文本版 #1Mswq2pb 好像症狀很像? : 你弄錯SqlCommand它針對CommandText裡的字串處理方式了 Oracle的我不確定 但Sql Server這邊的Parameter,它不是使用replace CommandText的@字眼 它的實際原理其實是SQL的變數宣告 Sql Server它的變數就是@開頭 除了一些可能的跳脫外,它不會去對CommandText的@字眼做異動 只是最後再依Parameter內容輸出SQL變數宣告的字串 用C#的語法來比喻你的作法就類似原本你應該寫成 String prName = txtVendor.Text.Trim(); String sql = "SELECT * FROM 資料表 WHERE 欄位 = '" + prName + "'"; 結果你寫成 String sql = "SELECT * FROM 資料表 WHERE 欄位 = 'prName'"; 然後你把SQL給print出來不是寫Response.Write(sql); 而是寫成Response.Write(sql.replace("prName", prName)); 所以結果覺得SQL是正確的 : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.20.129.1 : ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1469005893.A.44E.html : ※ 編輯: aeolus0829 (211.20.129.1), 07/20/2016 17:14:32 : 推 CrazyAngel: http://goo.gl/QkvCO8 07/20 20:23 : → lucky1lk: " WHERE NAME1 LIKE '%'"+"@prName"+"'%' " 這樣? 07/20 20:37 : 推 J002: like @prName, 然後addWithValue(@prName, "%"+str+"%") 07/20 20:55 : → aeolus0829: 實測上述的方法都可以用~ 大感謝 07/21 08:45 : → aeolus0829: 搞不懂 like 的部份為什麼要特殊處理... = =a 07/21 08:46 結論:不是LIKE要特別處理,而是你把SQL字串和SQL變數弄混了 -- 人有病,自知否? 知而不治,知之何用? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.46.112 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1469129071.A.C0B.html ※ 編輯: CloudyWing (114.35.46.112), 07/22/2016 03:52:14

07/22 08:18, , 1F
喔喔 原來如此 知道原因安心多了 謝謝
07/22 08:18, 1F

07/22 09:28, , 2F
備註: oracle: " like '%' || :input || '%' "; 即可
07/22 09:28, 2F

07/22 13:38, , 3F
先記下來了. 難保不會遇到 oracle, 謝謝!
07/22 13:38, 3F
文章代碼(AID): #1NaI5lmB (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #1NaI5lmB (C_Sharp)