OT: Clase TODBC conectar MS-SQL

Post Reply
Alin
Posts: 15
Joined: Mon Dec 06, 2010 6:35 pm

OT: Clase TODBC conectar MS-SQL

Post 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
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: OT: Clase TODBC conectar MS-SQL

Post 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
Alin
Posts: 15
Joined: Mon Dec 06, 2010 6:35 pm

Re: OT: Clase TODBC conectar MS-SQL

Post 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
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: OT: Clase TODBC conectar MS-SQL

Post 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
Alin
Posts: 15
Joined: Mon Dec 06, 2010 6:35 pm

Re: OT: Clase TODBC conectar MS-SQL

Post 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
Post Reply