Re: [問題] sqlparameter 問題
看板C_Sharp (C#)作者CloudyWing (孤單ㄉ翼)時間9年前發表 (2016/07/21 19:24), 9年前編輯推噓1(1推 0噓 2→)留言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
07/22 09:28, 2F
→
07/22 13:38, , 3F
07/22 13:38, 3F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章