gpt4 book ai didi

c++ - ODBC SQL Server Unicode 错误?

转载 作者:行者123 更新时间:2023-11-28 06:32:30 25 4
gpt4 key购买 nike

背景:

我们有一个应用程序使用 ODBC API 与 Access 和 SQL Server 交互(动态地,取决于用户的配置)。

我发现了一个错误,它可能存在于 ODBC SQL 驱动程序中,或者可能是我们创建的 ODBC DSN 的错误配置问题,或者可能是我们代码中的错误。

当文档被编辑和保存时,我们查询数据库,看这个文件在数据库中是否有相应的记录——如果有,我们用文档中的更新数据更新记录;如果没有,我们将插入以为其创建必要的记录。

我们使用文件名作为表中的唯一主键,这在正常情况下工作正常。错误在于,如果文件名包含当前 ANSI 代码页之外的字符,则选择指示没有匹配项:

   SQL:  SELECT * FROM "My Designs" WHERE "PATHNAME" = '\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo'   [# matches = 0]

但是,当尝试插入时,我们会遇到唯一键冲突(当然)- 因为已经有一个具有该文件名的记录。

Database error: Violation of PRIMARY KEY constraint 'PK__My Desig__1B3D5B4BF643706B'. Cannot insert duplicate key in object 'dbo.My Designs'. The duplicate key value is (\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo).
The statement has been terminated.

我仔细检查了代码,没有发现任何错误。 :(

正在生成的 SQL 语句生成文件名的正确 Unicode 输出。我们的应用程序是为 Unicode 编译的。该列在 ODBC 中是 SQL_WVARCHAR

我已经尝试将 AutoTranslate=no 添加到 DSN 配置字符串,但这似乎没有效果。

我试过从 ODBC 控制面板记录数据库连接。遗憾的是,该接口(interface)会生成一个 ANSI 日志文件 - 因此我无法使用该工具验证 UNICODE/ANSI 问题。

问题:

  • 有没有我可以使用的工具来验证这些声明是否正在执行由 ODBC 驱动程序正确创建/发布到 SQL Server数据库?
  • 有没有更好的方法来使用 ODBC,使驱动程序不会被 SELECT 查询和 INSERT 请求中的简单 UNICODE 字符串混淆?
  • 关于如何解决这个问题的任何其他想法(除了更换我们的技术)

最佳答案

在 select 语句中,确保用 N 将 where 子句字符串括起来以告诉 SQL 它是 unicode:

..."PATHNAME" = N'\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo'

此外,MFC 会根据您的配置将数据转换为 MCBS 或 UNICODE。确保在记录集中使用 CStringT。

关于c++ - ODBC SQL Server Unicode 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com