none
No se han especificado valores para algunos de los parámetros requeridos. RRS feed

  • Pregunta

  • Hola gente, disculpen que los moleste, me comunico con Uds. por lo siguiente:

    Tengo una tabla Alumno con los campos:Dni, Nombre, Apellido...(tiene Id_Alumno)..

    y otra Tabla AlumMatCurso de donde extraigo id_alumMatCurso..(también tiene Id_Alumno).

    El objetivo es llenar un GridView (GridCargaAsistencia), con lo que, al obtener esos

    datos, se llenan........Para tal propósito, he hecho el código que expongo a continua-

    ción de este texto......Me da el Error que figura en el Titulo de este Post....

    Desde ya, muy agradecido con Uds, por aportar la solución que resuelva esto, etc....

    Abrazos....Disculpen las molestias.....

    private void Leer() { string cadenaConexion = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; OleDbConnection cnn = new OleDbConnection(cadenaConexion); OleDbCommand com = new OleDbCommand("SELECT id_cursoMateria From CursosMaterias cm Where cm.id_Curso = @idCurso AND cm.id_Materia = @idMateria", cnn); //GOOD ViewState["idCursoMateria"] = com; connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Guillermo\Documents\Datos.accdb;Persist Security Info=False"); OleDbCommand command = new OleDbCommand(); Adaptador = new OleDbDataAdapter("SELECT A.Dni, A.Apellido, A.Nombre, amc.id_alumMatCurso FROM AlumMatCursos amc INNER JOIN Alumno A ON amc.Id_Alumno = A.Id_Alumno WHERE amc.id_alumMatCurso = @idcurMat", connection); DataTable dt = new DataTable(); Adaptador.Fill(dt); GridCargaAsistencia.DataSource = dt; GridCargaAsistencia.DataBind(); com.Parameters.AddWithValue("@idCurso", (ViewState["idCurso"])); com.Parameters.AddWithValue("@idMateria", (ViewState["idMateria"])); command.Parameters.AddWithValue("@idcurMat", ViewState["idCursoMateria"]); } protected void ButtonAceptar_Click(object sender, EventArgs e) { try { Leer(); } catch (Exception) { throw; } finally { if (connection != null) { connection.Close(); } } }



    lunes, 29 de junio de 2015 2:09

Respuestas

  • hola

    porque guardad un objeto Command en el ViewState ? hacer esto

    ViewState["idCursoMateria"] = com;

    es una pesima idea, porque si lo necesitas ejecutar ese command con el ExecuteScalar() y tomar el valor que retorne y ese valor simpel si ponerlo en el ViewState, pero es un resultado de la ejecucion de la query, no el objeto command de sql

    ----

    ademas en el "Adaptador" no el defines el parametros, si analiza la linea

    Adaptador = new OleDbDataAdapter("SELECT A.Dni, A.Apellido, A.Nombre, amc.id_alumMatCurso FROM AlumMatCursos amc INNER JOIN Alumno A ON amc.Id_Alumno = A.Id_Alumno WHERE amc.id_alumMatCurso = @idcurMat", connection);

    en negrita marco el parametro que esta generando el fallo

    deberias usar

    private void Leer()
    {
    	string cadenaConexion = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    	using(OleDbConnection cnn = new OleDbConnection(cadenaConexion))
    	{
    		cnn.Open();
    		
    		string query1 = "SELECT id_cursoMateria From CursosMaterias cm Where cm.id_Curso = @idCurso AND cm.id_Materia = @idMateria";
    		OleDbCommand com1 = new OleDbCommand(query1, cnn); 
    		com1.Parameters.AddWithValue("@idCurso", Convert.ToInt32(ViewState["idCurso"]));
    		com1.Parameters.AddWithValue("@idMateria", Convert.ToInt32(ViewState["idMateria"]));
    		int idCursoMateria = Convert.ToInt32(com1.ExecuteScalar());
    		ViewState["idCursoMateria"] = idCursoMateria;
    
    		string query2 = "SELECT A.Dni, A.Apellido, A.Nombre, amc.id_alumMatCurso FROM AlumMatCursos amc INNER JOIN Alumno A ON amc.Id_Alumno = A.Id_Alumno WHERE amc.id_alumMatCurso = @idcurMat"
    		OleDbCommand com2 = new OleDbCommand(query2,cnn);
    		com2.Parameters.AddWithValue("@idcurMat", idCursoMateria);         
    		
    		OleDbDataAdapter da = new OleDbDataAdapter(com2);
    		DataTable dt = new DataTable();
    		da.Fill(dt);
    		
    		GridCargaAsistencia.DataSource = dt;
    		GridCargaAsistencia.DataBind();
    
    	}
    	 
    }

    igualmente creo que se podria haber resuelto con una sola query usando joins entre las tablas, pero bueno lo adapte un poco pero siguiente la misma linea que habias planteado

    analiza las lineas que marco en negrita

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de junio de 2015 5:44

Todas las respuestas

  • Tienes un problema con el orden de las sentencias. Primero estás escribiendo una sentencia con parámetros, luego ejecutas la sentencia, y luego le pones los parámetros. Evidentemente, al hacerlo así, te da un error en el momento de ejecutarla quejándose de que no le has dado valores a los parámetros. Como es lógico, los parámetros hay que ponerlos ANTES de ejecutar la sentencia, no DESPUÉS.

    Aparte de eso, tu código es un poco raro: primero configuras un OleDbCommand que no usas para nada, y luego cargas el Grid usando un OleDbDataAdapter... Y fíjate también en que el command lo estás guardando en el ViewState (¡el command, no el resultado de ejecutar el command!), lo cual dará un error gordísimo cuando más tarde intentes pasárselo al dataadapter como parámetro.

    lunes, 29 de junio de 2015 5:00
    Moderador
  • Hola GuilloFerrero es por que no le estas especificando los parámetros de una manera correcta esta mal ubicados, guíate del siguiente código:

    //En este breve ejemplo el valor para el parametro "@Param1" es el texto del textbox01
    
    SqlCommand cmd = new SqlCommand("Select * from tabla where campo = @Param1",conexion);
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("@Param1",TextBox01.Text);
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        da.Fill(tbl);
    
    //Posteriormente veo que quieres capturar datos para otra consulta a partir de los resultados de esta consulta puede obtenerlas desde el mismo datatable (tbl) tbl.Rows[0]["Columna"].ToString();

    Espero haberte ayudado.

    lunes, 29 de junio de 2015 5:03
  • hola

    porque guardad un objeto Command en el ViewState ? hacer esto

    ViewState["idCursoMateria"] = com;

    es una pesima idea, porque si lo necesitas ejecutar ese command con el ExecuteScalar() y tomar el valor que retorne y ese valor simpel si ponerlo en el ViewState, pero es un resultado de la ejecucion de la query, no el objeto command de sql

    ----

    ademas en el "Adaptador" no el defines el parametros, si analiza la linea

    Adaptador = new OleDbDataAdapter("SELECT A.Dni, A.Apellido, A.Nombre, amc.id_alumMatCurso FROM AlumMatCursos amc INNER JOIN Alumno A ON amc.Id_Alumno = A.Id_Alumno WHERE amc.id_alumMatCurso = @idcurMat", connection);

    en negrita marco el parametro que esta generando el fallo

    deberias usar

    private void Leer()
    {
    	string cadenaConexion = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    	using(OleDbConnection cnn = new OleDbConnection(cadenaConexion))
    	{
    		cnn.Open();
    		
    		string query1 = "SELECT id_cursoMateria From CursosMaterias cm Where cm.id_Curso = @idCurso AND cm.id_Materia = @idMateria";
    		OleDbCommand com1 = new OleDbCommand(query1, cnn); 
    		com1.Parameters.AddWithValue("@idCurso", Convert.ToInt32(ViewState["idCurso"]));
    		com1.Parameters.AddWithValue("@idMateria", Convert.ToInt32(ViewState["idMateria"]));
    		int idCursoMateria = Convert.ToInt32(com1.ExecuteScalar());
    		ViewState["idCursoMateria"] = idCursoMateria;
    
    		string query2 = "SELECT A.Dni, A.Apellido, A.Nombre, amc.id_alumMatCurso FROM AlumMatCursos amc INNER JOIN Alumno A ON amc.Id_Alumno = A.Id_Alumno WHERE amc.id_alumMatCurso = @idcurMat"
    		OleDbCommand com2 = new OleDbCommand(query2,cnn);
    		com2.Parameters.AddWithValue("@idcurMat", idCursoMateria);         
    		
    		OleDbDataAdapter da = new OleDbDataAdapter(com2);
    		DataTable dt = new DataTable();
    		da.Fill(dt);
    		
    		GridCargaAsistencia.DataSource = dt;
    		GridCargaAsistencia.DataBind();
    
    	}
    	 
    }

    igualmente creo que se podria haber resuelto con una sola query usando joins entre las tablas, pero bueno lo adapte un poco pero siguiente la misma linea que habias planteado

    analiza las lineas que marco en negrita

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de junio de 2015 5:44
  • Bueno, la verdad es que no me llena el Grid que se debe llenar, por lo que no se que estará fallando.

    A continuación coloco el método del BotonAceptar, que accionaria el Leer();:

    Si se pudiera determinar que es lo que faltaría para llenar el Grid, agradecería que lo hagan saber......Disculpen las molestias, nos vemos.....

    protected void ButtonAceptar_Click(object sender, EventArgs e)
            { 
                try
                {
                    Leer();
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    if (connection != null)
                    {
                        connection.Close();
                    }
                }
            }

      

    jueves, 2 de julio de 2015 1:37
  • Bueno, este método BotonAceptar_Click que nos acabas de copiar esencialmente no vale para nada. Lo que hace es llamar al método Leer() y garantizar que se cierra el objeto connection. El bloque catch...throw se puede omitir, no vale para nada. Y cerrar la conexión en este sitio es muy poco elegante, lo razonable sería cerrarla en el mismo sitio en el que se abre, preferiblemente usando una construcción "using", la cual internamente ya se compila como try...finally.

    Si no se llena el Grid cuando llamas a Leer(), significa que la sentencia SELECT que hay dentro de Leer no está devolviendo datos. Eso puede deberse a que los valores que se le pasan en los parámetros no concuerdan realmente con los datos que hay en las tablas. En estos casos, se recomienda usar el Debugger de Visual Studio para ejecutar el código paso a paso examinando las sentencias que ejecuta, los valores de las variables, y los parámetros que se pasan. Una vez identificada la sentencia SQL que realmente se ha construido en tiempo de ejecución, y comprobado que no devuelve datos, se prueba esa sentencia manualmente desde FUERA del programa, usando las herramientas de base de datos del motor que se esté empleando, hasta depurarla por completo y verificar que devuelve datos. Y después ya se traslada al programa la sentencia corregida y se vuelve a probar en Visual Studio.

    jueves, 2 de julio de 2015 5:35
    Moderador