Page 1 of 1

OT: Clase TODBC conectar MS-SQL

Posted: Sat May 09, 2020 3:58 am
by Alin
Hola Antonio,
Lo que me comentas de que se ha hecho correctamente por el valor devuelto, no sé, yo reviso las tablas en las que hago pruebas y ninguna tiene el dato insertado, son simples tablas sin regla de negocio que pudiera estar afectando algo, incluso también probé con la base de datos AdventureWorksLT2014 y nada, no se inserta la fila.

Qué más puedo intentar?.

Dejo aquí nuevamente el código:

Code: Select all

#require "hbodbc"
 
PROCEDURE MAIN()
   LOCAL dsFunctions
   LOCAL connection
   
   REQUEST HB_CODEPAGE_ESMWIN
   SET( _SET_CODEPAGE, "ESMWIN" )
   HB_CDPSELECT( "ESMWIN" )
    
   SET( _SET_DATEFORMAT, "dd/mm/yyyy" )
   SET( _SET_EPOCH, 2000 )  
   SET DECIMALS TO 2
   SET FIXED ON
 
   connection := 'Driver={SQL Server};Server=SERVER\INSTANCE;Database=Database;UID=UI;PWD=PWD;'
   
   dsFunctions := TODBC():New( connection )
 
   WITH OBJECT dsFunctions
 
      :SetSQL( "SELECT TOP 5 CCODIGOAGENTE, CNOMBREAGENTE FROM admAgentes WHERE CIDAGENTE > 0" )
      :Open()
      :First()
      
      DO WHILE ! :Eof()
         ? :FieldByName( "CCODIGOAGENTE" ):Value, :FieldByName( "CNOMBREAGENTE" ):Value
         :Skip()
      ENDDO
      //wait
 
      ? :ExecSQL("INSERT INTO admAgentes (CCODIGOAGENTE, CNOMBREAGENTE) VALUES('1000', 'Javier ODBC')" )
      :Close()
 
   ENDWITH
 
   dsFunctions:Destroy()
   
RETURN
Gracias por tu tiempo.

Saludos,
Javier

Re: OT: Clase TODBC conectar MS-SQL

Posted: Sat May 09, 2020 1:43 pm
by Rick Lipkin
Javier

I still like Sqloledb for Sql Server .. I know Microsoft has been telling us for years that oledb will be depreciated ... and that was 5 or 6 years ago .. nice thing about using Sqloledb is that the client is already part of the Windows operation system and you do not have to configure it for each workstation like odbc .. here is the connection string to Sqloledb :

Code: Select all

xPROVIDER := "SQLOLEDB"
xSOURCE   := "RICKLIPKIN-PC\SQLEXPRESS"
xCatalog  := "yourdatabase"
xUserId   := "YourUserid"
xPASSWORD := "YourPassword"

xString := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOG+';User Id='+xUSERID+';Password='+xPASSWORD

// global connection string
xConnect := CREATEOBJECT( "ADODB.Connection" )

TRY
   xConnect:Open( xString )
CATCH oErr
   Saying := "Could not open a Global Connection to Database "+xSource
   MsgInfo( Saying )
   RETURN(.F.)
END TRY
 
Rick Lipkin

Re: OT: Clase TODBC conectar MS-SQL

Posted: Sun May 10, 2020 5:41 am
by Alin
Hola Rick,
Gracias por responder, lo que sucede es que desde hace un par de años me conecto a MS-SQL con ADO, el tema es que según entiendo createobject es sólo para Windows con la lib hbwin, en este momento mi intención es hacer algunas pruebas y conectar por ODBC que entiendo podría incluso trabajar en un ambiente Linux.

Saludos,
Javier

Re: OT: Clase TODBC conectar MS-SQL

Posted: Mon May 11, 2020 12:25 am
by Rick Lipkin
Javier

I just googled "connecting to sql server from linux" .. lots of information there using ODBC .. also check out this link on setting up a Sql Server instance on linux ..

https://docs.microsoft.com/en-us/sql/l ... ver-ver15


Hope this helps.

Rick Lipkin

Re: OT: Clase TODBC conectar MS-SQL

Posted: Fri May 15, 2020 11:59 pm
by Alin
Hola,
Gracias a la ayuda de Antonio, esto está funcionando:

Code: Select all

#require "hbodbc"

PROCEDURE MAIN()
   LOCAL dsFunctions
   LOCAL connection
   
   REQUEST HB_CODEPAGE_ESMWIN
   SET( _SET_CODEPAGE, "ESMWIN" )
   HB_CDPSELECT( "ESMWIN" )
    
   SET( _SET_DATEFORMAT, "dd/mm/yyyy" )
   SET( _SET_EPOCH, 2000 )  
   SET DECIMALS TO 2
   SET FIXED ON

   connection := 'Driver={SQL Server};Server=SERVER\INSTANCE;Database=Database;UID=UI;PWD=PWD;'
   
   dsFunctions := TODBC():New( connection )

   WITH OBJECT dsFunctions

      :SetSQL( "SELECT CCODIGOAGENTE, CNOMBREAGENTE FROM admAgentes WHERE CIDAGENTE > 0" )
      :Open()
      :First()
      
      DO WHILE ! :Eof()
         ? :FieldByName( "CCODIGOAGENTE" ):Value, :FieldByName( "CNOMBREAGENTE" ):Value
         :Skip()
      ENDDO

      :Close()  // cierras el recordset actual Antonio                                                         // Como comentario también funciona
      ? :SetSQL( "INSERT INTO admAgentes (CCODIGOAGENTE, CNOMBREAGENTE) VALUES('250', 'Antonio Linares')" )    // funciona
      //? :SetSQL( "UPDATE admAgentes SET CNOMBREAGENTE='PARADA' WHERE CCODIGOAGENTE='24'" )                   // funciona
      //? :SetSQL( "DELETE FROM admAgentes WHERE CCODIGOAGENTE='28'" )                                         // funciona
      IF !:Open()  // Antonio ** IMPORTANTE **
         ? dsFunctions:SQLErrorMessage()
      ENDIF

      :Close()

   ENDWITH

   dsFunctions:Destroy()
   
RETURN
//eof
 
Saludos,
Javier