Tengo problemas para insertar datos en una tabla desde otra en Visual Basic

Tengo un problema al tratar de ejecutar un objeto command para insertar datos en una tablas desde otra. Las conexiones son buenas y probadas. NO tengo ni idea de como ya que no tengo mucho experiencia con VB.
Te mando el código de ejemplo.
Agradeceré una pronto ayuda.
Option Explicit
Dim Conecta As ADODB.Connection
Dim conecta1 As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim cmd As ADODB.Command
______________________________________________________
----------Esto no funciona ya que el objeto cmd que se trata de ejecutar solo tiene como conexión activa 1 tabla a la vez, como el sql usa 2 tablas en un query anidado. He ahí el problema. --------------------
Private Sub Command1_Click()
Dim sql As String
sql = "INSERT INTO METEO.PERSO(NOMBRE) SELECT NOMBRE FROM NOMINA"
cmd.CommandText = sql
cmd.Execute
sql = "commit"
cmd.CommandText = sql
cmd.Execute
MsgBox "Registros Insertados", vbExclamation, "Atención"
End Sub
Private Sub Form_Load()
Set Conecta = New ADODB.Connection
Set conecta1 = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
Set rs1 = New ADODB.Recordset
Set cmd.ActiveConnection = Conecta
Conecta.ConnectionString = "DSN=METEO;UID=cbadilla;Password=aaaaaa"
Conecta.Open
conecta1.ConnectionString = "DSN=planilla;UID"
conecta1.Open
End Sub
----------Así funciona pero solo para un registro, y como son como 30 campos seria muy difícil meterlo, tengo que contar primero cuantos registros tiene la tabla nomina y hacer un ciclo, especificar los nombres de los campos, etc. Etc.
----------------------------------------------------------
Private Sub Command1_Click()
rs.Open "Select * From nomina", conecta1, adOpenStatic, adLockOptimistic
sql = "INSERT INTO METEO.PERSO(NOMBRE) VALUES(" + "'" + rs!NOMBRE + "'" + ")"
Text2.Text = sql
cmd.CommandText = sql
cmd.Execute
sql = "commit"
cmd.CommandText = sql
cmd.Execute
End Sub

1 respuesta

Respuesta
1
Vamos probando cosas...
* Lo primero es que utilizes la transaccion a nivel de conexion, no mandes el "Commit" como instruccion SQL. Veras que puedes hacer Conecta.BeginTrans al principio del procedimiento y Conecta.CommitTrans si todo ha ido bien:
Private Sub Command1_Click()
On Error Goto TratarError
Conecta. BeginTrans
Cmd. Execute SQL
Conecta. CommitTrans
Exit Sub
TratarError:
Conecta. RollbackTrans
msgbox Err.description, vbExclamation, Err.Source
Err.Clear
End Sub
* El otro tema que me comentas creo que no tiene nada que ver con que la SQL tenga dos tablas, sino que son dos tablas que pertenecen a bases de datos distintas (o que se acceden a ellas por conexiones distintas). Por eso me temo que tendras que hacerlo como la segunda opcion con una pequeña variante:
Private Sub Command1_Click()
Dim InTrans As Boolean
On Error Goto TratarError
rs.Open "Select * From nomina", conecta1, adOpenStatic, adLockOptimistic
if not (rs.bof and rs.eof) then 'Para comprobar que no esta vacio
conecta.begintrans:Intrans=True
rs.movefirst
Do
sql = "INSERT INTO METEO.PERSO(NOMBRE) VALUES(" + "'" + rs!NOMBRE + "'" + ")"
Text2.Text = sql
cmd.CommandText = sql
cmd.Execute
rs.movenext
loop while not rs.eof
conecta.committrans:intrans=False
endif
TratarError:
if intrans then conecta.rollback
if err.number<>0 then
msgbox err.description, vbexclamation, err.source
err.clear
end if
End Sub
Bueno, si gracias, pero antes quiero pedirte dos aclaraciones.
La primera si me puedes explicar más sobre lo de conecta.begintrans y conecta.committrans.
Lo secundo es que pienso que aunque fueras dos bases de datos ACCESS son dos conexiones y esto haría que el objeto comando o sea CMD solo tenga una conexión activa en un momento, lo cual me impediría hacer un sql anidado.
¿O no?
Las transacciones son formas de asegurarse la coherencia de los datos grabados en una BBDD, sobretodo cuando hay múltiples usuarios.
Cuando inicias una transacción (BeginTrans) todas las instrucciones sql que ejecutes (acciones sobre cualquier tabla de esa conexión) se van grabando en una tabla temporal (no es así, pero para que lo entiendas) de tal manera que cuando finalizas la transacción puedes "fijar" los datos (CommitTrans) o rechazar todos los cambios y dejar todo como estaba (RollbackTrans).
Parecerá una tontería, pero te salva muchas veces de no dejar la BBDD hecha pedazos a nivel interno y es muy bueno para controlar los cambios en las tablas.
Sobre el otro tema no entiendo muy bien lo que quieres preguntar, pero vamos, si cada tabla esta en una conexión diferente, no puedes anidar una consulta. Como tu bien dices, un objeto command solo puede tener una conexión activa a la vez. Fíjate que en el ejemplo que te he dado extraigo los datos con un Recordset y los introduzco con el command. Cada uno de ellos tiene una de las dos conexiones, y me temo que no podrías hacerlo de otra manera.
Que tieso es esa vara, en developer, visual fox y otros puedo hacer lo que quiera en una sentencia sql con cuantas tablas quiera. VB da asco.
Gracias de todos modos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas