为什么ADO 参数用insert into ...select 语句时不能传递"√"?是bug吗?

mmfeng 2012-12-12 05:20:54
用的是c++builder2010,用sql2000。
我把数据插入另一个表时,用insert into ...select 语句,当用ado参数时,发现其中一个字段是"√" 字符的没有插入,但改为其他字符却又正常,但如果不用参数的话,直接插入也没有问题。还有如果是用insert into 直接插入也没有问题,如下面测试:

TADOQuery * pado=new TADOQuery(NULL);
pado->Connection=this->ADOConnection1 ;
//建立两个表测试:
pado->SQL->Add("if OBJECT_ID('A') is not null drop table A;\
if OBJECT_ID('B') is not null drop table B;\
create table A ( a1 INT PRIMARY KEY, a2 varchar(2));\
CREATE TABLE B ( b1 INT PRIMARY KEY, b2 varchar(2));\
INSERT INTO A SELECT 1,'<' UNION ALL SELECT 2,'√' union all SELECT 3,'>'");
pado->ExecSQL();
pado->Close();
pado->SQL->Clear();
pado->SQL->Add("insert into B (b1,b2) select a1,:a2 from A where a1=2");
pado->Parameters->ParamByName("a2")->Value="√";
pado->ExecSQL();

这样用的话,数据库中 b2的字段是空白的,但也不是NULL。


是什么问题呢?
...全文
409 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝龙哥 2012-12-24
  • 打赏
  • 举报
回复
引用 13 楼 mmfeng 的回复:
那用参数输入的话怎么改? 这样改的话: pado->SQL->Add("insert into B (b1,b2) select a1,N':a2' from A where a1=2"); pado->Parameters->ParamByName("a2")->Value="√"; 报错,这样: pado->SQL->Add("insert into B (b1,b2) select……
晕啊,在SQL语句里面直接写数据时用N,参数法用老妖的那个,N':a2' 的:a2是参数法而不是要查询或写入的字符串,都不加N
xjq2003 2012-12-23
  • 打赏
  • 举报
回复
引用 7 楼 ccrun 的回复:
这样试试: pado->Parameters->ParamByName("a2")->Value = WideString("√");
这个能解决问题就可以了
mmfeng 2012-12-21
  • 打赏
  • 举报
回复
那用参数输入的话怎么改? 这样改的话: pado->SQL->Add("insert into B (b1,b2) select a1,N':a2' from A where a1=2"); pado->Parameters->ParamByName("a2")->Value="√"; 报错,这样: pado->SQL->Add("insert into B (b1,b2) select a1,:a2 from A where a1=2"); pado->Parameters->ParamByName("a2")->Value="N'√'"; 也是报错。
宝龙哥 2012-12-14
  • 打赏
  • 举报
回复
N要和'紧密相连
宝龙哥 2012-12-14
  • 打赏
  • 举报
回复
引用 4 楼 mmfeng 的回复:
很不明白,为什么其他字符可以,就这个不行,用插入insert table... values 语句也可以正常,有没有人遇到这种情况?
因为你的">"等字符都不是UNICODE字符,对于UNICODE字符你首先保证数据库字段类型正确,然后:N''就可以了,用老妖的参数法也行,但有局限性 这个问题和数据库预设的代码页有关,如果在插入字符串时没有在“'---'”前面使用大写的N的话UNICODE字符字符在存入数据库时会首先按照数据库默认的代码页进行转换变成不能显示的字符或乱码了
huangjing0987 2012-12-14
  • 打赏
  • 举报
回复
mmfeng 2012-12-13
  • 打赏
  • 举报
回复
引用 7 楼 ccrun 的回复:
这样试试: pado->Parameters->ParamByName("a2")->Value = WideString("√");
果然正确了,原来是宽字节问题啊,谢谢。
mmfeng 2012-12-13
  • 打赏
  • 举报
回复
其实用其他方法是可以插入的,就是这个insert ....select 语句不行,用insert table... values 没问题,参数为勾也是正常的。
ccrun.com 2012-12-13
  • 打赏
  • 举报
回复
这样试试: pado->Parameters->ParamByName("a2")->Value = WideString("√");
mmfeng 2012-12-13
  • 打赏
  • 举报
回复
引用 5 楼 warrially 的回复:
这个是 UNICODE 的字符吧? 你是 nchar? 还是 char char 肯定不行的 nchar 可以改成 N'..'
怎么才能知道是不是UNICODE字符? 这个是varchar,2个字符,在上面测试的语句中创建表有: if OBJECT_ID('A') is not null drop table A ; if OBJECT_ID('B') is not null drop table B ; create table A ( a1 INT PRIMARY KEY, a2 varchar(2)); CREATE TABLE B ( b1 INT PRIMARY KEY, b2 varchar(2));
爱蹄子的羊头 2012-12-13
  • 打赏
  • 举报
回复
这个是 UNICODE 的字符吧? 你是 nchar? 还是 char char 肯定不行的 nchar 可以改成 N'..'
mmfeng 2012-12-13
  • 打赏
  • 举报
回复
很不明白,为什么其他字符可以,就这个不行,用插入insert table... values 语句也可以正常,有没有人遇到这种情况?
宝龙哥 2012-12-12
  • 打赏
  • 举报
回复
在插入语句里面这样用=>N'√'试试 就是在字符串外面加一个大写的N,SQL语句有这样的规定
缘中人 2012-12-12
  • 打赏
  • 举报
回复
修改写法吧,用个这个ascii码也行
mmfeng 2012-12-12
  • 打赏
  • 举报
回复
便如果把pado->Parameters->ParamByName("a2")->Value="√"; 改为: pado->Parameters->ParamByName("a2")->Value=">"; 是正常的。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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