Obtener datos base access

31/01/2006 - 16:42 por Roberto | Informe spam
Buenas tardes a todos, ya que es mí primer post (y tranquilos, no será el
último) lo primero presentarme, me llamo Roberto y soy de Gijon (España).
Hace poco tiempo que me "pego" con visual c# y me a surgido un problemilla.
Veamos, tengo dos tablas (NUEVOS y PASES) en una base access (tirajes.mdb)de
las q quiero sacar datos para rellenar una tercera (PENDIENTES), pero cuando
realizo el "insert " (al ejecutar cmd.ExecuteNonQuery() )
me da el siguiente error:
"System.InvalidOperationException: Ya hay un DataReader abierto asociado a
esta conexión, debe cerrarlo primero." El codigo es el siguiente:

private void ActualizarPases_Load(object sender, System.EventArgs e)
{
string strConnnectionOle = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=Tirajes.mdb;";

OleDbConnection oleConn = new OleDbConnection(strConnnectionOle);
oleConn.Open();

string cmdSelect ="SELECT NUEVOS.NUMERO,NUEVOS.CODIGO, PASES.PASE FROM
[NUEVOS],[PASES] WHERE
NUEVOS.CODIGO=PASES.CODIGO";

OleDbDataAdapter canal=new OleDbDataAdapter(cmdSelect, oleConn);
OleDbDataReader result;

result= canal.SelectCommand.ExecuteReader();

while(result.Read())
{
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = oleConn;

cmd.CommandText ="INSERT INTO [PENDIENTES] VALUES
(@DATO1,@DATO2,@DATO3)" ;


cmd.Parameters.Add(new OleDbParameter("@DATO1", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO1"].Value = result["NUMERO"].ToString();


cmd.Parameters.Add(new OleDbParameter("@DATO2", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO2"].Value = result["CODIGO"].ToString();


cmd.Parameters.Add(new OleDbParameter("@DATO3", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO3"].Value =result["PASE"].ToString();


cmd.ExecuteNonQuery(); //EL ERROR LO DA AQUÍ
}

result.Close();
oleConn.Close();
}

A ver si alguien sabe como arreglarlo porque ya me estoy volviendo loco

Un saludo a todos
Roberto
 

Leer las respuestas

#1 A.Poblacion
31/01/2006 - 18:55 | Informe spam
"Roberto" wrote in message
news:43df8548$
Buenas tardes a todos, ya que es mí primer post (y tranquilos, no será el
último) lo primero presentarme, me llamo Roberto y soy de Gijon (España).
Hace poco tiempo que me "pego" con visual c# y me a surgido un
problemilla.
Veamos, tengo dos tablas (NUEVOS y PASES) en una base access
(tirajes.mdb)de las q quiero sacar datos para rellenar una tercera
(PENDIENTES), pero cuando realizo el "insert " (al ejecutar
cmd.ExecuteNonQuery() )
me da el siguiente error:
"System.InvalidOperationException: Ya hay un DataReader abierto asociado a
esta conexión, debe cerrarlo primero." El codigo es el siguiente:

private void ActualizarPases_Load(object sender, System.EventArgs e)
{
string strConnnectionOle = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=Tirajes.mdb;";

OleDbConnection oleConn = new OleDbConnection(strConnnectionOle);
oleConn.Open();

string cmdSelect ="SELECT NUEVOS.NUMERO,NUEVOS.CODIGO, PASES.PASE FROM
[NUEVOS],[PASES] WHERE NUEVOS.CODIGO=PASES.CODIGO";

OleDbDataAdapter canal=new OleDbDataAdapter(cmdSelect, oleConn);
OleDbDataReader result;

result= canal.SelectCommand.ExecuteReader();

while(result.Read())
{
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = oleConn;

cmd.CommandText ="INSERT INTO [PENDIENTES] VALUES
(@DATO1,@DATO2,@DATO3)" ;


cmd.Parameters.Add(new OleDbParameter("@DATO1", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO1"].Value = result["NUMERO"].ToString();


cmd.Parameters.Add(new OleDbParameter("@DATO2", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO2"].Value = result["CODIGO"].ToString();


cmd.Parameters.Add(new OleDbParameter("@DATO3", OleDbType.VarWChar, 30));
cmd.Parameters["@DATO3"].Value =result["PASE"].ToString();


cmd.ExecuteNonQuery(); //EL ERROR LO DA AQUÍ
}

result.Close();
oleConn.Close();
}

A ver si alguien sabe como arreglarlo porque ya me estoy volviendo loco



El problema es que el DataReader mientras está abierto deja "pillada" la
conexión y no permite usarla para nada más hasta que hagas el
result.Close().
Tienes dos alternativas: Una es usar una segunda conexión para el cmd que
ejecuta el ExecuteNonQuery. La otra es leer todos los datos a memoria (por
ejemplo, a un DataSet), cerrar el DataReader, y hacer un segundo bucle que
lea la información en memoria y haga los inserts a la otra tabla. En este
caso puedes usar la misma conexión, pero necesitas ser capaz de contener en
memoria la totalidad de la información.

Preguntas similares