none
¿Como ejecutar una consulta SQL compleja desde C#?

    Pregunta

  • Tengo la siguiente consulta... Y no se como pasarle los parámetros desde C#

     

      

     

    DECLARE @intErrorCode INT

                                    BEGIN TRAN

     

                                    INSERT INTO Clientes ([Cli_Nombre], [Cli_Nacionalidad], [Cli_CI])

                                    VALUES (@nombre, @nac, @cedula)

     

                                    SELECT @intErrorCode = @@ERROR

                                    if(@intErrorCode <> 0) GOTO PROBLEM                                                                                          

     

     

                                    INSERT INTO Libros ([Lib_Libro], [Lib_Registro], [Lib_Fechacrea], [Lib_Status])

                                    SELECT @libro, @registro, @fechaCrea, ID_Sta From Status WHERE Sta_Descripcion = 'Activado'

     

                                                    SELECT @intErrorCode = @@ERROR

                                    if(@intErrorCode <> 0) GOTO PROBLEM

     

     

     

                                                                                                    if @imagen1 is not null

                                                                                                    INSERT INTO Caracteristicas ([Fea_Imagens_img], [Fea_Caracteristicas], [Fea_G],

                                    [Fea_Nro_imagen], [Fea_ID_Cliente], [Fea_ID_Usuario])

                                    SELECT @imagen1, @caracteristicas1, @G1, @nImagen1,

                                    CL.ID_Cli, US.ID_Usr

                                                                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario

                                     

                                    SELECT @intErrorCode = @@ERROR

                                    IF(@intErrorCode <> 0) GOTO PROBLEM                            

     

                                                                                                    if @imagen2 is not null

                                                                                                    INSERT INTO Caracteristicas ([Fea_Imagens_img], [Fea_Caracteristicas], [Fea_G],

                                    [Fea_Nro_imagen], [Fea_ID_Cliente], [Fea_ID_Usuario])

                                    SELECT @imagen2, @caracteristicas2, @G2, @nImagen2,

                                    CL.ID_Cli, US.ID_Usr

                                                                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario                                                                                  

     

                                                                                                    SELECT @intErrorCode = @@ERROR

                                    IF(@intErrorCode <> 0) GOTO PROBLEM

     

                                    if @imagen3 is not null

                                                                                                    INSERT INTO Caracteristicas ([Fea_Imagens_img], [Fea_Caracteristicas], [Fea_G],

                                    [Fea_Nro_imagen], [Fea_ID_Cliente], [Fea_ID_Usuario])

                                    SELECT @imagen3, @caracteristicas3, @G3, @nImagen3,

                                    CL.ID_Cli, US.ID_Usr

                                                                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario

     

                                    SELECT @intErrorCode = @@ERROR 

                                    IF(@intErrorCode <> 0) GOTO PROBLEM

     

                                    COMMIT TRAN

                                   

                                    PROBLEM:

                                    if(@intErrorCode <> 0) BEGIN

                                    PRINT 'Acontecimiento inesperado!'

                                    ROLLBACK TRAN

                                    END

     

     

    El problema realmente lo tengo en la parte subrayada, no se por que no me agrega los valores a la base de dato, mientras que en las otras tablas si. supongo que es por el if y ESO…

    Una vez escuche algo, de que en estos casos se usa “RESTORE PROCEDURE” alguien sabe algo al respecto?

    De antemano mil gracias por la ayuda que me puedan brindar…

    Saludos…




    miércoles, 10 de febrero de 2010 19:01

Respuestas

  • hola

    bien ahora va tomando otro color
    lo has entendiod bien ahora si tienes un Stored Procedure en tu sql server

    el codigo que has usado esta correcto, solo falta que indiques los parametros y lo ejecutes eso es todo


    SqlCommand miCommand = new SqlCommand("GetDatosGenerales", miConexion);
    miCommand.CommandType = CommandType.StoredProcedure;

    miCommand.Parameters.AddWithValue("nombre ", <valor>);

    y asi con el resto de los parametros

    por ahi para alguno en especial te convenga definirlo con otra variante
    algo como esto

    SqlParameter paramId = new SqlParameter("Id", SqlDbType.Int);
    paramId.Direction = ParameterDirection.Output;
    command.Parameters.Add(paramId);

    veras que puedes definir el tipo y la direccion si es de salida o entrada, por lo general si es de entrada no se el dice nada pero si es de salida si

    luego de agregar todos los parametros simplemente haces

    miCommand.ExecuteNonQuery()

    y eso es todo


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 11 de febrero de 2010 0:38

