Crear un DSN por programa ( ODBC )

Crear un DSN por programa ( ODBC )

Postby dbzap » Wed Apr 21, 2010 2:34 pm

Hola compañeros.
Desde hace ya un tiempo tengo la duda que como poder hacer un DSN via prg, tengo unos intentos y en una creacion dsn para Access funciona.
Pero mi problema esta ahora en una creacion de dsn para SQL Server, tengo el siguiente codigo y trabaja bien, con un pequeño detalle... no puedo especificar usuario y clave y claramente es importante definir dichos parametros.
Alguien tiene alguna idea para esta duda? Les dejo ambos codigos
Saludos

Code: Select all  Expand view

** este codigo funciona para SQL SErver, pero no permite definir usuario y clave
...
cSeparador := Chr(0)
cDriver   :="SQL Server"

cAttribute:="DSN=AUTO"+cSeparador+;
                  "SERVER=192.168.1.1"+cSeparador+;
                  "ADDRESS=192.168.1.1"+cSeparador+;
                  "DESCRIPTION=Conexion ODBC"+cSeparador+;
                  "DATABASE=MIBASESQL"+cSeparador+cSeparador

nRet := CrtDtaSrc( 0, 1, cDriver, cAttribute )

RETURN NIL
//--------------------------------------------------------------------------------------------------------------------------
DLL32 FUNCTION CrtDtaSrc(hWnd AS LONG, nRequest AS LONG, @cDriver as STRING  , @cAttributes as STRING) ;
               AS _INT PASCAL FROM "SQLConfigDataSource" LIB "ODBCCP32"
 



Code: Select all  Expand view

FUNCTION ConectarAccess()
LOCAL nRet,cDriver,cAttribute
MEMVAR DEFATMP

cDriver   :="Microsoft Access Driver (*.mdb)"
cAttribute:="DSN=BASEACCESS"+Chr(0)+;
            "DESCRIPTION=Conector automatico ACCESS"+Chr(0)+;
            "SERVER=127.0.0.1"+Chr(0)+;
            "DBQ="+DEFATMP+"\BASEACCESS.mdb"+Chr(0)+;
            "FIL=MS Access;"+Chr(0)+;
            "UID=USER32"+Chr(0)+;
            "PWD=USERS32"
nRet      := CrtDtaSrc(0,1,cDriver, cAttribute )

RETURN NIL

DLL32 FUNCTION CrtDtaSrc(hWnd AS LONG, nRequest AS LONG, @cDriver as STRING  , @cAttributes as STRING) ;
   AS _INT PASCAL FROM "SQLConfigDataSource" LIB "ODBCCP32"
 
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Crear un DSN por programa ( ODBC )

Postby Joel Andujo » Tue Apr 27, 2010 6:40 pm

Yo lo hago con la clase TDns :

nTypeDSN=0 // 0=DSN Sistema 1=DSN Usuario
cNomODBF='MiODBC'
cDBase ='MiBasedeDatos'
cServer ='MiServidor'
cUser ='MiUsuario'
cPassWord='MiPassWord'

oDsn:=TDsn():New(cNomODBC)
oDsn:Create(cNomODBC, ;
'Descripción de Mi ODBC',;
cDBase ,;
cServer ,;
cUser ,;
nTypeDsn, 'c:\windows\system32\SQLSRV32.dll',, cPassWord)


Saludos, espero te sirva
Joel Andujo
User avatar
Joel Andujo
 
Posts: 130
Joined: Fri Oct 07, 2005 3:14 pm
Location: Cd. Obregón, Sonora, México

Re: Crear un DSN por programa ( ODBC )

Postby Joel Andujo » Tue Apr 27, 2010 6:44 pm

Sorry, la clase TDNS es de Yamil Bracho. te la paso

Code: Select all  Expand view

#include "FiveWin.ch"
#include "TDSN.CH"

#define  HKEY_CURRENT_USER  2147483649        // 0x80000001
#define  HKEY_LOCAL_MACHINE 2147483650        // 0x80000002
#define  HKEY_USERS         2147483651        // 0x80000003

