如何将带有VFP的俄语/阿拉伯语单词(在SQL Server中存储为varbinary)转换为SQL Server中的另一个表作为nvarchar(max)

时间:2017-04-12 20:57:30

标签: sql-server multilingual visual-foxpro foxpro varbinary

表格和数据表

  • TablaLanguage.fieldRussian的数据类型为varbinary(max)
  • 此处存储的数据示例为:0xC3B1C3A0C3B5C3A0C3B0

  • TableString.fieldRussian的数据类型为nvarchar(max)

  • 此处存储的示例应为:алкоголь

数据

示例数据的英文翻译是酒精

我试过的代码/事情

检索不带0x前缀的varbinary数据我使用以下强制转换

SELECT CONVERT(VARCHAR(1000), language18, 2)
FROM decl_groups 
WHERE language1 = 'suiker'

但是,如果我使用ODBC查询在VFP中执行相同的精确转换,我会得到不同的结果。

ODBC查询:

TEXT TO cSQL NOSHOW
      select CONVERT(VARCHAR(1000), fieldRussian, 2) as alcohol
      from TablaLanguage
     where language1 = 'alcohol'
ENDTEXT

ODBC_Query(cSQL, "test")

在vfp中,结果是

'C3A0C3ABC3AAC3AEC3A3C3AEC3ABC3BC20202020202020202020202020202020202020202020202020202020202020202020202020202020202020'

问题:我已经尝试了各种STRCONV()和SYS(),但我似乎没有让它工作..我想我甚至没有得到正确的输入开始到SRTCONV()开始,因为它与我在DB中的目标不一样。有人知道如何进行这种转换,并且可以向我解释这一点,这将是一个很大的帮助。

2 个答案:

答案 0 :(得分:1)

在您上一篇文章中,我向您推荐了Rick Strahl(Using Unicode in Vfp)的一篇有用的文章,其中他谈到了VPF和Unicode。

在这里考虑你的问题是我如何解决它:

** Selection from Binary table **
TEXT TO cSQL NOSHOW
     select fieldRussian as alcohol
     from TablaLanguage
     where language1 = 'alcohol'
ENDTEXT

CURSORSETPROP("MapBinary",.t.,0)
ODBC_Query(cSQL, "cBinaryData")

lcBinaryString = cBinaryData.alcohol

** Insert into nVarchar table **
TEXT TO cSQL_Vc NOSHOW
     INSERT INTO TableString(fieldRussian) VALUES (CAST(?lcBinaryString as nVarchar(MAX)))
ENDTEXT

ODBC_Query(cSQL_Vc, "cData")

将光标的属性MapBinary设置为.T。我将SQL Varbinary映射到VPF blob类型。

正如他所说,不幸的是,Vpf本身并不支持Unicode,所以如果你在VPF表单中的UNICODE中显示somenthing,你应该使用一些ActiveX控件。

答案 1 :(得分:0)

所以经过大量的搜索,这就是我的工作方式。似乎不可能将varbinary字段作为nvarchar存储到另一个表中,只有SQL。所以foxpro需要使用activeX Control。 一个真实的表达,为什么它以这种方式工作我无法给予,但如果有人能帮助我理解它总是我们的结果。

IF!EMPTY(cexport_ingred_decl.declaratie_blob) &安培;&安培;作为varbinary存储在db中的字段,需要作为nvarchar存储在另一个表中       写给cSQL NOSHOW          选择代码页作为codepagina          来自代码页          WHERE language =?ccur_talen.taalnummer
      ENDTEXT       ODBC_Query(cSQL,' ccur_codepages')

 SYS(3101, ccur_codepages.codepagina)                                                      
 oform.addobject("oletextbox1","recoletextbox")                                   
 test = STRCONV(cexport_ingred_decl.declaratie_blob,9)                      
 oform.oletextbox1.text = STRCONV(test,11)                                          

 SYS(3101,0)                                                                                               
 USE IN ccur_codepages  

 SYS(987,.F.)                                               

 SYS(3101,65001)                                                                                                 
 *** Convert UTF-8 to Unicode and store as BINARY string!!!
 pcSavedDescription =  STRCONV(oform.oletextbox1.text,12)                      

pcSavedDescription = CREATEBINARY(pcSavedDescription)                       
oform.removeobject("oletextbox1")  

ENDIF

INSERT IN DB如下:  INSERT INTO tablename(字段)  VALUES(CAST(?pcSavedDescription as nvarchar(max)))