【问题标题】:MFC ODBC Stored Procedure Parameters with Unicode Characters带有 Unicode 字符的 MFC ODBC 存储过程参数
【发布时间】:2021-02-25 13:33:12
【问题描述】:

存储过程是这样的

CREATE PROCEDURE [dbo].[InsertItemsSPRoc] 
-- Add the parameters for the stored procedure here
@File_Name nvarchar(400) =  NULL,   -- file name to be inserted
@Path_File_Name nvarchar(400) = NULL,   -- path file name to be inserted

    -- insert in the Media_Files FILETABLE
    -- set the specific table holder
    set @sql = N'insert into Media_Files (name, file_stream) (SELECT ''' + @File_Name + ''', * FROM OPENROWSET(BULK N''' + @Path_File_Name + ''', SINGLE_BLOB) AS FileData)'

    -- execute the combined statement
    exec(@sql)

存储过程是通过 MFC 语句调用的,并且当传递的参数是 ANSI(即英文字母)时可以很好地执行。当用户选择文件名由 Unicode 字母组成的文件时出现问题,例如“Ένα Δείγμα.mp4”(在我看来绝对是希腊人),我得到的豁免如下:

无法批量加载,因为无法打开文件“D:??? ??????.mp4”。操作系统错误代码123(文件名、目录名或卷标语法不正确。)。

显然 ODBC 驱动程序正在传递乱码之类的东西。

我尝试使用 MSSM Studio 使用相同的参数调试/执行相同的存储过程,没有问题。

如何在存储过程中传递参数?

【问题讨论】:

  • 您还没有说您的 MFC 应用程序是否使用 Unicode 构建。您调用的系统是否期望文件名使用希腊语编码,或者它接受 Unicode 还是接受 UTF-8?
  • MFC 应用程序是使用 Unicode 构建的。此外,SQL Server 2016 数据库一直使用 nvarchar,并且使用希腊语从 MSSM 环境中执行存储过程没有任何缺陷。
  • 那个?文件名中的问号通常是在使用 WIndows API 函数 WideCharToMultiByte() 时从 Unicode 转换为“Ansi”(用引号引起来,因为实际上是系统字符集)并且它无法转换字符时发生的情况。 IDK 如何提供帮助。
  • 想一想,BULK 关键字后面的 N 标记真的需要吗?我认为最好在''', * FROM OPENROWSET( 子句之前进行。也就是说,我宁愿尝试@File_Name + N''', * FROM OPENROWSET(BULK ''' + @Path_File_Name...。 (@Path_File_Namenvarchar)。最好做一个简单的测试,将@sql 文本插入到测试表的nvarchar 字段中,然后检查其中的内容。还有,是@sqlnvarchar吗?
  • 在 N 附近移动并测试后再次出现 nada。在 nvarchar 中插入 @sql 给了我???再次。 Think是ODBC的设置。逐行调试将我带到 dbcore.cpp 第 336 行,其中调用 AFX_ODBC_CALL(::SQLExecDirect(hstmt, reinterpret_cast(pszSQL), SQL_NTS));制作。我认为应该对 SQLExecDirectW 进行调用,但我不知道如何在我的 stdafx.h 文件中链接 Sqlucode.h

标签: stored-procedures unicode mfc odbc


【解决方案1】:

这是数据库的代码页。当我改变时,确实很痛苦,因为表之间有很多依赖关系,到排序规则

SQL_Latin1_General_CP1253_CI_AS

,微软专门针对希腊人,问题已解决,通过MFC调用存储过程接收到时识别的希腊字符

【讨论】:

  • 如果您还希望能够存储其他语言的字符,例如西方 (1252) 或东方 (1250) 代码页中的重音字符,这不会涵盖所有情况。你需要一个 nchar/nvarchar2 字段。为了测试,尝试在同一个字符串中混合不同代码页的字符,例如 Hœrdt-Łódź-Αθήνα。
  • @Constantine,非常感谢您的评论。问题不在于数据库中的字段,因为它们都是 nvarchar ONLY。该应用程序适用于具有希腊语和美国/英国键盘的客户,因此客户很有可能选择具有希腊名称的文件,并且存在问题。 ODBC 使用 UCS-2,它类似于 UTF-16,Microsoft 出于空间原因不喜欢它。通过更改代码页解决了这个问题,这将是切换到能最好地翻译所有 Unicode 字符的代码页的完美解决方案。请提供并将删除此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2023-03-30
  • 2016-10-24
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多