我在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文本中内容含有单引号,这势必会报错。
不知道各位大侠有没什么高见,谢谢了
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文本中内容含有单引号,这势必会报错。
不知道各位大侠有没什么高见,谢谢了
解决方案 »
- 请求帮忙
- 如何实现类似任务管理器中的“切换”功能?
- jpg图片头文件信息读取和修改的问题!!急啊!!
- 要加工的材料长度长短不一,原材料的长度也有若干,200分求最省下料的方案算法.
- 我要去北京出差了,哪位大侠告诉我哪些好玩的地方
- 关于BDE和paradox的问题(马上结婚!)
- [提醒功能]如何盡量準確的實現提醒功能[好好學習]
- MaskEdit的输入格式,很棘手,帮我解决一下,大虾们!~!!!!!!!!!!!!
- 紧急求助````关于用DELPHI用SPCOMM控件进行通信,然后对短消息进行数据汇总
- 写DLL程序要注意几部分?
- 求助
- 有没有书对DELPHI中的基本控件做详细说明的,控件的属性、方法、事件等,电子和非电子的都可以
q.CommandText:='Insert into log(name,edi) values ('''+Edit1.text+''','''+Edit2.text+''')';
若是"我们"为字符串则为
q.CommandText:='Insert into log(name,edi) values ('''+Edit1.text+''','我们')';
str_tmp := ''''; // str_tmp = "'"''''为一个引号"'"即一个字符
建议用Parameters取代拼凑SQL
q.Close;
q.CommandText:='Insert into log(name,edi) values('''''+Edit1.text+''''''+','''+'我们'+''''+')';
这个函数很方便的
showmessage(q.sql[0]);//这样你就看清楚了
这样是有bug的啊,方法不可取
我是说Edit1.text中含有引号,编译时会出错的
以前记得谁在论坛上提到过这个BUG,跟踪了一下,把它找出来了.
ADODB.PAS单元
//-----------------------------------------------------
function VarDataSize(const Value: OleVariant): Integer;
begin
if VarIsNull(Value) then
Result := -1
else if VarIsArray(Value) then
Result := VarArrayHighBound(Value, 1) + 1
else if TVarData(Value).VType = varOleStr then
begin
Result := Length(PWideString(@TVarData(Value).VOleStr)^);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这句的问题,
if Result = 0 then
Result := -1;
end
else
Result := SizeOf(OleVariant);
end;//---------------------------------------------------
也真是的,这个BUG在DELPHI6,DELPHI7都存在.哈欠老大都告诉你问题的所在了,改一下不就可以了?
Result := Length(PAnsiString(@TVarData(Value).VOleStr)^);
如果想完全正确,把WideString转换一下,请教怎么转换?直接修改函数function VarDataSize(const Value: OleVariant): Integer;吗?麻烦写出具体修改代码
我想如果 Edit1.Text 中有引号的话,就算是:
q.Params.ParamByName('c').Value:=Edit1.Text;
q.Params.ParamByName('b').Value:='我们';
这句也应该会有问题吧,我想这不应该是用那种方式的问题,而是我们应该作输入检测。
是的,所以我说是偷懒的做法
a: String;
begin
a :='我';
showmessage(vartostr(Length(WideString(a))));//1
showmessage(vartostr(Length(AnsiString(a))));//2
end;
这个函数为什么要用widestring,开发delphi的应该不是傻子,我想我改成了AnsiString,可能会影响到其他什么地方
to:wychero(高天) ,其实大家说的一点都不离题,你仔细看看就明白了
我测试是通过了,最后还是决定用用Parameters取代拼凑SQL,只是我以前是用的parameters的方法,现在改成拼凑SQL,现在又要改过来,又要花一天的时间了为了减少修改
我想最后大家再讨论一下到底两种写SQL语句方法哪个好,“Parameters” or “拼凑SQL”,相信大家也都碰到这个问题