Todas las respuestas

  • hola

    el tema pasa que todo ese codigo que has posteado representa a un Stored Procedure

    primeramente deberias armar este en la db, imagino sql server
    y luego condo definas los parametros del stored ahi si invocarlo desde tu codigo


    Crear procedimientos almacenados

    CREATE PROCEDURE (Transact-SQL)

    al definir el procedure hara que todas esas consultas queden encerradas por esta definicion y solo puedas comuniarte con este por medio de los parametros que le definas

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 10 de febrero de 2010 19:13
  • hola

    el tema pasa que todo ese codigo que has posteado representa a un Stored Procedure

    primeramente deberias armar este en la db, imagino sql server
    y luego condo definas los parametros del stored ahi si invocarlo desde tu codigo


    Crear procedimientos almacenados

    CREATE PROCEDURE (Transact-SQL)

    al definir el procedure hara que todas esas consultas queden encerradas por esta definicion y solo puedas comuniarte con este por medio de los parametros que le definas

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina



    Gracias LEandro... No se si entendi mucho... Me quedo asi como te muestro en la parte de mas abajo la ejecute desde SQL y dice que se ejecuto con exito pero no se si habia que ejecutarlo como una consulta o hacer algo mas, obviamente no agrego nada por que no le di valor a los parametros "eso espero"...
    Segun lo que pude leer en el SQLCOMMAND de C# tengo que escribir el nombre del StoreProcedure? que mas deberia hacerl???

    Le agregue esto al SQLCommand

    SqlCommand miCommand = new SqlCommand();
                    miCommand.Connection = miConexion;
                    miCommand.CommandType = CommandType.StoredProcedure;
                    miCommand.CommandText = "dbo.GetDatosGenerales";

    Muchisimas Gracias por tu ayuda...




    -- ================================================

    -- Template generated from Template Explorer using:

    -- Create Procedure (New Menu).SQL

    --

    -- Use the Specify Values for Template Parameters

    -- command (Ctrl-Shift-M) to fill in the parameter

    -- values below.

    --

    -- This block of comments will not be included in

    -- the definition of the procedure.

    -- ================================================

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    -- =============================================

    -- Author:        <Author,,Name>

    -- Create date: <Create Date,,>

    -- Description:   <Description,,>

    -- =============================================

    CREATE PROCEDURE [dbo].[GetDatosGenerales]

     

          -- Add the parameters for the stored procedure here

    @nombre varchar (50),

    @cedula varchar (30),

    @foto varbinary (MAX),

     

    @usuario varchar (20),

     

    @libro varchar (40),

    @registro varchar (40),

    @fechaCrea datetime,

     

    @imagen1 varbinary (MAX),

    @caracteristicas1 varbinary (MAX),

    @G1 int,

    @nImagen1 bigint,

     

    @imagen2 varbinary (MAX),

    @caracteristicas2 varbinary (MAX),

    @G2 int,

    @nImagen2 bigint,

     

    @imagen3 varbinary(MAX),

    @caracteristicas3 varbinary(MAX),

    @G3 int,

    @nImagen3 bigint,

     

    AS

    BEGIN

          -- SET NOCOUNT ON added to prevent extra result sets from

          -- interfering with SELECT statements.

          SET NOCOUNT ON;

     

        -- Insert statements for procedure here

     

    DECLARE @intErrorCode INT

    BEGIN TRAN                 

     

     

                                    INSERT INTO Clientes ([Cli_Nombre], [Cli_Nacionalidad], [Cli_CI], [Cli_Foto])

                                    VALUES (@nombre, @nac, @cedula, @foto)

     

                                    SELECT @intErrorCode = @@ERROR

                                    if(@intErrorCode <> 0) GOTO PROBLEM                                              

     

     

     

                                    INSERT INTO Libro ([Lib_Libro], [Lib_Registro], [Lib_Fechacrea], [Lib_Status])

                                    SELECT @libro, @registro, @fechaCrea, ID_Sta From Status WHERE Sta_Descripcion = 'Activado'

     

                                        SELECT @intErrorCode = @@ERROR

                                    if(@intErrorCode <> 0) GOTO PROBLEM

     

     

     

     

                                    INSERT INTO Clientes_Libro ([ID_Cli], [ID_Lib])

                                    SELECT CL.ID_Cli, LB.ID_Lib FROM CLIENTES AS CL, Libro AS LB

                                                    WHERE CL.Cli_CI = @cedula AND

                                    LB.Lib_Libro = @libro

     

                                    SELECT @intErrorCode = @@ERROR

                                    IF(@intErrorCode <> 0) GOTO PROBLEM

     

     

     

     

                                                    if @imagen1 is not null

                                                    INSERT INTO Caracteristicas ([IMG_Imagens_img], [IMG_Caracteristicas], [IMG_G],

                                    [IMG_Nro_imagen], [IMG_ID_Cliente], [IMG_ID_Usuario])

                                    SELECT @imagen1, @caracteristicas1, @G1, @nImagen1,

                                    CL.ID_Cli, US.ID_Usr

                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario

     

                                                                  

                                                    SELECT @intErrorCode = @@ERROR 

                                    IF(@intErrorCode <> 0) GOTO PROBLEM 

     

                                             

     

     

         

     

    if @imagen2 is not null

                                                    INSERT INTO Caracteristicas ([IMG_Imagens_img], [IMG_Caracteristicas], [IMG_G],

                                    [IMG_Nro_imagen], [IMG_ID_Cliente], [IMG_ID_Usuario])

                                    SELECT @imagen2, @caracteristicas2, @G2, @nImagen2,

                                    CL.ID_Cli, US.ID_Usr

                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario                                       

     

     

                                                    SELECT @intErrorCode = @@ERROR 

                                    IF(@intErrorCode <> 0) GOTO PROBLEM 

     

     

     

     

                                                    if @imagen3 is not null

                                                    INSERT INTO Caracteristicas ([IMG_Imagens_img], [IMG_Caracteristicas], [IMG_G],

                                    [IMG_Nro_imagen], [IMG_ID_Cliente], [IMG_ID_Usuario])

                                    SELECT @imagen3, @caracteristicas3, @G3, @nImagen3,

                                    CL.ID_Cli, US.ID_Usr

                                                    FROM Clientes as CL, Usuarios AS US WHERE Cli_CI = @cedula AND Usr_Nombre_Usuario = @usuario

     

     

          SELECT @intErrorCode = @@ERROR 

                                    IF(@intErrorCode <> 0) GOTO PROBLEM 

     

     

     

                                    COMMIT TRAN

                                    

                                    PROBLEM:

                                    if(@intErrorCode <> 0) BEGIN

                                    PRINT 'Acontecimiento inesperado!'

                                    ROLLBACK TRAN

                                    END

    END

    GO

    miércoles, 10 de febrero de 2010 20:21
  • hola

    bien ahora va tomando otro color
    lo has entendiod bien ahora si tienes un Stored Procedure en tu sql server

    el codigo que has usado esta correcto, solo falta que indiques los parametros y lo ejecutes eso es todo


    SqlCommand miCommand = new SqlCommand("GetDatosGenerales", miConexion);
    miCommand.CommandType = CommandType.StoredProcedure;

    miCommand.Parameters.AddWithValue("nombre ", <valor>);

    y asi con el resto de los parametros

    por ahi para alguno en especial te convenga definirlo con otra variante
    algo como esto

    SqlParameter paramId = new SqlParameter("Id", SqlDbType.Int);
    paramId.Direction = ParameterDirection.Output;
    command.Parameters.Add(paramId);

    veras que puedes definir el tipo y la direccion si es de salida o entrada, por lo general si es de entrada no se el dice nada pero si es de salida si

    luego de agregar todos los parametros simplemente haces

    miCommand.ExecuteNonQuery()

    y eso es todo


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 11 de febrero de 2010 0:38
  • hola

    bien ahora va tomando otro color
    lo has entendiod bien ahora si tienes un Stored Procedure en tu sql server

    el codigo que has usado esta correcto, solo falta que indiques los parametros y lo ejecutes eso es todo


    SqlCommand miCommand = new SqlCommand("GetDatosGenerales", miConexion);
    miCommand.CommandType = CommandType.StoredProcedure;

    miCommand.Parameters.AddWithValue("nombre ", <valor>);

    y asi con el resto de los parametros

    por ahi para alguno en especial te convenga definirlo con otra variante
    algo como esto

    SqlParameter paramId = new SqlParameter("Id", SqlDbType.Int);
    paramId.Direction = ParameterDirection.Output;
    command.Parameters.Add(paramId);

    veras que puedes definir el tipo y la direccion si es de salida o entrada, por lo general si es de entrada no se el dice nada pero si es de salida si

    luego de agregar todos los parametros simplemente haces

    miCommand.ExecuteNonQuery()

    y eso es todo


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina



    Perfecto Leandro, muchas gracias aqui te dejo un link muy bueno donde te explican paso a paso lo de los StoreProcedure, sinceramente se me habia muy dificil entender eso hasta que lo lei...
    http://mspnor.wordpress.com/2008/10/31/sqlprocedimientos-almacenados-paso-a-paso/
    Mil gracias de nuevo...
    jueves, 11 de febrero de 2010 14:02