我们有一个使用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控制面板记录数据库连接,可悲的是,该接口产生一个ANSI日志文件 - 所以我无法验证使用该工具的UNICODE/ANSI问题。
次的问题:
- 是否有一个工具,我可以用它来验证这些声明是 创建/ ODBC驱动程序到SQL Server数据库 发出正确?
- 有没有更好的方式来使用ODBC,以便在SELECT查询和INSERT请求中驱动程序不会被简单的UNICODE字符串装入?
- 对如何处理这个问题的任何其他的想法(短更换我们的技术)
您是否尝试过使用SQL Server Management Studio进行命令?这是你应该做的第一件事,以确保你不会浪费时间认为这是一个ODBC问题。 – PaulMcKenzie 2014-12-04 16:47:19
@PaulMcKenzie - 使用SQL SMS无法正常工作。事实上,同一个查询产生0个结果,但只包含当前代码页中的字符的结果会产生有效的结果。有任何想法吗? – Mordachai 2014-12-04 18:48:06
目标是查看SMS是否可以工作。如果SMS无法成功处理查询,您将无法获得使ODBC调用正常工作的程序。我不是SQL Server专家,但SMS通常是查看查询是否有效的黄金标准。 – PaulMcKenzie 2014-12-04 19:38:45