2012-05-08 4 views
0

VB6 응용 프로그램이 있고 유니 코드 문자를 저장하려고하면 Ms SQL 데이터베이스에 제대로 저장되지 않습니다. SSMS에서 삽입 명령을 직접 실행하면 삽입이 올바르게 수행됩니다. 내 연결 문자열 내 열에서 드라이버로 SQLOLEDB를 사용하고VB6에서 삽입 할 때 유니 코드 문자가 저장되지 않습니다.

Exec sp_Insert_item 1, 101, N'Ħass'

은 다음과 같이 설정 NVARCHAR의

사람이이 문제를 해결하는 방법을 알고 있나요?

덕분에, 앨런

답변

0

당신은 유니 코드를 지원하는 VB6에서 정확합니다. 실제로 VB6 문자열은 본질적으로 유니 코드이지만 문제는 적절하게 지원하지 않는 사용자 정의 컨트롤에서 표시/검색 할 때 번역에서 손실된다는 점입니다.

UI에서 문자열을 가져 오는 경우이를 지원하는 텍스트 상자 컨트롤을 사용해야합니다. 예를 들어, Microsoft Forms 2.0 Object Library에 대한 참조를 추가하고이 컨트롤을 상자 밖으로 나오는 일반 텍스트 상자 컨트롤 위에 사용합니다. 이렇게하면 유니 코드를 지원하는 글꼴 유형과 스크립트를 설정할 수 있습니다.

는 또한 몇 가지를 확인하실 수 있습니다 나는 당신의 문제는 같은 ANSI 전용에 관한 생각 등 "을 StrConv", "CHRW $",

+0

유니 코드 문자는 텍스트 상자에서 데이터를 검색/표시 할 때 손실되지 않습니다. 그러나 SQL 서버에 쓰려고 할 때. 내 코드가 아래와 같지만 여전히 "Ħass"텍스트가 텍스트 상자에서 올바르게 검색되었습니다. 'CreateRecordset = 새 adodb.Recordset을 설정하십시오. CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'assass" ", conn, adOpenForwardOnly' –

+0

@WarrenRox : 로컬 코드 페이지에 텍스트를 입력하면 VB 코드가 올바르게. 다른 코드 페이지에 텍스트를 입력 할 때 컨트롤 만 바꾸면됩니다. – Deanna

0

로 유니 코드 문자열을 조작하는 기능 내장 VB6 소스 코드 내의 문제 대부분의 사용 가능한 컨트롤과 함께 실행되는 문자열 리터럴.

당신 :

CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'Ħass'", conn, adOpenForwardOnly 

는 실제로 :

CreateRecordset.Open "Exec sp_Insert_item 1, 101, N'Hass'", conn, adOpenForwardOnly 

... 당신이 거기에 붙여 넣기 한 후.

이것은 내가 자주 클래스 I를 사용하여이 문제를 해결할 수있는 흔한 종류의 일입니다. 물론 슬프게도 런타임에는 작동하지만 코드에서 ChrW $() 호출을 문자열 리터럴 내에서 연결하는 방법을 능가합니다.

대개 .CLS 파일을 편집하여 전역, 미리 선언 된 인스턴스 (VB6 .FRM 모듈과 마찬가지로 모듈 이름에 대해 이름이 지정된 "무료"Form 인스턴스가 제공됨)가되도록 Attribute VB_PredeclaredId = True을 편집합니다. 그러나 당신은 물론 그것을 할 필요가 없습니다.

정의 된 한 가지 방법이 있습니다. 내 전체 버전 EscerEscape "기타 방법"으로 사용되는 방법이 있습니다. 설정 등의 직렬화에 유용합니다.

CreateRecordset.Open EscerLite.UnEscape("Exec sp_Insert_item 1, 101, N'^u0126ass'"), _ 
        conn, _ 
        adOpenForwardOnly 

하지만 당신은() 호출 자신의 계획을 요리하거나 CHRW의 $를 사용할 수 있습니다

이 당신이 작성할 수 있습니다.

EscerLite.cls

Option Explicit 

