Anónimo
Leer base de datos desde archivo.ini VB
Mi intención es la siguiente quiero realizar algo quizás básico pero mi nivel no es el mejor para realizarlo, por eso recurro a esta ayuda y en especial a quienes saben y comparten sus conocimientos con nosotros.
Deseo crear un archivo .ini que contenga la ruta de la bse de datos, para que cuando inicie el programa desde otra ubicación no requiera mover la bd a la misma carpeta es decir:
Poder ejecutar el programa desde C:\Program Files\Mi_Programa
y la base de datos estar en D:\Minuto\bd1.mdb
Cosa que si cambio de ruta por por o y motivo no tenga que incluir todo en 1 sola carpeta sino que mediante el *.ini pueda elegir desde que ruta leer dicha bd
Deseo crear un archivo .ini que contenga la ruta de la bse de datos, para que cuando inicie el programa desde otra ubicación no requiera mover la bd a la misma carpeta es decir:
Poder ejecutar el programa desde C:\Program Files\Mi_Programa
y la base de datos estar en D:\Minuto\bd1.mdb
Cosa que si cambio de ruta por por o y motivo no tenga que incluir todo en 1 sola carpeta sino que mediante el *.ini pueda elegir desde que ruta leer dicha bd
1 Respuesta
Respuesta de Isaac Reyes
1
1
Isaac Reyes, Es mejor enseñar a pescar que dar el pescado
En lugar de un .ini, con el que tendrías un problema similar al de la base de datos, te sugiero utilizar las funciones
SaveSetting (para escribir en una ubicación predeterminada del registro)
Y
GetSetting (Para leer lo que has guardado anteriormente)
Son muy simples de usar y es la forma con la que resolví el mismo problema que tu tienes.
USO
'Guardar
SaveSetting NombreAplicacion, SeccionDelRegistro, ClaveDelRegistro, ValorAAlmacenar
'Recuperar
valorRescatado = GetSetting(NombreAplicacion, SeccionDelRegistro, ClaveDelRegistro, [ValorPorDefecto])
Los [] indican que ValorPorDefecto es opcional.
Si no te sirve, pues me lo comentas.
SaveSetting (para escribir en una ubicación predeterminada del registro)
Y
GetSetting (Para leer lo que has guardado anteriormente)
Son muy simples de usar y es la forma con la que resolví el mismo problema que tu tienes.
USO
'Guardar
SaveSetting NombreAplicacion, SeccionDelRegistro, ClaveDelRegistro, ValorAAlmacenar
'Recuperar
valorRescatado = GetSetting(NombreAplicacion, SeccionDelRegistro, ClaveDelRegistro, [ValorPorDefecto])
Los [] indican que ValorPorDefecto es opcional.
Si no te sirve, pues me lo comentas.
Gracias Amigo por tu respuesta
Pues lo que he leído me ha dado mucha certeza de que la mejor forma es usar el registro de windows, solo que creo que es de un uso más fácil el archivo .ini tanto para cambiar valores como para transportar en medios magnéticos.
Se cuales son los riesgos de dichos archivos.ini porque son de fácil acceso solo que me parece que también puede resolver ciertos errores sin modificar el programa en la plataforma por eso te agradecería si me puedes colaborar con la ayuda del .ini
Muchas gracias es muy grato contar con personas como usted que colaboren .
Pues lo que he leído me ha dado mucha certeza de que la mejor forma es usar el registro de windows, solo que creo que es de un uso más fácil el archivo .ini tanto para cambiar valores como para transportar en medios magnéticos.
Se cuales son los riesgos de dichos archivos.ini porque son de fácil acceso solo que me parece que también puede resolver ciertos errores sin modificar el programa en la plataforma por eso te agradecería si me puedes colaborar con la ayuda del .ini
Muchas gracias es muy grato contar con personas como usted que colaboren .
Me parece que tengas tus razones para utilizar un .ini.
Sigue el siguiente enlace y cualquier duda me consultas
Ecscrbir y leer .INI
Sigue el siguiente enlace y cualquier duda me consultas
Ecscrbir y leer .INI
Amigo disculpa ser tan cabeza dura, pero es que la verdad no encuentro la opción que quiero.
Me explico nuevamente quiero un archivo.ini que me muestre la ruta de mi base de datos a trabajar o mejor dicho que lea esa ruta que coloque en el ini para así mover el programa a otra carpeta.
Ejemplo aplicación exe en la carpeta Mis documentos\Mi aplicación.exe
y la base de datos pueda estar en otra ubicación aparte ej: D:\Bases de datos\db1.mdb
si me puedes colaborar muchas gracias sino no te preocupes de igual forma gracias por tu atención.
Aquí un pongo el código de mi programa
Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Long
'Connection Confirmation
Private Sub Form_Load()
'Es posible que esta parte de la conexion se maneje por ini? o no?
' establece la cadena de conexión a utilizar en la propiedad ConnectionString
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
' Abre la base de datos
cnn.Open
' Abre el recordset enviando la consulta sql
rs.Open "Select * from personas", cnn, adOpenDynamic, adLockOptimistic
' Muestra los datos en los text
Call Visualizar_Datos
End Sub
' botón que se desplaza al último registro
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveLast_Click()
' Ejecuta MoveLast y se posiciona en el último registro
rs.MoveLast
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' Botón para el siguiente
'''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveNext_Click()
rs.MoveNext
' Si no sobrepasó el final del recordset ...
If rs.EOF Then
' Se posiciona en el ultimo
rs.MoveLast
MsgBox " Se está en el ultimo registro ", vbInformation
Else
' Visualiza los datos en los text box
Call Visualizar_Datos
End If
End Sub
' Command para ir al registro previo
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMovePrevious_Click()
rs.MovePrevious
' si el recordset sobrepasó el comienzo se posiciona en el primero
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
' Carga los datos
Call Visualizar_Datos
End If
End Sub
' Botón que añade un nuevo registro
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdAddNew_Click()
Call clear
' Ejecuta el método AddNew para crear un registro
rs.AddNew
' Le pasa el foco al control
DTPicker1.SetFocus
Frame2.Enabled = False
End Sub
' Botón que elimina el registro
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdDelete_click()
If MsgBox(" Eliminar el registro ?? ", vbOKCancel + vbExclamation, " Eliminar ") = vbOK Then
' Elimina el registro en el que está posicionado el recordset
rs.Delete
' Mueve al siguiente
rs.MoveNext
' Si elrecordset llegó al final se posiciona en el último
If rs.EOF Then
rs.MoveLast
MsgBox " Ultimo registro ", vbInformation
End If
' muestra los datos en los textbox
Call Visualizar_Datos
End If
Frame2.Enabled = True
End Sub
' Botón que graba los datos
'''''''''''''''''''''''''''''''''''''''
Private Sub cmdSave_Click()
If DTPicker1 = "" Or Text3 = "" Or Text2 = "" Or Text4 = "" Or Text5 = "" Or Text6 = "" Or Text7 = "" Or Text8 = "" Or Text9 = "" Then
MsgBox "Debe Completar los Datos de cada Campo", vbExclamation
Exit Sub
End If
Call Asignar_Datos
rs.Update
MsgBox " Registro Guardado", vbInformation, "Grabar"
Frame2.Enabled = True
End Sub
El archivo.ini el cual almacenaría la ruta de la base de datos
contendría
Ruta: la que yo especifique según el destino que le quiera dar
Base datos: db1.mdb
Gracias Y Disculpa tantas molestias.
Me explico nuevamente quiero un archivo.ini que me muestre la ruta de mi base de datos a trabajar o mejor dicho que lea esa ruta que coloque en el ini para así mover el programa a otra carpeta.
Ejemplo aplicación exe en la carpeta Mis documentos\Mi aplicación.exe
y la base de datos pueda estar en otra ubicación aparte ej: D:\Bases de datos\db1.mdb
si me puedes colaborar muchas gracias sino no te preocupes de igual forma gracias por tu atención.
Aquí un pongo el código de mi programa
Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Long
'Connection Confirmation
Private Sub Form_Load()
'Es posible que esta parte de la conexion se maneje por ini? o no?
' establece la cadena de conexión a utilizar en la propiedad ConnectionString
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
' Abre la base de datos
cnn.Open
' Abre el recordset enviando la consulta sql
rs.Open "Select * from personas", cnn, adOpenDynamic, adLockOptimistic
' Muestra los datos en los text
Call Visualizar_Datos
End Sub
' botón que se desplaza al último registro
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveLast_Click()
' Ejecuta MoveLast y se posiciona en el último registro
rs.MoveLast
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' Botón para el siguiente
'''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveNext_Click()
rs.MoveNext
' Si no sobrepasó el final del recordset ...
If rs.EOF Then
' Se posiciona en el ultimo
rs.MoveLast
MsgBox " Se está en el ultimo registro ", vbInformation
Else
' Visualiza los datos en los text box
Call Visualizar_Datos
End If
End Sub
' Command para ir al registro previo
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMovePrevious_Click()
rs.MovePrevious
' si el recordset sobrepasó el comienzo se posiciona en el primero
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
' Carga los datos
Call Visualizar_Datos
End If
End Sub
' Botón que añade un nuevo registro
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdAddNew_Click()
Call clear
' Ejecuta el método AddNew para crear un registro
rs.AddNew
' Le pasa el foco al control
DTPicker1.SetFocus
Frame2.Enabled = False
End Sub
' Botón que elimina el registro
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdDelete_click()
If MsgBox(" Eliminar el registro ?? ", vbOKCancel + vbExclamation, " Eliminar ") = vbOK Then
' Elimina el registro en el que está posicionado el recordset
rs.Delete
' Mueve al siguiente
rs.MoveNext
' Si elrecordset llegó al final se posiciona en el último
If rs.EOF Then
rs.MoveLast
MsgBox " Ultimo registro ", vbInformation
End If
' muestra los datos en los textbox
Call Visualizar_Datos
End If
Frame2.Enabled = True
End Sub
' Botón que graba los datos
'''''''''''''''''''''''''''''''''''''''
Private Sub cmdSave_Click()
If DTPicker1 = "" Or Text3 = "" Or Text2 = "" Or Text4 = "" Or Text5 = "" Or Text6 = "" Or Text7 = "" Or Text8 = "" Or Text9 = "" Then
MsgBox "Debe Completar los Datos de cada Campo", vbExclamation
Exit Sub
End If
Call Asignar_Datos
rs.Update
MsgBox " Registro Guardado", vbInformation, "Grabar"
Frame2.Enabled = True
End Sub
El archivo.ini el cual almacenaría la ruta de la base de datos
contendría
Ruta: la que yo especifique según el destino que le quiera dar
Base datos: db1.mdb
Gracias Y Disculpa tantas molestias.
ME centraré sólo en la línea, donde creo, está tu complicación.
La conexión se hace en esta línea
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
Asignaremos la ruta de la base de datos a una variable, quedaría de la siguiente forma
rutaBD = App.Path & "\db1.mdb"
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
rutaBD & ";Persist Security Info=False"
Ahora, la idea es obtener la ruta de la base de datos desde el .INI, imaginemos que tu programa se llama MIO entonces diremos que el contenido del .INI es (según tu ejemplo)
[MIO]
BD=D:/Bases de datos/db1.mdb
Supongamos que tu archivo se llama Config.ini
Tu código sería el siguiente.
'Para guardar la ruta con los supuestos antes hechos
Grabar_Ini "MIO", "C:\config.ini", "BD", "D:\Bases de datos\db1.mdb"
'Evidentemente, puedes usar variables en lugar de cadenas estáticas
----------------------
Esto te creará (si no existe) un archivo en C, llamado config.ini que contendrá
[MIO]
BD=D:/Bases de datos/db1.mdb
----------------------
'Recuperar la ruta a la base de datos
rutaBD = Leer_Ini("MIO", "C:\config.ini", "BD", "")
'Conectar a la base de datos
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
rutaBD & ";Persist Security Info=False"
------------------------------------
Para que lo anterior funcione.
'-------TODO ESTO ALMACÉNALO EN UN MODULO SIN CAMBIAR COSA ALGUNA-------
Option Explicit
'Función api que recupera un valor-dato de un archivo Ini
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
'Función api que Escribe un valor - dato en un archivo Ini
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Long
'Lee un dato _
-----------------------------
'Recibe el nombre de la aplicación, la ruta del archivo, la clave a leer y _
el valor por defecto en caso de que la Key no exista
Private Function Leer_Ini(nombreApp As String, Path_INI As String, Key As String, Default As Variant) As String
Dim bufer As String * 256
Dim Len_Value As Long
Len_Value = GetPrivateProfileString(nombreApp, _
Key, _
Default, _
bufer, _
Len(bufer), _
Path_INI)
Leer_Ini = Left$(bufer, Len_Value)
End Function
'Escribe un dato en el INI _
-----------------------------
'Recibe el nombre de la aplicacion, la ruta del archivo, La clave a escribir y el valor a añadir en dicha clave
Private Function Grabar_Ini(nombreApp As String, Path_INI As String, Key As String, Valor As Variant) As String
WritePrivateProfileString nombreApp, _
Key, _
Valor, _
Path_INI
End Function
'---------------------------------------- FIN MODULO --------------------------------------------
La conexión se hace en esta línea
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
Asignaremos la ruta de la base de datos a una variable, quedaría de la siguiente forma
rutaBD = App.Path & "\db1.mdb"
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
rutaBD & ";Persist Security Info=False"
Ahora, la idea es obtener la ruta de la base de datos desde el .INI, imaginemos que tu programa se llama MIO entonces diremos que el contenido del .INI es (según tu ejemplo)
[MIO]
BD=D:/Bases de datos/db1.mdb
Supongamos que tu archivo se llama Config.ini
Tu código sería el siguiente.
'Para guardar la ruta con los supuestos antes hechos
Grabar_Ini "MIO", "C:\config.ini", "BD", "D:\Bases de datos\db1.mdb"
'Evidentemente, puedes usar variables en lugar de cadenas estáticas
----------------------
Esto te creará (si no existe) un archivo en C, llamado config.ini que contendrá
[MIO]
BD=D:/Bases de datos/db1.mdb
----------------------
'Recuperar la ruta a la base de datos
rutaBD = Leer_Ini("MIO", "C:\config.ini", "BD", "")
'Conectar a la base de datos
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
rutaBD & ";Persist Security Info=False"
------------------------------------
Para que lo anterior funcione.
'-------TODO ESTO ALMACÉNALO EN UN MODULO SIN CAMBIAR COSA ALGUNA-------
Option Explicit
'Función api que recupera un valor-dato de un archivo Ini
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
'Función api que Escribe un valor - dato en un archivo Ini
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Long
'Lee un dato _
-----------------------------
'Recibe el nombre de la aplicación, la ruta del archivo, la clave a leer y _
el valor por defecto en caso de que la Key no exista
Private Function Leer_Ini(nombreApp As String, Path_INI As String, Key As String, Default As Variant) As String
Dim bufer As String * 256
Dim Len_Value As Long
Len_Value = GetPrivateProfileString(nombreApp, _
Key, _
Default, _
bufer, _
Len(bufer), _
Path_INI)
Leer_Ini = Left$(bufer, Len_Value)
End Function
'Escribe un dato en el INI _
-----------------------------
'Recibe el nombre de la aplicacion, la ruta del archivo, La clave a escribir y el valor a añadir en dicha clave
Private Function Grabar_Ini(nombreApp As String, Path_INI As String, Key As String, Valor As Variant) As String
WritePrivateProfileString nombreApp, _
Key, _
Valor, _
Path_INI
End Function
'---------------------------------------- FIN MODULO --------------------------------------------
- Compartir respuesta
- Anónimo
ahora mismo