ado+odbc+sql7(nt4english)客户端向SQL7中INSERT的中文字符都是???,这是为何?(200分)

  • 主题发起人 主题发起人 呆子12
  • 开始时间 开始时间

呆子12

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。
1、我使用的是D6,控件用的是ADO,ADO的connectstring用的是ODBC字符串,
当SELECT一个表时,返回的字符串是中文,如果INSERT这个表,该表的VCHAR字段中文内容
却是????,英文内容正常。
2、如果ADO的connectstring用的是OLE DB 当SELECT某个表时,甚至无法返回全部符合条件的
记录,VCHAR内容根本就没有。
3、现在不明白的是,到底在程序中怎样用才是ODBC,怎样用才是ADO。
请各位大侠指教。
 
请问:
你在sql server7中语言代码页是什么?
 
应该是你的SQL 的编码不对吧!!
 
1、用OLE DB方式,以ADOCONNECTION进行连接就是ADO最好的连接方式。
2、汉字问题可能与MSSQLSERVER的字符集和ODBC有关
3、无法返回全部记录?可能是你将数据源的返回属性改成某一数值了,缺省为-1,就重新放一个数据源试一试。
 
tomol:这好象与sql server7中语言代码页没关系。
有一个朋友用VC做的程序就没有我说的问题,但这位朋友现在联系不上了。

hpretty:怎样设置编码?

mjy97:数据源的返回属性缺省为-1,这个没有设置错。

好象ODBC中的关键字有一个“LANGUAGE=”,和这个有关吗?
我在ADO,ODBC上的基本概念还是不得要领。

 
在微软的站点上找到了相关的说明,还是不知道该怎么解决。
http://www.microsoft.com/CHINA/support/xmlkb/CHS234748.ASP
大家帮我解释一下好吗?
 
嗨,救救我。
 
刚好我也用的是D6和Sql7,更有甚者,我的表的字段也全部是中文的,好象没有多大问题,我和
你的不同之处是,在ADOconnection中用的是sqloledb,而不是ODBC字符串,我的ADOconnectionString为
Provider=SQLOLEDB.1;Password=ss;Persist Security Info=True;User ID=main;Initial Catalog=Test1;Data Source=HZXS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=HZXS
还有我的操作系统为 win2000 server.
 
服务器端是nt4 english
 
在微软网站中有如下说明(http://www.microsoft.com/CHINA/support/xmlkb/CHS234748.ASP
):
请不要在代码页 Y SQL Server 中存储代码页 X 的数据(例如,在代码页 1252 服务器中存储代码页 950 的数据)。 尽管早期版本 SQL Server 中有时也可能出现上述情况,但始终没有支持过它。 对于 1252 SQL Server 而言,除了 1252 的字符外,其它字符均不是有效字符数据。 来自不同代码页的非 Unicode 字符数据将不能正确地排序,而且对于双字节 (DBCS) 数据而言,SQL Server 将不能正确识别字符边界。 这样会导致严重的问题,如下列 Microsoft Knowledge Base 文章所述:
Q155723 INF: SQL Server 对 DBCS 字符串的截断
对于 SQL Server 代码页来说,最佳选择是使用访问该服务器的客户端的代码页。

服务器和客户端可能有不同的代码页,但必须确保启用客户端上的“自动转换”,以便在各种情况下对发送到(或来自)服务器代码页的数据进行正确的转换。

如果服务器必须存储来自多个代码页的数据,则可以将数据存储到 Unicode 列 (NCHAR/NVARCHAR/NTEXT) 中。

如果环境要求将代码页 X 的数据存储到代码页 Y SQL Server 上,则仅有的两种可靠方式是:
将数据存储在二进制列 (BINARY/VARBINARY/IMAGE) 中。 -或者-
编写自己的应用程序,以使用“远程过程调用”(RPC),使所有的 SQL 语句都处理字符数据。 通过 RPC 事件发送的数据不进行此类转换。 请注意,在驱动程序或 DSN 级别上将无法更改所发送的事件的类型。 某个命令究竟是作为语言事件发送还是作为 RPC 事件发送,完全取决于编程人员编写应用程序时所选的 API 和语法。


------------
对于我来说,数据现在已经存在VARCHAR中,不可能存在二进制列中。以使用“远程过程调用”(RPC)是什么意思?怎样做?


我遇到问题与微软所说的一样:
代码:
    CREATE TABLE t1 (c1 int, c2 char(1))
    
    -- 输入人民币字符,使用按键 ALT-0165。
    INSERT INTO t1 VALUES (1, '¥') 
    SELECT c1, c2, ASCII (c2) FROM t1 
        c1          c2               
        ----------- ---- ----------- 
        1           ?    157
        
        (1 row(s) affected)

 
请把服务器操作系统换成Nt4 chinese + sp3以上,然后再试一试,如果你想快速解决问题。
一个最先进的开发工具产生的产品,运行在一个古老的操作系统上,产生了一个工具开发商
和系统开发商都不会去注意的问题,你说如何去解决。你在微软网站找到的说明,也是针对
一种特定环境而言的,所以建议按前说的途径去试一试。
 
zdr:谢谢你,微软的说明我已经明白了,不同的代码页在高版本的ODBC上会有问题。
你说的是有道理的,可是操作系统是无法改的,因为我们在全国已经有很多这样操作系统。
我本想不用BDE的,看来是不好办了。
 
感谢各位!
 

Similar threads

后退
顶部