Private Enum UnEscStates 
    uesNotInEscapeSeq = 0 
    uesProcessingEscSeq = 1 
    uesProcessingLongEscSeq = 2 
    uesProcessingLongEscSeqXEnd = 3 
    uesProcessingLongEscSeqUEnd = 5 
End Enum 

Public Function UnEscape(ByVal EscapedText As String) As String 
    'Un-escape a string value. Escape sequences supported: 
    ' 
    ' ^xhh 7 bit hex    ^r  vbCr 
    ' ^uhhhh 16 bit hex ("Unicode") ^l  vbLf 
    ' ^b  vbBack     ^n  vbNewLine/vbCrLf 
    ' ^t  vbTab     ^q  quote (") 
    ' ^v  vbVerticalTab   ^0  vbNullChar 
    ' ^f  vbFormFeed    ^^ ^

    Dim Pos As Long 
    Dim ChS As String 
    Dim ChW As Integer 
    Dim UpChW As Integer 
    Dim UnEscState As UnEscStates 
    Dim UnPos As Long 
    Dim Unicode As Boolean 
    Dim Accum As Long 

    UnEscape = Space$(Len(EscapedText)) 
    UnPos = 1& 
    For Pos = 1& To Len(EscapedText) 
     ChS = Mid$(EscapedText, Pos, 1&) 
     ChW = AscW(ChS) 
     UpChW = AscW(UCase$(ChS)) 
     Select Case UnEscState 
      Case uesNotInEscapeSeq 
       If ChW = 94# Then ' "^" 
        UnEscState = uesProcessingEscSeq 
       End If 
      Case uesProcessingEscSeq 
       UnEscState = uesNotInEscapeSeq 
       Select Case UpChW 
        Case 88# ' "X" 
         UnEscState = uesProcessingLongEscSeq 
        Case 85# ' "U" 
         Unicode = True 
         UnEscState = uesProcessingLongEscSeq 
        Case 66# ' "B" 
         ChS = vbBack 
        Case 84# ' "T" 
         ChS = vbTab 
        Case 86# ' "V" 
         ChS = vbVerticalTab 
        Case 70# ' "F" 
         ChS = vbFormFeed 
        Case 82# ' "R" 
         ChS = vbCr 
        Case 76# ' "L" 
         ChS = vbLf 
        Case 78# ' "N" 
         Mid$(UnEscape, UnPos, 1&) = vbCr 
         UnPos = UnPos + 1 
         ChS = vbLf 
        Case 81# ' "Q" 
         ChS = """" 
        Case 48# ' "0" 
         ChS = vbNullChar 
        Case 94# ' "^", i.e. ^^ 
         ' 
        Case Else 
         Err.Raise 5 
       End Select 
      Case Else 
       If (48# <= UpChW And UpChW <= 57#) Then 
        Accum = 16& * Accum + (CLng(UpChW) And &HF&) 
       ElseIf (65# <= UpChW And UpChW <= 70#) Then 
        Accum = 16& * Accum + (CLng(UpChW) - 55&) 
       Else 
        Err.Raise 5 
       End If 
       UnEscState = UnEscState + 1& 
       If Unicode Then 
        If UnEscState > uesProcessingLongEscSeqUEnd Then 
         ChS = ChrW$(Accum) 
         Accum = 0& 
         UnEscState = uesNotInEscapeSeq 
         Unicode = False 
        End If 
       Else 
        If Accum > 127 Then Err.Raise 5 
        If UnEscState > uesProcessingLongEscSeqXEnd Then 
         ChS = ChrW$(Accum) 
         Accum = 0& 
         UnEscState = uesNotInEscapeSeq 
        End If 
       End If 
     End Select 
     If UnEscState = uesNotInEscapeSeq Then 
      Mid$(UnEscape, UnPos, 1&) = ChS 
      UnPos = UnPos + 1& 
     End If 
    Next 
    If UnEscState <> uesNotInEscapeSeq Then Err.Raise 5 
    UnEscape = Left$(UnEscape, UnPos - 1&) 
End Function 
+0

예를 들어 'Ħ'의 문자가 'H'로 데이터베이스에 저장되지 않고 'ÄÄ'로 저장되므로 문제가 있다고 생각하지 않습니다. –

관련 문제