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

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 @tCardsy 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 ?
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- Propuesto como respuesta Pablo RubioModerator jueves, 25 de julio de 2019 20:17
-
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...
-
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))
asLuego 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.
- Propuesto como respuesta Pablo RubioModerator jueves, 25 de julio de 2019 20:17
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 25 de julio de 2019 20:17
-
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
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 25 de julio de 2019 20:17
-
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; }