#define conODBC        "SOFTWARE\ODBC\ODBC.INI"
#define conODBC_DSN    "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
#define conODBC_DRIVER "SOFTWARE\ODBC\ODBCINST.INI"

#ifdef __XPP__
   #define Super ::TControl
   #define New _New
#endif

CLASS TDSN

  DATA cDsn             // Nombre del DSN
  DATA cDescription     // Descripcion del DSN
  DATA cDataBase        // Database. Puede ser :
                        //   SQL Server
                        //   Oracle73
                        //   MySQL
                        //   ....
  DATA cServer          // Servidor o Direccion IP
  DATA cUser            // UserId
  DATA cPassword        // Password
  DATA nPort            // Port

  DATA cDriver          // Driver ODBC
  DATA nStatus          // Codigo de Error
  DATA nDsnType         // Tipo de DSN a crear
                        //   TDSN_SYSTEM_DSN = System DSN (Default ) 0
                        //   TDSN_USER_DSN   = User DSN              1

  METHOD ClassName() INLINE "TDSN"
  METHOD New( cDSN ) CONSTRUCTOR
  METHOD Create( cDSN,  cDescription, cDataBase, cServer   ,;
                 cUser, nDsnType,     cDriver,   nPort, cPassword ) CONSTRUCTOR
  METHOD Seek( cDSN )
  METHOD Get( cDSN, nDsnType )
  METHOD Del( cDSN )
  METHOD Update( cDSN )
  METHOD End( cDSN )
  METHOD cGenPRG()
  METHOD Close() INLINE Self:End()

ENDCLASS

//----------------------------------------------------------
// Apertura DSN
//----------------------------------------------------------
METHOD New( cDSN ) CLASS TDSN
RETURN Self:Get( cDSN )

