Crear un DSN por programa ( ODBC )

Post Reply
User avatar
dbzap
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile
Contact:

Crear un DSN por programa ( ODBC )

Post by dbzap »

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

** 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

FUNCTION ConectarAccess()LOCAL nRet,cDriver,cAttributeMEMVAR DEFATMPcDriver   :="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 NILDLL32 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
Joel Andujo
Posts: 132
Joined: Fri Oct 07, 2005 3:14 pm
Location: Cd. Obregón, Sonora, México
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by Joel Andujo »

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: 132
Joined: Fri Oct 07, 2005 3:14 pm
Location: Cd. Obregón, Sonora, México
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by Joel Andujo »

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

Code: Select all | Expand

#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#endifCLASS 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 TDSNRETURN 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  ENDIFRETURN 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  ENDIFRETURN 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  ENDIFRETURN 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  ENDIFRETURN 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  ENDIFRETURN NIL//----------------------------------------------------------// No se hace nada, simplemente se "limpia" el status de// error.//----------------------------------------------------------METHOD End( cDSN ) CLASS TDSN  Self:nStatus := TDSN_NO_ERRORRETURN 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  ENDIFRETURN 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
dbzap
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by dbzap »

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
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by dbzap »

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
Lautaro
Posts: 327
Joined: Fri Oct 07, 2005 2:44 pm
Location: Osorno, Chile
Has thanked: 3 times
Been thanked: 4 times
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by Lautaro »

Julio,

El puerto se especifica en el data :nport.


Saludos,

Lautaro Moreira
User avatar
dbzap
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by dbzap »

Mil gracias Leftraro.
Julio Gonzalez V.
RANDOM S.A.
SISTEMICA S.A.
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 )

Post by Raymundo Islas M. »

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
dbzap
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by dbzap »

Code: Select all | Expand

//----------------------------------------------------------//// 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
Raymundo Islas M.
Posts: 592
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Re: Crear un DSN por programa ( ODBC )

Post by Raymundo Islas M. »

Julio,

Muchas Gracias


Saludos
FWH 10.6 + xHarbour + Borland 582
User avatar
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Re: Crear un DSN por programa ( ODBC )

Post by leandro »

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

//CREA AUTOMATICAMENTE EL CONECTOR ODBCFUNCTION 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 okRETURN NILDLL32 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

//CREA AUTOMATICAMENTE EL CONECTOR ODBCFUNCTION CfgOdbc()nTypeDSN=0 // 0=DSN Sistema 1=DSN UsuariocNomODBC:="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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
Rick Lipkin
Posts: 2669
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Crear un DSN por programa ( ODBC )

Post by Rick Lipkin »

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

xDatabase := "A"  // accessIf 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"EndifIF xDATABASE = "A"   xSTRING := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Jet OLEDB:Database Password='+xPASSWORDELSE   xSTRING := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOG+';User Id='+xUSERID+';Password='+xPASSWORDENDIF 


Rick Lipkin
Post Reply