none
como pasar informacion de un Procedimiento Almacenado a una datatable y mostrar en datagriedview en c# RRS feed

  • Pregunta

  • tengo este codigo dentro de mi sp 

    DECLARE @tCards TABLE
    (
    Row# int identity(1,1),
    [Card] nChar(16) NOT NULL INDEX ix UNIQUE WHERE [Card] IS NOT NULL
    )
    INSERT INTO @tCards
    ([Card])
    VALUES(@NewCard)
    SELECT Row#, [Card] 
    FROM @tCards

     y como return solo e muestra una tabla con la informacion pero cuando se termina la ejecucion se destruye y qusiera pasar esta informacion contenida a c# ¿Algun forma de hacerlo ?

    jueves, 25 de julio de 2019 18:13

Todas las respuestas

  • porque creaste otra pregunta si ya tienes una sobre el mismo tema

    como obtener los datos de una variable tabla que tengo en procedimiento alamacenado


    edita la que ya existe, no crees una nueva, sino se complca darle seguimiento

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 25 de julio de 2019 18:27
  • tal como mencionas, en las variable tipo TABLA, al igual que los CTE, el tipo solo está vigente durante la ejecución del bloque de código.  Es decir, nos mantiene en memoria el resultado de una consulta, para que lo podamos llamar luego dentro de esa misma consulta. Deduzco que no podrás hacer lo que quieres ya que como dices, se destruye luego de que lo ejecutas...
    jueves, 25 de julio de 2019 18:39
  • Hola daniluz:

    Tu problema no parece de c# sino más bien el procedure.

    A priori no tiene sentido, porque dices que es un procedure. Esta podría ser su cabecera, o parte de ella.

    create procedure sp_procedure (@NewCard nChar(16))
    as

    Luego declaras una variable de tabla con un index que no puedo entender, porque....

    Insertas en esa variable de tabla un valor, que es el que recibe como parámetro (@newCard) y luego haces una select.

    En resumidas cuentas le pasas un parametro a un procedure, para retornar el mismo parámetro usado.

    Supongo que es un ejercicio para prácticar, o has omitido mucho código que le diese sentido, pero retorna una tabla de 1 fila y 1 columna.

    En cuanto a meterlo en un datagrid, sigue el consejo que te ha dado Leandro, en el otro hilo.

    jueves, 25 de julio de 2019 18:47
  • hola

    >>como return solo e muestra una tabla con la informacion pero cuando se termina la ejecucion se destruye y qusiera pasar esta informacion contenida a c#

    como mencione en la otra pregunta, si tienes  el SELECT de esa tabla temporal deberias recuperar los registros, pero la temporalidad de la tabla puede afectar como retorna los registros

    igual lo que aconsejaria es que separes las opraciones no teniendo tablas temporales si que debes crearla fisicamente

     Read & Insert Data Using Stored Procedures in C#

    entonces creas un procedure para insertar y otro para leer los registros

    recuerda que existe el variable table y el temporal table

    Differences between SQL Server temporary tables and table variables

    quizas debas cambiar la tabla definiendola con el "#tCards"

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 25 de julio de 2019 19:14
  • este es el codigo 

    ALTER PROCEDURE  cardss
    @pQuantity int,
    @pProductId int

    as
    Begin

    SET NOCOUNT ON;

    -- BIN + Producto
    DECLARE @CardPrefix nChar(8)
    --@Comentario nvarchar(MAX)
    --@Cards nChar(16),
    --@IdC Int


    SELECT @CardPrefix  = p.BinnProduct 
        FROM Products p
        WHERE p.Id = @pProductId

    --select * from Products

    --SET @CardPrefix = ( SELECT Cast(b.Number as nVarChar)+Right('00'+Cast(p.Id as nVarchar),2)
    --    FROM [core].[Products] p
    -- Inner Join [core].[defBINTypes] b ON (p.BINTypeId = b.Id)
    --    WHERE p.Id = @pProductId )

    --SET @CardPrefix ='50640099'

    DECLARE @tCards TABLE
    (
    Row# int identity(1,1),
    [Card] nChar(16) NOT NULL INDEX ix UNIQUE WHERE [Card] IS NOT NULL
    )


    -- Card number seed
    DECLARE  @Seed nChar(7)
        ,@CardCount int  
    ,@CurrentValue bigint
    ,@NewCard bigint

    print '@Quantity:'+[dbo].[ToolsfnVarChar](@pQuantity,'NA')

    /*                                                                    Random          Luhns Algorithm
    Card (16 digit )= CardPrefix[ bin(6 digits) + ProductId(2 digits) ] + Seed(7 digit) + CheckDigit(1 digit)
    */

    SET @CardCount=0
    While(@CardCount<@pQuantity)
    Begin

    While(1=1)
    BEGIN
    -- Card number seed (random generated)
    SET @Seed = Right('0000000'+Cast( ABS(CAST(NEWID() AS binary(6)) %9999999) + 1 as nVarchar),7)

    SET @CurrentValue= Cast(@CardPrefix+@Seed as bigint)

    -- get new card
    exec [dbo].[processGetNewCard]  @pCurrentValue = @CurrentValue OUTPUT,@pNewCard = @NewCard OUTPUT

    if 0=[dbo].[corefnIsLuhn](@NewCard)
    continue;
    break;

    END

    print  [dbo].[ToolsfnVarChar](@NewCard,'')


    BEGIN TRY  


    --SET @Comentario = 'Se inserta el registro!!!!'

    --INSERT INTO [dbo].[Tarjetas]
    --(
    --IdC,
    --Cards
    --)
    --VALUES
    --(
    --@IdC,
    --@NewCard
    --)
    INSERT INTO @tCards
    ([Card])
    VALUES(@NewCard)
     
    END TRY  
    BEGIN CATCH  

    IF( ERROR_NUMBER() = 2627)
    begin
    PRINT 'DISCARD' 
    continue;
    end
     
    END CATCH; 


    SET @CardCount = @CardCount + 1

    print '('+[dbo].[ToolsfnVarChar](@CardCount,'NA')+ '/'+[dbo].[ToolsfnVarChar](@pQuantity,'NA')+')'


    End

    SELECT Row#, [Card] 
    FROM @tCards
    --select @IdC,@NewCard from [dbo].[Tarjetas]

    End


    jueves, 25 de julio de 2019 19:54
  • Pudiste leer el articulo que propuse ?

    Differences between SQL Server temporary tables and table variables

    cambiar el uso de table variable por tabla temporal


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 25 de julio de 2019 19:56
  • Hola daniluz:

    Sigo viendo un código muy interesante, secuencial y procedimental, que no declarativo.

    Seguro que es muy funcional, aunque no muy rápido. Y que con eso cumple perfectamente su función.

    Dado que es un cursor, dudo mucho que el índice te sirva para algo, más bien, te penalizará su creación, ya que seguro que el conjunto que trata no es muy grande, porque sino buscarías la manera de darle la vuelta.

    En cuanto al código:

    int pQuantity = 5; 
    int pProductId = 10;
    try{
        var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=ejTres;Server=ESQUINERO";
    
        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            connection.Open();
            SqlCommand cmd = new SqlCommand("cardss", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@pQuantity", SqlDbType.Int);
            cmd.Parameters.Add("@pProductId", SqlDbType.Int);
            cmd.Parameters[0].Value = pQuantity;
            cmd.Parameters[1].Value = pProductId;
            DataTable dataTable = new DataTable();
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(dataTable);
            dataGridView1.DataSource = dataTable;
        }
    }
    catch (Exception ex)
    {
        // tratamiento de las excepciones
        throw ex;
    }

    jueves, 25 de julio de 2019 20:48