Algo cambia al mandar a grabar un string en una tabla Slq Server 2012, al recuperar la data no se visualiza bien y no imprime completo

111 views
Skip to first unread message

mpulla

unread,
Apr 19, 2013, 5:15:22 PM4/19/13
to publice...@googlegroups.com

Buenas tardes foxeros.

Tengo VFP 9.0 SP 2 y Sql Server 2012, la conexción la hago por ODBC (SQLNCLI10)

El código que expongo abajo, se ejecuta sin problemas pero al recuperar la data el campo memo tiene una letra diferente, las palabras tiene espacios intermedios, al querer manipular el string directamente tiene un comportamiento raro, además al mandar a imprimir solo imprime el primer carácter, no tengo la menor idea de lo que puede estar pasando, espero que alguien pueda ayudarme con el problema.

Saludos.
Mauricio

Tabla:

/****** Object:  Table [dbo].[Prueba]    Script Date: 19/04/2013 15:54:10 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Prueba](
    [iKey] [int] NOT NULL,
    [nota] [nvarchar](800) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Prueba] ADD  CONSTRAINT [DF_Prueba_nota]  DEFAULT ('') FOR [nota]
GO


Store Procedure:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE PrbIngreso_spI @xml xml
AS
    SET NOCOUNT ON;
Begin Try
    Insert into [dbo].[Prueba] (ikey, nota)
  SELECT
     y.Id.value('(ikey/text())[1]', 'int') As ikey,
     isnull(y.Id.value('(nota/text())[1]', 'nvarchar(800)'), '') As Nota
 FROM
    @xml.nodes('/VFPData/rs') As y(Id);

End try

Begin Catch
;
 Throw;
 end Catch

GO

Código VFP:

CLOSE TABLES ALL

CREATE CURSOR rs (iKey Int, nota M)
LOCAL lcNota As String
lcNota = [Prueba de ingreso de datos con cursortoxml()] + CHR(10) + ;
[1.- Nota 1] + CHR(10) + ;
[1.- Nota 2] + CHR(10) + ;
[1.- Nota 3] + CHR(10) + ;
[1.- Nota 4] + CHR(10) + ;
[1.- Nota 5] + CHR(10) + ;
[1.- Nota 6]

INSERT INTO rs VALUES (1, lcNota)
INSERT INTO rs VALUES (2, '')
lcNota = [3.- Nota 1] + CHR(10) + ;
[3.- Nota 2] + CHR(10) + ;
[3.- Nota 3] + CHR(10)
INSERT INTO rs VALUES (3, lcNota)

LOCAL lcErrMsg As String, loException As Exception
PRIVATE lxml As String

CURSORTOXML('rs', 'lxml')

IF !_Screen.odBCTALK.odbcopen()
    RETURN
ENDIF

TRY
    IF SQLEXEC(_Screen.odBCTALK.iodbchandle, [Pruebas.dbo.PrbIngreso_spI ?lxml]) < 0
        AERROR(laError)
        Error laError(2)
    ELSE
        IF SQLEXEC(_Screen.odBCTALK.iodbchandle, [Select * From Pruebas.dbo.Prueba], 'rsdata') < 0
            AERROR(laError)
            Error laError(2)
        ENDIF
    ENDIF   
CATCH TO loException
    lcErrMsg = _Screen.odBCTALK.ErrorProcess(loException)
FINALLY
    _Screen.odBCTALK.odbcclose()
ENDTRY

IF !EMPTY(lcErrMsg)
    =MESSAGEBOX(lcErrMsg, 16, 'ERRORTITLE_LOC')
    RETURN .F.
ENDIF 

IF USED('rsdata')
    SELECT rsdata
    BROWSE
ENDIF

Víctor Hugo Espínola Domínguez

unread,
Apr 19, 2013, 5:55:18 PM4/19/13
to publicesvfoxpro
Hola Mauricio

Prueba el tipo de datos TEXT en vez de NVARCHAR, creo que es más compatible con los MEMO de VFP.

Saludos,
Víctor.

mpulla

unread,
Apr 19, 2013, 6:13:37 PM4/19/13
to publice...@googlegroups.com
Hola Victor.

Gracias contestar.
No utilizo el tipo de dato TEXT porque van a ser descontinuados en futuras versiones, Tienes alguna otra idea?

Saludos.
Mauricio

mpulla

unread,
Apr 19, 2013, 6:26:44 PM4/19/13
to publice...@googlegroups.com
Hola Victor.

Cambie el tipo de campo de NVARCHAR a VARCHAR y funciono perfecto, gracias por la idea.

Saludos.
Mauricio

Víctor Hugo Espínola Domínguez

unread,
Apr 19, 2013, 7:29:03 PM4/19/13
to publicesvfoxpro
Hola Mauricio

Gracias por el dato.

Asumo que VARCHAR( MAX ) es el recomendado para guardar campos MEMO.

Saludos,
Víctor.

Reply all
Reply to author
Forward
0 new messages