一个令人困惑的问题,来者有分

houlong 2004-09-20 12:22:27
我在http://community.csdn.net/Expert/topic/3180/3180084.xml?temp=.3381006中提到的一个问题,
zzllabc(抱朴子--清心释累,绝率忘情) 解决了这个问题,但是又有新的问题出现。

原文如下:
**********************************************************************************
q为TClientDataSet,
log表为Sql Server数据库中的一个表,其中name为nvarchar字段,edi为varchar字段
q.Close;
q.CommandText:='Insert into log(name,edi) values(:c,:b)';
q.Params.ParamByName('c').Value:='我们朋友';
q.Params.ParamByName('b').Value:='我们';

try
q.Execute;
showMessage('ok');
finally
q.Close;
end;
这样存入数据库中后,name 字段的内容为“我们”,edi字段的内容为“我”。
如果存入的字符为汉字,就只能存入一半。如果存入的字符为英文字母就能够存完整。
我在oracle数据库中使用没有这个问题。
如果不用三层结构也没有这个问题。
现在不知道是Sql server的问题还是三层结构的问题,在sql server 中怎么解决这个问题?
不知道大家有没碰到过这个问题
**********************************************************************************
解决办法:不用参数,直接写SQL语句,例如:
q.Close;
q.CommandText:='Insert into log(name,edi) values('''+'我们朋友'+''''+','''+'我们'+''''+')';
就可以了。

……………………………………………………………………………………………………………………………

现在的问题是:
q.Close;
q.CommandText:='Insert into log(name,edi) values('''+'Edit1.text+''''+','''+'我们'+''''+')';
在Edit1.text文本中内容含有单引号,这势必会报错。
不知道各位大侠有没什么高见,谢谢了
...全文
304 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxszwk 2004-09-21
  • 打赏
  • 举报
回复
hao 快啊
houlong 2004-09-21
  • 打赏
  • 举报
回复
就这样吧,总算问题可以解决,多谢各位帮忙,特别谢谢lw549(那个孩子他爹)
houlong 2004-09-20
  • 打赏
  • 举报
回复
foxe(火狐) 你好象没明白我的意思
我是说Edit1.text中含有引号,编译时会出错的
houlong 2004-09-20
  • 打赏
  • 举报
回复
lw549(那个孩子他爹)你有没看过http://community.csdn.net/Expert/topic/3180/3180084.xml?temp=.3381006
这样是有bug的啊,方法不可取
lw549 2004-09-20
  • 打赏
  • 举报
回复
q.CommandText:='Insert into log(name,edi) values('''''+Edit1.text+''''''+','''+'我们'+''''+')';
showmessage(q.sql[0]);//这样你就看清楚了
lw549 2004-09-20
  • 打赏
  • 举报
回复
ps:可以用QuotedStr
这个函数很方便的
houlong 2004-09-20
  • 打赏
  • 举报
回复
楼上的你说清楚啊 ,怎么用两个单引号替换一个单引号,你把代码写出来好不好?

你的意思是下面这样吗?这样根本就不行,我测试过了
q.Close;
q.CommandText:='Insert into log(name,edi) values('''''+Edit1.text+''''''+','''+'我们'+''''+')';

lw549 2004-09-20
  • 打赏
  • 举报
回复
楼主这样会出现sql注入漏洞的
建议用Parameters取代拼凑SQL
lfpyh 2004-09-20
  • 打赏
  • 举报
回复
同意楼上的意见,用两个单引号代替一个单引号。
foxe 2004-09-20
  • 打赏
  • 举报
回复
var str_tmp:string;
str_tmp := ''''; // str_tmp = "'"

''''为一个引号"'"即一个字符
foxe 2004-09-20
  • 打赏
  • 举报
回复
语句改为
q.CommandText:='Insert into log(name,edi) values ('''+Edit1.text+''','''+Edit2.text+''')';
若是"我们"为字符串则为
q.CommandText:='Insert into log(name,edi) values ('''+Edit1.text+''','我们')';
xiaoxiao197821 2004-09-20
  • 打赏
  • 举报
回复
对Edit1.text用两个单引号替换一个单引号
lzy6204 2004-09-20
  • 打赏
  • 举报
回复
关注
软件钢琴师 2004-09-20
  • 打赏
  • 举报
回复
学习中
haozhiyuan2003 2004-09-20
  • 打赏
  • 举报
回复
Parameters
Bellamy 2004-09-20
  • 打赏
  • 举报
回复
学习学习!
houlong 2004-09-20
  • 打赏
  • 举报
回复
大家再帮忙看看啊,明天上午结贴,怎么有人说用双引号能解决问题啊,不行的啊
delphi_wo 2004-09-20
  • 打赏
  • 举报
回复
看看
chengchong1979 2004-09-20
  • 打赏
  • 举报
回复
Parameters
lw549 2004-09-20
  • 打赏
  • 举报
回复
拼凑sql,如果你能保证不出现sql注入问题就可以用。
加载更多回复(10)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