作者CloudyWing (孤单ㄉ翼)
看板C_Sharp
标题Re: [问题] sqlparameter 问题
时间Fri Jul 22 03:24:25 2016
吃掉...
: 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://webptt.com/cn.aspx?n=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://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1469129071.A.C0B.html
※ 编辑: CloudyWing (114.35.46.112), 07/22/2016 03:52:14
1F:推 aeolus0829: 喔喔 原来如此 知道原因安心多了 谢谢 07/22 08:18
2F:→ lucky1lk: 备注: oracle: " like '%' || :input || '%' "; 即可 07/22 09:28
3F:→ aeolus0829: 先记下来了. 难保不会遇到 oracle, 谢谢! 07/22 13:38