Estoy Haciendo un Launcher Donde del Mismo Se Pueda Hacer un registro de de los usuarios pero cuando le doy a registrar este es mi codigo, Para base de datos estoy usando es Mysql
Public BD As ADODB.Connection
Public RecSQL As ADODB.Recordset
Private Sub connect()
Dim IPMysql As String
Dim User As String
Dim Password As String
Set BD = New ADODB.Connection
BD.ConnectionString = "Driver={Mysql ODBC 3.51 Driver};" & _
IPMysql = "127.0.0.1" 'IP Del Mysql '
User = "root" ' Usuario de la Base de Datos'
Password = "root" 'Password de la Base de Datos'
BD.Open
End Sub
Private Sub ButtonTransparent1_Click(Index As Integer)
Set RecSQL = New ADODB.Recordset
RecSQL.Open "INSERT INTO Registro (Account_id, Password, Nombre,Email, Birth_Date) VALUES (" & Val(Text1) & ",'" & Text2 & ", " & Text3 & ", " & Text4 & ", " & Text5 & ", " & Text6 & ", " & Text7 & ", " & Text8 & "')", BD, adOpenStatic, adLockOptimistic ----> Esta Linea Sale Resaltada
Set RecSQL = Nothing
Form2.Hide
End Sub
eso esta mal, para insertar un registro no debes abrir un recordset, debes ejecutar un comando...
me podrias explicar por favor como lo hago ???
Talvez esto le sirva:
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
'//abrir la conexion a mysql (conConexion)
With rs
'//establecer la conexion
.ActiveConnection = conConexion
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "INSERT INTO tabla(campos) VALUES(valores)"
If .State Then .Close
'//cerrar la conexion
If conConexion.State Then conConexion.Close
End With
Set rs = Nothing
Edito:
'//abrir la conexion a mysql (conConexion)
Ahi tiene que hacer la conexion a la base de datos.
Este es mi Codigo Fuente de mi Form de Registro
Public BD As ADODB.Connection
Public RecSQL As ADODB.Recordset
Private Sub connect()
Dim IPMysql As String
Dim SelectBD As String
Dim User As String
Dim Password As String
Set BD = New ADODB.Connection
BD.ConnectionString = "Driver={Mysql ODBC 3.51 Driver};" & _
IPMysql = "127.0.0.1" 'IP Del Mysql '
SelectBD = "ae_server_ls" 'Selecion de la Base de Datos'
User = "root" ' Usuario de la Base de Datos'
Password = "synopsis" 'Password de la Base de Datos'
BD.Open
End Sub
Private Sub ButtonTransparent1_Click(Index As Integer)
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
'//abrir la conexion a mysql (conConexion)
BD.ConnectionString = "Driver={Mysql ODBC 3.51 Driver};" & _
IPMysql = "127.0.0.1" 'IP Del Mysql '
SelectBD = "ae_server_ls" 'Selecion de la Base de Datos'
User = "root" ' Usuario de la Base de Datos'
Password = "synopsis" 'Password de la Base de Datos'
BD.Open
With rs
'//establecer la conexion
.ActiveConnection = conConexion
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "INSERT INTO Registro(campos) VALUES(id_personal,acc_id,name,email,birth)"
If .State Then .Close
'//cerrar la conexion
If conConexion.State Then conConexion.Close
End With
Set rs = Nothing
End Sub
Private Sub ButtonTransparent2_Click()
On Error GoTo Ver
Set RecBD = New ADODB.Recordset
RecBD.Open "SELECT * from account_data,name,id, BD, adOpenStatic, adLockOptimistic"
While Not RecBD.EOF
MsgBox "Ya Existe Ese ID"
Wend
End Sub
Private Sub ButtonTransparent3_Click()
Form2.Hide
End Sub
Bueno... creo que se esta complicando la vida haciendo un procedimiento de conexion en cada form... le recomiendo que coloque ese procedimiento de conexion en un modulo... algo asi:
modMySQL
Option Explicit
Public conConexion As ADODB.Connection
Public strCadenaConexion As String
'//CONECTAR AL SERVIDOR DE DATOS
Public Sub psConectar()
On Error GoTo Error_Handler:
Set conConexion = New ADODB.Connection
conConexion.ConnectionString = modMySQL.strCadenaConexion
conConexion.Open
Exit Sub
Error_Handler:
Set conConexion = Nothing
MsgBox Err.Description & " (" & Err.Number & ").", vbCritical
End Sub
La variable publica strCadenaConexion la puede cargar de un archivo de texto (o desde el registro) cuando abre el primer form de la aplicacion... asi no va a tener que volver a compilar el proyecto cada vez que se cambie de servidor, usuario, etc.
Bien.. ahora.. con este ejemplo se conecta a la base de datos e inserta... (recuerde que tiene que definir la cadena de conexion en la variable publica strCadenaConexion):
Private Sub psGuardar_Usuario()
Dim rs As ADODB.Recordset
On Error GoTo Error_Handler
Set rs = New ADODB.Recordset
Call modMySQL.psConectar
With rs
.ActiveConnection = modMySQL.conConexion
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "INSERT INTO tabla(campos) VALUES(valores)"
If .State Then .Close
If modMySQL.conConexion.State Then modMySQL.conConexion.Close
End With
Set rs = Nothing
Exit Sub
Error_Handler:
MsgBox Err.Description & " (" & Err.Number & ").", vbCritical
End Sub
La cadena de conexion puede ser algo asi:
modMySQL.strCadenaConexion = "driver={MySQL ODBC 3.51 Driver};server=" & Trim(txtServidor) & ";" _
& "uid=usuario_mysql;pwd=password_mysql;database=base_de_datos;connection="
Donde txtServidor es un TextBox que se coloca en el form de Login... (esto es para lo que le comente anteriormente), que no tenga que estar compilando el proyecto cada vez que cambian el nombre del server, etc.
Cita de: Mr. Crowley en 16 Octubre 2009, 16:07 PM
Private Sub psGuardar_Usuario()
Dim rs As ADODB.Recordset
On Error GoTo Error_Handler
Set rs = New ADODB.Recordset
Call modMySQL.psConectar
With rs
.ActiveConnection = modMySQL.conConexion
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "INSERT INTO tabla(campos) VALUES(valores)"
If .State Then .Close
If modMySQL.conConexion.State Then modMySQL.conConexion.Close
End With
Set rs = Nothing
Exit Sub
Error_Handler:
MsgBox Err.Description & " (" & Err.Number & ").", vbCritical
End Sub
sigue estando mal, con un recordset no se insertan registros, es con un objeto command.
saludos.
me puedes decir como lo hago por necesito hacer eso por favor
haber algo asi:
en algun modulo declaras publico el comando.
Public mComando As ADODB.Command
y lo seteas donde empieze tu programa, en el Sub_Main o el el Load del formulario de inicio que tengas.
Set mComando = New ADODB.Command
y cuando quieras usarlo le seteas la conexion que va a usar y la cadena SQL, y lo ejecutas:
mComando.ActiveConnection = TuConexion
mComando.CommandText = "INSERT INTO Clientes (id,nombre) VALUES (1,'seba')"
mComando.Execute
esto que te digo esta en cualer lado que hable de ADO, busca y vas a encontrar, aca tenes un monton de ejemplos:
ADO - Microsoft Activex Data Objects (http://www.recursosvisualbasic.com.ar/htm/tutoriales/ado.htm)
saludos.
ole gracias tio me ayuda bastante lo que me pasaste xD
Cita de: seba123neo en 17 Octubre 2009, 01:43 AM
Cita de: Mr. Crowley en 16 Octubre 2009, 16:07 PM
Private Sub psGuardar_Usuario()
Dim rs As ADODB.Recordset
On Error GoTo Error_Handler
Set rs = New ADODB.Recordset
Call modMySQL.psConectar
With rs
.ActiveConnection = modMySQL.conConexion
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "INSERT INTO tabla(campos) VALUES(valores)"
If .State Then .Close
If modMySQL.conConexion.State Then modMySQL.conConexion.Close
End With
Set rs = Nothing
Exit Sub
Error_Handler:
MsgBox Err.Description & " (" & Err.Number & ").", vbCritical
End Sub
sigue estando mal, con un recordset no se insertan registros, es con un objeto command.
saludos.
Seba con un Recorset si se puede insertar registros...! :silbar:
Luego de aperturar mi conex, yo creo esto en un módulo .bas
Public Sub OPENTABLA(Xrecordset As ADODB.Recordset, xselect As String, NWConnection As ADODB.Connection, tipocursor As Integer, Optional Bloqueo As Integer)
If Xrecordset.State = adStateOpen Then Xrecordset.Close
Xrecordset.ActiveConnection = NWConnection
Xrecordset.CursorType = adOpenDynamic
Xrecordset.CursorLocation = tipocursor
If Bloqueo = 2 Then
Xrecordset.LockType = adLockPessimistic
Else
Xrecordset.LockType = adLockOptimistic
End If
Xrecordset.Open xselect
Exit Sub
End Sub
Seguido de esto, puedo hacer la inserción de datos así...
'cnn esta declarada como mi Conex.
Dim RSTInserto As New ADODB.Recorset
OPENTABLA RSTInserto, "INSERT INTO tabla(campos) VALUES(valores)"", cnn, 3
Y eso funciona sin problemas, de hecho mis aplicaciones lo llevan...!
:silbar:
Cita de: ssccaann43 en 27 Octubre 2009, 20:40 PM
Luego de aperturar mi conex, yo creo esto en un módulo .bas
Public Sub OPENTABLA(Xrecordset As ADODB.Recordset, xselect As String, NWConnection As ADODB.Connection, tipocursor As Integer, Optional Bloqueo As Integer)
If Xrecordset.State = adStateOpen Then Xrecordset.Close
Xrecordset.ActiveConnection = NWConnection
Xrecordset.CursorType = adOpenDynamic
Xrecordset.CursorLocation = tipocursor
If Bloqueo = 2 Then
Xrecordset.LockType = adLockPessimistic
Else
Xrecordset.LockType = adLockOptimistic
End If
Xrecordset.Open xselect
Exit Sub
End Sub
Seguido de esto, puedo hacer la inserción de datos así...
'cnn esta declarada como mi Conex.
Dim RSTInserto As New ADODB.Recorset
OPENTABLA RSTInserto, "INSERT INTO tabla(campos) VALUES(valores)"", cnn, 3
Y eso funciona sin problemas, de hecho mis aplicaciones lo llevan...!
:silbar:
si, pero que funcione no quiere decir que sea optimo asi, es mas nunca he visto un programa que lo haga de esa forma, siempre lo vi con comandos o con el .Execute de la conexion.
Funciona y es óptimo.
Claro, que existen otras formas de hacerlo, Si. Pero creeme que está es una muy buena entre esas formas de hacerlo.
De igual manera, lo importante es aportar nuestros conocimientos. Así que cualquier duda, continuamos estando a la orden.