问题已搞定,感谢<font color="red"><strong>barton 左轻候</strong></font

  • 主题发起人 主题发起人 zl
  • 开始时间 开始时间
Z

zl

Unregistered / Unconfirmed
GUEST, unregistred user!
问题已搞定,感谢<font color="red"><strong>barton 左轻候</strong></font></marquee>--- (关于InterBase的汉字问题) (50分)<br />当我向表中的一个varchar型字段insert记录时,内容如果是英文或数字刚正常,可
如果是汉字,则总是出现以下的错误提示:
+-----------------------------+
| arithmetic exception,numeric overflow, orstring truncation |
| Cannot transliterate character between character sets. |
+-----------------------------+
为什么不能为varchar型字段的内容付“汉字”。
同是这个表,用IBConsole却可可向表中填汉字,WHY???

 
那就这样:
tblDbase.first;
while not tblDbase.eof do
begin
ibtable.append;
for i := 0 to tblDbase.Fields.count - 1 do
ibtable.fields.value := tblDbase.fields.value;
ibtable.post;
tblDbase.next;
end;

自己加错误处理,呵呵...
 
老弟,不行呀,下面是出错信息。
arithmetic exception,numeric overflow, orstring truncation
Cannot transliterate character between character sets.
 
注:两 表结构相同。
 
不会吧?
那就把那个FOR改了,按你自己表一个一个AsString/AsInteger写就是了
 
先要分析这两个表的结构,dbf不是关系数据库,如果只是简单复制,那你不必改数据库呀,
用dbf得了。halcn访问dbf我不懂,也许和一般的query相同吧。你可以这样写:
ibsql.sql.text := 'insert into :tablename values (:field1,:field2...)';
tblDbase.first;
while not tblDbase.eof do
begin
ibsql.params[0].asInteger := tblDbase.fields[0].AsInteger;
ibsql.params[1].asString := tblDBase.fields[1].asString;
//...一个字段一个字段地赋值
ibsql.execquery;
ibsql.close
tblDbase.next;
end;
 
漏了在ibsql.execquery前加ibsql.prepare;
 
很简单呀,用DELPHI自带的DATADEMP工具可以在INTERBASE中生成一个和DBF一样的表。
然后根据需要再把他倒到另一个表中。用DJ的方法要注意数字类型,最好把数字类型全部
设为DOUBLE。
 
barton 老弟:
当我向表中的一个varchar型字段insert记录时,内容如果是英文或数字刚正常,可
如果是汉字,则总是出现以下的错误提示:
+-----------------------------+
| arithmetic exception,numeric overflow, orstring truncation |
| Cannot transliterate character between character sets. |
+-----------------------------+
为什么不能为varchar型字段的内容付“汉字”。
同是这个表,用IBConsole却可可向表中填汉字,WHY???

 
是你自己错了,varchar型字段的内容可以付“汉字”的。
我用的好好的。
 
我倒
我才学两天IB就成高手了?:-(
你那个数据库的character sets怎么设的?
是None或GB2312吗?
 
正巧,刚才我也碰上这个错误了
引起的原因是create database时设置的character sets
和程序中IBDatabase的character sets不一致
设为一致就搞定了
不知对你有帮助没
 
左大侠:
>>引起的原因是create database时设置的character sets
>>和程序中IBDatabase的character sets不一致

同一个数据库中的同一个表为什么在IBConsole中可以填汉字呢?而我的程序不行?

 
咦,IBConsole里居然没有设置连接database的character sets这一项
但它在create database的时候倒是有的
那你可以到www.ibaccess.com下一个ibaccess试试
在open一个database的时候,将它的character sets设为与create database时候的不一致
那么insert的时候马上就可以看到这条错误
但我不能保证你的问题确定是这个引起的
另外你也可查看一下table的metadata,看看该字段的描述是
VARCHAR(XXX)
还是
VARCHAR(XXX) character sets XXX

BTW,IBConsole的功能太弱,建议你使用ibaccess或者QuickDesk来管理Interbase
可到www.51delphi.com和http://fscyr.myetang.com看看

 
左大侠:
我也有IBaccess。
以下是我的建库SQL语句(直接Ctrl+V过来的)
CREATE TABLE "MZ_BACKUP"
(
"BACKNAME" VARCHAR(12) CHARACTER SET GB_2312,
"FILETYPE" VARCHAR(3) CHARACTER SET GB_2312,
"BACKMESS" VARCHAR(20) CHARACTER SET GB_2312
);
 
问题肯定不在你建立数据库上。我一直用,从未遇到类似问题。
你先说是用什么作的数据插入。
 
那就对啦
我也尝试过把
VARCHAR(XXX)
还是
VARCHAR(XXX) character sets GB_2312
马上就会报这个错误
不要那个尾巴就没事了
不知IB的国际化支持怎么搞的
 
那你说IBConsole为什么又行。你用IBSQL没错。
 
我也不晓得,让zl试试看:-)
 
barton老大,左大侠:
我用的是TIBSQL来执行SQL的,因为它最直接。
语句如下:(表结构是上面SQL语名产生的ID:515548)
ib_sql.sql.text := 'insert into mz_backup (backname) values (:aa)';
ib_sql.Params[0].AsString:='barton左大侠';
ib_sql.Prepare;
ib_sql.execquery;
ib_sql.close;
然后就是上面的错误信息。而如果我把上面的‘左大侠'三个汉字去掉的话,就OK了。
????????????
 
后退
顶部