¿Cómo escribo una cadena en longvarchar en un tamaño mayor a 32k?

Aplicación escrita en VB6. DB es omnipresente v9.5.

Actualmente funciona:

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

Esto funciona bien hasta que mi informe o variable de respuesta tenga más de 32000 caracteres. Recibo este mensaje de error cuando se llama a rs.update:

"[Pervasivo] [Interfaz de cliente ODBC] La longitud de la cadena supera la longitud de la columna Parámetro n.º 15. Datos truncados".

¿Alguien puede indicarme la dirección correcta o dejarme saber si me estoy perdiendo algo? El tamaño máximo de Longvarchar generalizado debe ser de 2 GB.

Gracias, graham

preguntado el 12 de junio de 12 a las 21:06

1 Respuestas

Este código me funciona usando PSQL v11 (no tengo 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"

Básicamente, usaría consultas parametrizadas en lugar del método .AddNew.

Respondido el 12 de junio de 12 a las 21:06

Eres un genio Mirtheil. ¡Gracias! - GJones

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.