2012-06-12 26 views
0

用VB6編寫的應用程序。 DB是Pervasive v9.5。如何將字符串寫入普遍大於32k的longvarchar?

現任職:

Public Sub Save() 
    if rs.State = adStateOpen Then 
     rs.AddNew 
     SetFields rs 
     rs.Update 
    End If 
end sub 

Public Sub SetFields(rs as ADODB.Recordset) 
    rs!Name = strName 
    StrToField strReport rs!Report 
    StrToField strResponse rs!Response 
end sub 

Public Sub StrToField(ByVal str As String, fld As ADODB.Field) 
    Dim Data As String 
    Dim StrSize As Long, CharsRead As Long 

    ' for field of LONVARCHAR type only 
    If fld.Type = adLongVarChar Then 
     StrSize = Len(str) 
     Do While StrSize <> CharsRead 
      If StrSize - CharsRead < BLOCK_SIZE_LONGVARCHAR Then 
       Data = Mid(str, CharsRead + 1, StrSize - CharsRead) 
       CharsRead = StrSize 
      Else 
       Data = Mid(str, CharsRead + 1, BLOCK_SIZE_LONGVARCHAR) 
       CharsRead = CharsRead + BLOCK_SIZE_LONGVARCHAR 
      End If 
      fld.AppendChunk Data 
     Loop 
    Else 
     ' do something 
    End If 
End Sub 

Const BLOCK_SIZE_LONGVARCHAR = 4096 

這工作得很好,直到我的報告或響應變量大於32000個字符大。我在調用rs.update時收到以下錯誤消息:

「[Pervasive] [ODBC Client Interface]字符串長度超過列長度參數#15。數據被截斷。」

任何人都可以指出我正確的方向,或讓我知道如果我失去了一些東西。 Pervasive Longvarchar最大大小應爲2GB。

感謝, 格雷厄姆

回答

0

此代碼使用PSQL V11(我沒有V9.5)形成了我。

Dim conn As New ADODB.Connection 
Set conn = New ADODB.Connection 
conn.ConnectionString = "demodata" 
conn.Open 
Dim sql As String 
Dim cmd As New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandText = "insert into lvc (f2) values (?)" 
Dim parm As New ADODB.Parameter 
parm.Name = "f2" 
Dim longstring As String 
Open "c:\longdata.txt" For Input As #1 
Do While Not EOF(1) 
    Line Input #1, sNextLine 
    'do something with it 
    'add line numbers to it, in this case! 
    sText = sText & sNextLine 
Loop 
longstring = sText 
parm.Value = longstring 
cmd.Parameters.Append cmd.CreateParameter("param1", adLongVarChar, adParamInput, Len(longstring), longstring) 
cmd.Execute 
conn.Close 
MsgBox "done" 

基本上,您將使用參數化查詢而不是.AddNew方法。

+0

你是一個天才Mirtheil。謝謝! – GJones