//----------------------------------------------------------
// Crea DSN
//----------------------------------------------------------
//       Create( <(cDSN)>, <(cDesc)>, <(cDb)>, <(cServer)>,
//             <(cUser)>          ,<(cDriver)>, <nPort>,<(cPassword)> )
METHOD Create( cDSN,  cDescription, cDataBase, cServer     ,;
               cUser, nDsnType,    cDriver,    nPort, cPassword ) CLASS TDSN

  LOCAL oReg
  LOCAL cKey
  LOCAL cSubKey

  DEFAULT nDsnType := TDSN_SYSTEM_DSN
  DEFAULT cDriver  := ""
  DEFAULT nPort    := 0
  DEFAULT cPassword:= ""

  Self:cDSN         := cDSN
  Self:cDescription := cDescription
  Self:cDataBase    := cDataBase
  Self:cServer      := cServer
  Self:cUser        := cUser
  Self:nPort        := nPort
  Self:nDsnType     := nDsnType
  Self:cDriver      := cDriver
  Self:cPassword    := cPassword
  Self:nStatus      := TDSN_NO_ERROR

  IF Self:Seek( cDSN, nDsnType ) == .F.

    //------------------------------------------------------
    // Busca Driver ODBC
    //------------------------------------------------------
   // cDriver := GetDriver( Self:cDataBase )

    //-----------------------------------------------------
    // No se consiguio el driver asociada a la base de
    // datos. Se asume que el driver a utilizar debe estar
    // instalado y no se le presta atencion al especificado
    // con el constructor ( si se especifico )
    //-----------------------------------------------------
    IF cDriver == "?"
      Self:cDriver := ""
      Self:nStatus := TDSN_DRIVER_NOT_FOUND
    ELSE
      //---------------------------------------------------
      // Chequeamos si el driver encontrado es el mismo que
      // se paso al constructor. Si no lo es, se asume que
      // el correcto fue el que se consiguio en el Registry
      //---------------------------------------------------
      //Self:cDriver := cDriver

      //----------------------------------------------------
      // Registras detalle del DSN
      //----------------------------------------------------
      cKey := conODBC + "\" + Self:cDSN
      IF Self:nDsnType == TDSN_USER_DSN
        oReg := TReg32():Create( HKEY_CURRENT_USER, cKey )
      ELSE
        oReg := TReg32():Create( HKEY_LOCAL_MACHINE, cKey )
      ENDIF

      oReg:Set( "
Database",    Self:cDataBase )
      oReg:Set( "
Description", Self:cDescription )
      oReg:Set( "
Driver",      Self:cDriver )

      //------------------------------------------------
      // No hay un estandard en la clave de "
User" asi
      // que creamos dos claves para cubrir todas las
      // posibilidades. Por ejemplo con SQL Server debe
      // ser "
LastUser", mientras que con Oracle y MySQL
      // es "
User"
      //------------------------------------------------
      oReg:Set( "
LastUser", Self:cUser )
      oReg:Set( "
User",     Self:cUser )
      oReg:set( "
Password", Self:cPassword)

      oReg:Set( "
Server", Self:cServer )
      oReg:Set( "
Option", alltrim(str(131073)))
      oReg:Set( "
Stmt","")
      //----------------------------------------------------
      // Igual que User, algunas base de datos usan este
      // parametro
      //----------------------------------------------------
      oReg:Set( "
Port", Ltrim( Str( Self:nPort )))
      oReg:Close()

      //----------------------------------------------------
      // Registra DSN en ODBC Data Sources
      //----------------------------------------------------
      cKey := conODBC_DSN
      IF Self:nDsnType == TDSN_USER_DSN
        oReg := TReg32():Create( HKEY_CURRENT_USER, cKey )
      ELSE
        oReg := TReg32():Create( HKEY_LOCAL_MACHINE, cKey )
      ENDIF
      oReg:Set( Self:cDsn, "
MySQL ODBC 3.51 Driver" )
      oReg:Close()

      Self:nStatus := TDSN_NO_ERROR
    ENDIF
  ELSE
    Self:nStatus := TDSN_ALREADY_EXISTS
  ENDIF

RETURN Self

//----------------------------------------------------------
// Chequea si el DSN dado existe
//----------------------------------------------------------
METHOD Seek( cDSN, nDsnType ) CLASS TDSN

  LOCAL aDSN
  LOCAL cTemp
  LOCAL lExist
  LOCAL nPos

  DEFAULT cDSN     := Self:cDSN
  DEFAULT nDsnType := Self:nDsnType

  aDSN   := Odbc32DsnEntries( Self:nDsnType )
  cTemp  := Upper( cDSN )
  lExist := .T.

  Self:nStatus := TDSN_NO_ERROR
  nPos := aScan( aDsn, { | x | Upper( x ) == cTemp })
  IF nPos == 0
    lExist       := .F.
    Self:nStatus := TDSN_NOT_FOUND
  ENDIF

RETURN lExist

//----------------------------------------------------------
// Toma datos del DSN
//----------------------------------------------------------
METHOD Get( cDSN, nDsnType ) CLASS TDSN

  LOCAL oReg
  LOCAL oReg2
  LOCAL cDriver
  LOCAL cKey

  DEFAULT cDSN     := Self:cDSN
  DEFAULT nDsnType :=0

  Self:cDSn     := cDSN
  Self:nDsnType := nDsnType
  Self:nStatus  := TDSN_NOT_FOUND

  //--------------------------------------------------------
  // Busca si se ha creado el DSN
  //--------------------------------------------------------
  IF Self:Seek( cDSN, nDsnType ) == .T.

    //------------------------------------------------------
    // Busca informacion del DSN
    //------------------------------------------------------
    cKey := conODBC + "
\" + Self:cDSN
    IF Self:nDsnType == TDSN_USER_DSN
      oReg  := TReg32():New( HKEY_CURRENT_USER, cKey     )
      oReg2 := TReg32():New( HKEY_CURRENT_USER          ,;
                             conODBC_DSN                 )
    ELSE
      oReg  := TReg32():New( HKEY_LOCAL_MACHINE, cKey    )
      oReg2 := TReg32():New( HKEY_LOCAL_MACHINE         ,;
                             conODBC_DSN                 )
    ENDIF

    Self:cDescription := oReg:Get( "
Description", "" )
    Self:cDataBase    := oReg2:Get( Self:cDSN, "
" )
    Self:cServer      := oReg:Get( "
Server", "" )

    Self:nPort        := Val( oReg:Get( "
Port","0" ))

    Self:cDriver      := oReg:Get( "
Driver", "")

    Self:cUser        := oReg:Get( "
LastUser", "" )
    IF Len( Self:cUser ) == 0
      Self:cUser        := oReg:Get( "
User", "" )
    ENDIF
    oReg:Close()
    oReg2:Close()
    Self:nStatus      := TDSN_NO_ERROR

  ENDIF

RETURN Self

//----------------------------------------------------------
// Elimina DSN
//----------------------------------------------------------
METHOD Del( cDSN ) CLASS TDSN

  LOCAL nRet
  LOCAL nHandle

  DEFAULT cDSN := Self:cDSN

  Self:nStatus := TDSN_NOT_FOUND

  //--------------------------------------------------------
  // Busca si se ha creado el DSN
  //--------------------------------------------------------
  IF Self:Seek( cDSN )
    IF Self:nDsnType == TDSN_USER_DSN
      //----------------------------------------------------
      // Elimina todos los componentes del DSN
      //----------------------------------------------------
      nRet := RegDeleteKey( HKEY_CURRENT_USER             ,;
                            conODBC + "
\" + Self:cDSN )

      //----------------------------------------------------
      // Elimina de ODBC Data Sources
      //----------------------------------------------------
      nRet := RegOpenKey( HKEY_CURRENT_USER               ,;
                          conODBC_DSN, @nHandle )
      IF nRet == 0
        nRet:= RegDeleteValueA( nHandle, Self:cDSN )
      ENDIF
    ELSE
      //----------------------------------------------------
      // Elimina todos los componentes del DSN
      //----------------------------------------------------
      nRet := RegDeleteKey( HKEY_LOCAL_MACHINE            ,;
                            conODBC + "
\" +  Self:cDSN            )

      //----------------------------------------------------
      // Elimina de ODBC Data Sources
      //----------------------------------------------------
      nRet := RegOpenKey( HKEY_LOCAL_MACHINE               ,;
                          conODBC_DSN, @nHandle )
      IF nRet == 0
        nRet:= RegDeleteValueA( nHandle, Self:cDSN )
      ENDIF
    ENDIF

    IF nRet != 0
      Self:nStatus := TDSN_DELETE_ERROR
    ELSE
      Self:nStatus := TDSN_NO_ERROR
    ENDIF
  ENDIF

RETURN NIL

//----------------------------------------------------------
// Actualiza DSN
//----------------------------------------------------------
METHOD Update( cDSN ) CLASS TDSN

  LOCAL oReg
  LOCAL cDriver
  LOCAL cKey

  DEFAULT cDSN := Self:cDSN

  Self:nStatus := TDSN_NOT_FOUND

  //--------------------------------------------------------
  // Busca si se ha creado el DSN
  //--------------------------------------------------------
  IF Self:Seek( cDSN )

    //------------------------------------------------------
    // Busca Driver ODBC
    //------------------------------------------------------
    cDriver := GetDriver( Self:cDataBase )

    //-----------------------------------------------------
    // No se consiguio el driver asociada a la base de
    // datos. Se asume que el driver a utilizar debe estar
    // instalado y no se le presta atencion al especificado
    // con el constructor ( si se especifico )
    //-----------------------------------------------------
    IF cDriver == "
?"
      Self:cDriver:= "
"
      Self:nStatus := TDSN_DRIVER_NOT_FOUND
    ELSE
      //---------------------------------------------------
      // Chequeamos si el driver encontrado es el mismo que
      // se paso al constructor. Si no lo es, se asume que
      // el correcto fue el que se consiguio en el Registry
      //---------------------------------------------------
      Self:cDriver := cDriver

      //----------------------------------------------------
      // Registras detalle del DSN
      //----------------------------------------------------
      cKey := conODBC + "
\" +  Self:cDSN
      IF Self:nDsnType == TDSN_USER_DSN
         oReg := TReg32():New( HKEY_CURRENT_USER, cKey )
      ELSE
         oReg := TReg32():New( HKEY_LOCAL_MACHINE, cKey )
      ENDIF
      oReg:Set( "
Database",    Self:cDataBase )
      oReg:Set( "
Description", Self:cDescription )
      oReg:Set( "
Driver",      Self:cDriver )

      //------------------------------------------------
      // No hay un estandard en la clave de "
User" asi
      // que creamos dos claves para cubrir todas las
      // posibilidades. Por ejemplo con SQL Server debe
      // ser "
LastUser", mientras que con Oracle y MySQL
      // es "
User"
      //------------------------------------------------
      oReg:Set( "
LastUser", Self:cUser )
      oReg:Set( "
User",     Self:cUser )

      oReg:Set( "
Server", Self:cServer )

      //----------------------------------------------------
      // Igual que User, algunas base de datos usan este
      // parametro
      //----------------------------------------------------
      oReg:Set( "
Port", Ltrim( Str( Self:nPort )))
      oReg:Close()

      //----------------------------------------------------
      // Registra DSN en ODBC Data Sources
      //----------------------------------------------------
      cKey := conODBC_DSN
      IF Self:nDsnType == TDSN_USER_DSN
         oReg := TReg32():New( HKEY_CURRENT_USER, cKey )
      ELSE
         oReg := TReg32():New( HKEY_LOCAL_MACHINE, cKey )
      ENDIF
      oReg:Set( Self:cDsn, Self:cDataBase )
      oReg:Close()

      Self:nStatus := TDSN_NO_ERROR
    ENDIF
  ENDIF

RETURN NIL

//----------------------------------------------------------
// No se hace nada, simplemente se "
limpia" el status de
// error.
//----------------------------------------------------------
METHOD End( cDSN ) CLASS TDSN

  Self:nStatus := TDSN_NO_ERROR

RETURN NIL

//----------------------------------------------------------
// Genera codigo para crear el DSN. En este caso solo se
// implementa el metodo Create()
//----------------------------------------------------------
METHOD cGenPRG() CLASS TDSN

  LOCAL cPrg := "
"

  cPrg := "
oDSN := TDSN():Create("                       + ;
        Chr( 39 ) + Self:cDSN         + Chr( 39 ) + "
,"  + ;
        Chr( 39 ) + Self:cDescription + Chr( 39 ) + "
,"  + ;
        Chr( 39 ) + Self:cDataBase    + Chr( 39 ) + "
,"  + ;
        Chr( 39 ) + Self:cServer      + Chr( 39 ) + "
,"  + ;
        Chr( 39 ) + Self:cUser        + Chr( 39 ) + "
,"  + ;
        Ltrim( Str( Self:nDsnType ))  + "
,"              + ;
        Chr( 39 ) + Self:cDriver      + Chr( 39 ) + "
,"  + ;
        Ltrim( Str( Self:nPort ))     + "
)"

RETURN cPrg

//----------------------------------------------------------
// Busca Driver ODBC
//----------------------------------------------------------
STATIC FUNCTION GetDriver( cDataBase )

  LOCAL oReg
  LOCAL cDriver

  oReg := TReg32():New( HKEY_LOCAL_MACHINE                ,;
                        conODBC_DRIVER + "
\" +  cDataBase )
  cDriver := oReg:Get( "
Driver", "?" )
  oReg:Close()

RETURN cDriver

//----------------------------------------------------------
// Esta funcion reemplaza la original de FiveWin
// OdbcDsnEntries() ya que esta solo busca en el INI y no
// en el registry.
//
// Se le envia el siguiente parametro:
//
//  nDsnType - TDSN_SYSTEM_DSN  System DSN (Default )
//             TDSN_USER_DSN    User DSN
//----------------------------------------------------------
FUNCTION Odbc32DsnEntries( nDsnType )

  LOCAL acRetVal := {}
  LOCAL cValue
  LOCAL n
  LOCAL nRet
  LOCAL nHandle

  DEFAULT nDsnType := TDSN_SYSTEM_DSN

  IF nDsnType == TDSN_USER_DSN
    nRet := RegOpenKey( HKEY_CURRENT_USER                 ,;
                        conODBC, @nHandle )
  ELSE
    nRet := RegOpenKey( HKEY_LOCAL_MACHINE                ,;
                        conODBC, @nHandle )
  ENDIF

  IF nRet == 0
    n := 0
    DO WHILE RegEnumKey( nHandle, n++, @cValue ) == 0
      IF Left( cValue, 5 ) <> "
ODBC "
         aAdd( acRetVal, cValue )
      ENDIF
    ENDDO
  ENDIF

RETURN acRetVal

//----------------------------------------------------------
// Funcion del Win32API para eliminar un Item de una clave
//----------------------------------------------------------
DLL32 STATIC FUNCTION RegDeleteValueA( nhKey AS LONG    ,;
                            cValueName  AS LPSTR ) ;
AS LONG PASCAL LIB "
ADVAPI32.DLL"

User avatar
Joel Andujo
 
Posts: 130
Joined: Fri Oct 07, 2005 3:14 pm
Location: Cd. Obregón, Sonora, México

Re: Crear un DSN por programa ( ODBC )

Postby dbzap » Tue Apr 27, 2010 8:58 pm

Mil gracias, lo revisaré y te comento
Saludos
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Crear un DSN por programa ( ODBC )

Postby dbzap » Tue Apr 27, 2010 9:11 pm

El puerto por DEFAULT para MSSql es el 1433.
En la lista de parámetros se lo puedes especificar?
Si es así, donde debería estar?, si no es así, como debería hacerse según tu?
Saludos y gracias de antemano
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Crear un DSN por programa ( ODBC )

Postby Lautaro » Wed Apr 28, 2010 7:19 pm

Julio,

El puerto se especifica en el data :nport.


Saludos,

Lautaro Moreira
User avatar
Lautaro
 
Posts: 322
Joined: Fri Oct 07, 2005 2:44 pm
Location: Osorno, Chile

Re: Crear un DSN por programa ( ODBC )

Postby dbzap » Thu Apr 29, 2010 1:23 pm

Mil gracias Leftraro.
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Crear un DSN por programa ( ODBC )

Postby Raymundo Islas M. » Mon Jul 12, 2010 4:30 pm

Joel, Julio o Lautaro,

Alguno de uds. que pueda postear el archivo tdsn.ch se lo agradeceria muchisimo para poder hacer algunas pruebas de esto.



Saludos a todos
FWH 10.6 + xHarbour + Borland 582
User avatar
Raymundo Islas M.
 
Posts: 592
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Re: Crear un DSN por programa ( ODBC )

Postby dbzap » Mon Jul 12, 2010 8:19 pm

Code: Select all  Expand view


//----------------------------------------------------------
//
// Class TDSN
// TDSN.CH
//
// Esta clase permite gestionar ODBC DSN ( Data Set Name )
// Autor : Yamil Bracho
// Fecha : 21/Ago/2001
// brachoy@pdvsa.com
//
//----------------------------------------------------------

//----------------------------------------------------------
// Status de TDSN
//----------------------------------------------------------
#define TDSN_NO_ERROR         0
#define TDSN_DRIVER_NOT_FOUND 1
#define TDSN_NOT_FOUND        2
#define TDSN_DELETE_ERROR     3
#define TDSN_ALREADY_EXISTS   4

//----------------------------------------------------------
// Tipos de DSN que se pueden crear
//----------------------------------------------------------
#define TDSN_SYSTEM_DSN 0
#define TDSN_USER_DSN   1

//----------------------------------------------------------
// Commandos
//----------------------------------------------------------
#xcommand DEFINE DSN <oDSN > ;
          ID  <cDSN> ;  
          PROMPT <cDesc> ;
          DATABASE <cDb> ;
          SERVER <cServer> ;
          USER <cUser> ;
          [ DRIVER <cDriver> ] ;
          [ PORT <nPort> ] ;
       => ;
          <oDSN> := TDSN():Create( <(cDSN)>, <(cDesc)>, <(cDb)>, <(cServer)>, <(cUser)>, <(cDriver)>, <nPort> )

#xcommand OPEN DSN <o> => <o>:New()
#xcommand DELETE DSN <o> => <o>:Del()
#xcommand CLOSE DSN <o> => <o>:End()
#xcommand UPDATE DSN <o> => <o>:Update()

 


Saludos
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Crear un DSN por programa ( ODBC )

Postby Raymundo Islas M. » Mon Jul 12, 2010 9:39 pm

Julio,

Muchas Gracias


Saludos
FWH 10.6 + xHarbour + Borland 582
User avatar
Raymundo Islas M.
 
Posts: 592
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Re: Crear un DSN por programa ( ODBC )

Postby leandro » Fri Oct 23, 2020 6:06 pm

Buenas tardes para todos

En este momento me surgió la necesidad de crear automáticamente el DNS, estuve intentando con las dos opciones que se proponen en este POST, pero no logro hacerlo.

Si lo hago con la función que propone dbzap, se logra crear el DSN, pero lo crea en la pestaña de DSN de usuario, el problema es que lo necesito en la pestaña DSN del sistema.
Code: Select all  Expand view

//CREA AUTOMATICAMENTE EL CONECTOR ODBC
FUNCTION CfgOdbc2()
   LOCAL nRet,cDriver,cAttribute
   cDriver   :="MySQL ODBC 3.51 Driver"
   cAttribute:="DSN=lyma"+Chr(0)+"DESCRIPTION=descipcion"+Chr(0)+"SERVER=192.168.101.1"
   nRet:=CrtDtaSrc(0,1,cDriver, cAttribute )
   msginfo(nRet)
   //nRet->0 no se ha creado, 1 creado ok
RETURN NIL

DLL32 FUNCTION CrtDtaSrc(hWnd AS LONG, nRequest AS LONG, @cDriver as STRING  , @cAttributes as STRING) ;
   AS _INT PASCAL FROM "SQLConfigDataSource" LIB "ODBCCP32"
 



Y con la clase de Yamil no logro hacerlo tampoco.

Code: Select all  Expand view

//CREA AUTOMATICAMENTE EL CONECTOR ODBC
FUNCTION CfgOdbc()

nTypeDSN=0 // 0=DSN Sistema 1=DSN Usuario
cNomODBC:="Lyma"
cDBase:="Tales"
cServer:="localhost"
cUser:="root"
cPassWord:="lyma"
cDriver:="MySQL ODBC 3.51 Driver"

oDsn:=TDsn():New(cNomODBC)
oResp := oDsn:Create(cNomODBC,"La descripcion",cDBase ,cServer ,cUser ,nTypeDsn, cDriver, 3306 , cPassWord)
XBROWSE(oResp)

Return nil
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear un DSN por programa ( ODBC )

Postby Rick Lipkin » Sat Oct 24, 2020 6:18 pm

Julio

Personally ... I do not use ODBC for my Sql connections .. I deal with hundreds of machines and have no time to go to each machine to make sure ODBC is configured properly ... Hereis the MS Access and MS Sql Server ADO connections ..

Code: Select all  Expand view


xDatabase := "A"  // access

If xDatabase = "A"
   xPROVIDER := "Microsoft.Jet.OLEDB.4.0"
   xSOURCE   := cDEFA+"\Leave.mdb"
   xPASSWORD := "nov2018"
Else
*   xPROVIDER := "SQLOLEDB"
*   xSOURCE   := "RICKLIPKIN-PC\SQLEXPRESS"
*   xCatalog  := "vehicle"
*   xUserId   := "vehicleuser"
*   xPASSWORD := "password"

Endif


IF xDATABASE = "A"
   xSTRING := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Jet OLEDB:Database Password='+xPASSWORD
ELSE
   xSTRING := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOG+';User Id='+xUSERID+';Password='+xPASSWORD
ENDIF

 


Rick Lipkin
User avatar
Rick Lipkin
 
Posts: 2618
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 67 guests