none
Buscar si existe en la base de datos SQL server RRS feed

  • Pregunta

  • Hola a todos muy buen día otra vez vengo por ayuda

    lo que deseo es validar si existe el numero de Carnet o DNI ya que es un numero unico por persona para ello hice en sql server este procedimiento almacenando 

    ALTER procedure [dbo].[Sp_Existe_CI]
    @CI_Buscado nvarchar(15)
    as
    begin
    select count(*) from tbl_Registro_Alumno where Numero_CI = @CI_Buscado
    end

    y efectivamente si consulto un CI que existe me devuelve 1 y si no existe me devuelve 0 ok hasta ahí todo bien ahora en C#

    ahí el problema no se como implementarlo, vale decir que si la consulta me devuelve 0 que siga y si devuelve 1 que retorne ya que existe tengo este avance

    //Método si existe Carnet de Identidad
            public static bool Existe(string CI)
            {
                Sp_Existe_CITableAdapter adaptador = new Sp_Existe_CITableAdapter();
                Sp_Existe_CIDataTable a = adaptador.Sp_Existe_CI(CI);
    
                if (a = 1)
                {
                    return false;
                }
                return true;
            }

    tal vez esta muy mal pero es lo que estaba probando, en este caso todo me salta al true, 

    aqui le paso el numero para ir a la base de datos pero no puedo implementarlo

    private void button1_Click(object sender, EventArgs e)
            {
               Registro_Estudiante.Existe(txt_NumeroCarnetIdentidad.Text);
                
            }

    Por favor me gustaría que me ayuden a resolverlo ya que como verán no consigo.

    gracias a todos por colaborarme

    Roberto Melgar

    martes, 3 de julio de 2018 14:31

Respuestas

  • Sí, tienes que usar un SqlConnection. Pero el SqlConnection ya lo tienes que tener, porque el TableAdapter internamente usa un SqlDataAdapter, el cual usa un SqlCommand, el cual usa un SqlConnection. Así que si estás usando un TableAdapter, entonces por dentro, oculto en algún sitio del código autogenerado, existe ya el SqlConnection.

    En cualquier caso, si necesitas generarlo de nuevo, basta con que hagas un new SqlConnection(cadenaDeConexion). La cadena de conexión ya tiene que estar en el programa, porque la necesita el TableAdapter. Mira en el fichero .config cómo se llama tu connectionString, y entonces busca en todo el fuente (shift+control+F) las ocurrencias de ese nombre hasta que encuentres dónde está el código que recupera esa cadena, y entonces cópial de ahí.

    Una vez que tengas la cadena de conexión, el código para ejecutar el ExecuteScalar es así:

    using (SqlConnection cn = new SqlConnection(cadenaDeConexion))
    {
        SqlCommand cmd = new SqlCommand("[dbo].[Sp_Existe_CI]", cn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@CI_Buscado", txt_NumeroCarnetIdentidad.Text);
        cn.Open();
        int resultado = (int)cmd.ExecuteScalar();
        if (resultado == 1) .....
    }


    martes, 3 de julio de 2018 17:17
    Moderador

Todas las respuestas

  • Si usas un TableAdapter. te va a devolver una tabla con un unico registro y una unica columna, y el 1 dentro de esa columna. Asi que en lugar de "if (a=1)..." tendrias que poner algo asi:

    if (1==(int)a.Rows[0][0]) ...

    Desde luego, no tengo tu tableadapter para probarlo, asi que puede ser que haya alguna variacion requerida. Pero si lo haces interactivamente desde Visual Studio, el Intellisense (o el debugger si pones unbreakpoint) te deberian indicar en pantalla el tipo de la variable "a" y las propiedades que tiene, asi que seria muchisimo mas facil encontrar la sintaxis correcta de forma interactiva de lo que resulta hacerlo en el foro sin tener acceso al codigo.

    Esta no es una forma muy eficiente de retornar el valor del procedimiento almacenado. Para un procedimiento como este, que siempre devuelve una unica fila con una unica columna, you usaria un SqlCommand con el metodo ExecuteScalar, en lugar de usar el tableAdapter.

    martes, 3 de julio de 2018 15:21
    Moderador
  • Gracias Estimado, pero entonces como usaría el SqlCommand con el metodo ExecuteScalar, por favor una idea, creo que debo usar sqlconnection o algo asi.

    por favor 

    Gracias

    Roberto

    martes, 3 de julio de 2018 15:48
  • Sí, tienes que usar un SqlConnection. Pero el SqlConnection ya lo tienes que tener, porque el TableAdapter internamente usa un SqlDataAdapter, el cual usa un SqlCommand, el cual usa un SqlConnection. Así que si estás usando un TableAdapter, entonces por dentro, oculto en algún sitio del código autogenerado, existe ya el SqlConnection.

    En cualquier caso, si necesitas generarlo de nuevo, basta con que hagas un new SqlConnection(cadenaDeConexion). La cadena de conexión ya tiene que estar en el programa, porque la necesita el TableAdapter. Mira en el fichero .config cómo se llama tu connectionString, y entonces busca en todo el fuente (shift+control+F) las ocurrencias de ese nombre hasta que encuentres dónde está el código que recupera esa cadena, y entonces cópial de ahí.

    Una vez que tengas la cadena de conexión, el código para ejecutar el ExecuteScalar es así:

    using (SqlConnection cn = new SqlConnection(cadenaDeConexion))
    {
        SqlCommand cmd = new SqlCommand("[dbo].[Sp_Existe_CI]", cn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@CI_Buscado", txt_NumeroCarnetIdentidad.Text);
        cn.Open();
        int resultado = (int)cmd.ExecuteScalar();
        if (resultado == 1) .....
    }


    martes, 3 de julio de 2018 17:17
    Moderador
  • Muchas gracias Estimado Alberto Poblacion, muy oportuna la ayuda con esto me quedo muy bien

    Gracias.

    Roberto

    martes, 3 de julio de 2018 23:05