none
MVC Debe declarar la variable escalar RRS feed

  • Pregunta

  • Hola, uso VS 2015 asp.net mvc estoy tratando de usar stored procedures, tengo esto:

    ALTER PROCEDURE [dbo].[mostrar_cliente]
    @nombre_usuario nvarchar(16)

    As

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    --set @codigo_paciente = 103;
        -- Insert statements for procedure here
    select * from dbo.tbl_clientes where nombre_usuario = @nombre_usuario;

    Lo ejecuto y funciona. Ahora en VS en el controlador tengo:

    public ActionResult Details(string id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }                       

                SqlParameter param1 = new SqlParameter("@nombre_usuario", id);            
                var data = db.Database.SqlQuery<string>("exec dbo.mostrar_cliente @nombre_usuario", param1.ToString()).Single();
                //var data = db.Database.ExecuteSqlCommand("exec dbo.mostrar_cliente @nombre_usuario", param1.ToString());
                //var data = db.Database.SqlQuery<string>("exec mostrar_cliente {0}", param1.ToString()).First();
                //var data = db.Database.SqlQuery<string>("exec dbo.mostrar_cliente @nombre_usuario", param1).FirstOrDefault<string>();
                if (data == null)
                {
                    return HttpNotFound();
                }
                return View(data);
            }

    Pero me dice que debo declarar la variable escalar.

    Como ven he ensayado varias opciones, pero me dice que hay más de una opción en el Data Reader. Cómo puedo solucionar esto ?

    miércoles, 18 de abril de 2018 5:48

Todas las respuestas

  • Yo no creo que su SP corra.  Tiene el uso de la variable @codigo_paciente pero dicha variable no está declarada en ninguna parte.  Su SP debería fallar de cualquier parte que lo ejecute.  Yo borraría esa línea pues la variable no parece tener ninguna utilidad.

    Por cierto, me parece extraña la forma de ejecución que utiliza en .Net.

    También estoy en contra de retornar HttpNotFound().  Si algún día IIS se desconfigura de alguna manera extraña (porque cosas así pasan de vez en cuando, a veces por culpa de una nueva versión mal  configurada), y el usuario ve la página correspondiente al error 404, ¿la está viendo porque el resultado de la consulta fue nulo, o porque IIS está dando problemas?  Que por cierto, .Single() arrojará una excepción si la consulta no devuelve un valor.  Si mal no recuerdo, debería usar SingleOrDefault().


    Jose R. MCP
    Code Samples

    miércoles, 18 de abril de 2018 5:56
  • La variable que mencionas está comentada.

    Ensayé SingleOrDefault y el error sale igual.

    Qué me recomiendas para el 404?

    miércoles, 18 de abril de 2018 6:02
  • Ah ok.  Sí, no lo vi.  Es porque el código sin formato es más difícil de leer.  Le agradeceré mucho que utilice la herramienta de código (el botón con el símbolo <>) cuando postee código.

    Si no es eso, entonces debe ser que la variable id en C# es nula o cadena vacía.  Sería la otra posibilidad que veo.

    En términos generales, uno nunca utiliza códigos HTTP para indicar resultados de una aplicación.  Es confuso.  Idealmente, sus métodos de acción siempre deben retornar un código HTTP exitoso (200 y similares).  Claro, para hacer eso no hay que hacer nada especial, excepto devolver un resultado válido.  En su caso, View(data) puede servir siempre y cuando la vista correspondiente sepa cómo manejar un data nulo.  La vista mostraría un mensaje que dice "La búsqueda no arrojó resultados.".  Eso es muchísimo más informativo y amigable que un error 404 que uno no sabe si pasa por un error de servidor o por qué otra cosa.  Uno como usuario se queda perplejo ante tal situación.


    Jose R. MCP
    Code Samples

    miércoles, 18 de abril de 2018 6:15
  • ALTER PROCEDURE [dbo].[mostrar_cliente]@nombre_usuario nvarchar(16)As--

    SET NOCOUNT ON added to prevent extra result sets from

    select * from dbo.tbl_clientes where nombre_usuario =

    @nombre_usuario;

    Lo ejecuto y funciona. Ahora en VS en el controlador tengo:

    public ActionResult Details(string id)        {           

    if (id == null)           

    {               

    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);           

    }                                  

    SqlParameter param1 = new SqlParameter("@nombre_usuario", id);   

    var data = db.Database.SqlQuery<string>("exec dbo.mostrar_cliente

    @nombre_usuario", param1.ToString()).Single();           

    //var data = db.Database.ExecuteSqlCommand("exec dbo.mostrar_cliente

    @nombre_usuario", param1.ToString());           

    //var data = db.Database.SqlQuery<string>("exec mostrar_cliente {0}",

    param1.ToString()).First();           

    //var data = db.Database.SqlQuery<string>("exec dbo.mostrar_cliente

    @nombre_usuario", param1).FirstOrDefault<string>();           

    if (data == null)            {               

    return HttpNotFound();           

    }           

    return View(data);       

    }

    Puse varias opciones, tal vez con alguna modificación alguna sirva.

    No llega nulo, llega con un valor.

    miércoles, 18 de abril de 2018 14:08
  • hola

    que es "db" ?

    es entity framework, si es asi que tipo code first, o usas un edmx

    Entity Framework Code First and Stored Procedures

    porque no usas

    SqlParameter param1 = new SqlParameter("@nombre_usuario", id);            
    var data = db.Database.SqlQuery("dbo.mostrar_cliente @nombre_usuario", param1).Single();

    quiza el "exec" y el parsmetro va sin ToString()

    por otro lado no veo porque defines <string> si deberias devolver una entidad, es mas defines los campos no el select *

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 18 de abril de 2018 14:31
  • Sale:

    No se puede convertir de string a System.Type

    Uso Database first
    • Editado Jhon2905 miércoles, 18 de abril de 2018 15:52
    miércoles, 18 de abril de 2018 15:50