2014-12-04 96 views
0

背景:ODBC SQL Server的Unicode错误?

我们有一个使用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字符串装入?
  • 对如何处理这个问题的任何其他的想法(短更换我们的技术)
+0

您是否尝试过使用SQL Server Management Studio进行命令?这是你应该做的第一件事,以确保你不会浪费时间认为这是一个ODBC问题。 – PaulMcKenzie 2014-12-04 16:47:19

+0

@PaulMcKenzie - 使用SQL SMS无法正常工作。事实上,同一个查询产生0个结果,但只包含当前代码页中的字符的结果会产生有效的结果。有任何想法吗? – Mordachai 2014-12-04 18:48:06

+0

目标是查看SMS是否可以工作。如果SMS无法成功处理查询,您将无法获得使ODBC调用正常工作的程序。我不是SQL Server专家,但SMS通常是查看查询是否有效的黄金标准。 – PaulMcKenzie 2014-12-04 19:38:45

回答

1

在SELECT语句中,请确保您附上where子句字符串A N告诉SQL它的Unicode:

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

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

+0

谢谢 - 试图让这个工作现在。 N'string'语法在MS Access上失败(我觉得我必须在ODBC中做这样的错误,这种类型的错误不是由驱动程序处理的?)如果我能得到这个工作:) – Mordachai 2014-12-08 19:42:09