PASSAR DATATABLE P/ STORED PROCEDURE EM SQL SERVER

LVFIOROT 10/12/2014 12:30:20
#443112
prefiro sempre retornar uma tabela (select .... )

Mas se prefere output, segue exemplos

http://stackoverflow.com/questions/10905782/using-stored-procedure-output-parameters-in-c-sharp
LVFIOROT 10/12/2014 12:32:10
#443113
outro exemplo ainda mais claro e explicado

http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output


TUNUSAT 10/12/2014 15:51:47
#443118
LVFIOROT,

Preciso de mais uma ajuda...
... montei uma outra Stored Procedure para devolver individualmente os parâmetros.
Testei-a no [Ô]Microsoft SQL Server Manager Studio[Ô] e funcionou:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SelectTestVariableVariable]
(
@TableVar dbo.TableVariable READONLY,
@NameR VARCHAR(10) OUTPUT,
@AddrR VARCHAR(10) OUTPUT
)
AS
BEGIN

SELECT @NameR = Name, @AddrR = Addr
FROM dbo.TestTableVariable
WHERE ID IN (
SELECT ID
FROM @TableVar
)

RETURN
END


Testei assim:
DECLARE @TableVar dbo.TableVariable
insert into @TableVar values (3)

DECLARE @NameR VarChar(10)
DECLARE @AddrR VarChar(10)

execute SelectTestVariableVariable @TableVar, @NameR OUTPUT, @AddrR OUTPUT

select @NameR, @AddrR


Mas não consigo resgatá-la no código C# (abaixo o código fonte completo):
        static void Main(string[] args)
{
try
{
DataSet dataset = new DataSet();
DataTable dataTable = new DataTable();
string strName = string.Empty;
string strAddr = string.Empty;


dataTable.Columns.Add([Ô]ID[Ô]);

var dr = dataTable.NewRow();

dr[[Ô]ID[Ô]] = 2;
dataTable.Rows.Add(dr);

//Configure seu acesso ao seu Banco de Dados lá no aquivo [Ô]App.Config[Ô]!
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[[Ô]LOCAL TESTE[Ô]].ConnectionString))
{
conn.Open();

using (SqlCommand cmd = new SqlCommand([Ô][dbo].[SelectTestTableVariable][Ô]))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;

cmd.Parameters.AddWithValue([Ô]@TableVar[Ô], dataTable);

//Usando o DataAdapter para preencher o DataTable
using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
{
adp.Fill(dataset);
}
}

using (SqlCommand cmd = new SqlCommand([Ô][dbo].[SelectTestVariableVariable][Ô]))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;

cmd.Parameters.AddWithValue([Ô]@TableVar[Ô], dataTable);

//Retorno OUTPUT
cmd.Parameters.Clear();
cmd.Parameters.Add(new SqlParameter([Ô]@NameR[Ô], strName));
cmd.Parameters[[Ô]@NameR[Ô]].Direction = ParameterDirection.Output;
cmd.Parameters[[Ô]@NameR[Ô]].Size = 10;

cmd.Parameters.Add(new SqlParameter([Ô]@AddrR[Ô], strAddr));
cmd.Parameters[[Ô]@AddrR[Ô]].Direction = ParameterDirection.Output;
cmd.Parameters[[Ô]@AddrR[Ô]].Size = 10;

//SqlParameter pvNameR = new SqlParameter();
//pvNameR.ParameterName = [Ô]@NameR[Ô];
//pvNameR.DbType = DbType.String;
//pvNameR.Size = 10;
//pvNameR.Direction = ParameterDirection.Output;
//cmd.Parameters.Add(pvNameR);

//SqlParameter pvAddrR = new SqlParameter();
//pvAddrR.ParameterName = [Ô]@AddrR[Ô];
//pvAddrR.DbType = DbType.String;
//pvAddrR.Size = 10;
//pvAddrR.Direction = ParameterDirection.Output;
//cmd.Parameters.Add(pvAddrR);

try
{
int sqlRows = cmd.ExecuteNonQuery();
Console.WriteLine(cmd.Parameters[[Ô]@NameR[Ô]].Value.ToString());

if (sqlRows > 0)
{
Console.Write([Ô] - [Ô]);
Console.WriteLine(cmd.Parameters[[Ô]@NameR[Ô]].Value.ToString());
Console.WriteLine(strName);
}
}
catch (Exception e)
{
Console.WriteLine([Ô]Insere tipo de exceção: {0}[Ô], e.GetType());
Console.WriteLine([Ô] - Mensagem: {0}[Ô], e.Message);
}
}
}

//Mostrar na tela o retorno da tabela.
if (dataset.Tables.Count > 0)
{
if (dataset.Tables[0].Rows.Count > 0)
{
Console.WriteLine([Ô]1°) EXEMPLO - RETORNANDO VIA TABELA: [Ô]);
Console.Write([Ô] - Enviou um número dentro da tabela: [Ô]);
Console.WriteLine(dataTable.Rows[0][[Ô]ID[Ô]].ToString());

Console.Write([Ô] - Retornou o nome: [Ô]);
Console.WriteLine(dataset.Tables[0].Rows[0][[Ô]Name[Ô]].ToString());
Console.Write([Ô] - Retornou o endereço: [Ô]);
Console.WriteLine(dataset.Tables[0].Rows[0][[Ô]Addr[Ô]].ToString());
Console.WriteLine();
}
}
else
{
Console.WriteLine([Ô]Não mostrou nada...[Ô]);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}


[][ô]s,
Tunusat.
LVFIOROT 10/12/2014 16:18:02
#443120
não sei qual a logica você usa para programar.

fiz o exemplo do codeproject e funciona corretamente.

  
static void Main(string[] args)
{
try
{
DataSet dataset = new DataSet();
DataTable dataTable = new DataTable();
string strName = string.Empty;
string strAddr = string.Empty;


dataTable.Columns.Add([Ô]ID[Ô]);

var dr = dataTable.NewRow();

dr[[Ô]ID[Ô]] = 2;
dataTable.Rows.Add(dr);

//Configure seu acesso ao seu Banco de Dados lá no aquivo [Ô]App.Config[Ô]!
using (SqlConnection conn = new SqlConnection(@[Ô]Data Source=localhost\sqlexpress;Initial Catalog=testedb;Integrated Security=True[Ô]))
{
conn.Open();

using (SqlCommand cmd = new SqlCommand([Ô][dbo].[SelectTestTableVariable][Ô]))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;

cmd.Parameters.AddWithValue([Ô]@TableVar[Ô], dataTable);

SqlParameter pvNameR = new SqlParameter();
pvNameR.ParameterName = [Ô]@NameR[Ô];
pvNameR.DbType = DbType.String;
pvNameR.Size = 10;
pvNameR.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pvNameR);

SqlParameter pvAddrR = new SqlParameter();
pvAddrR.ParameterName = [Ô]@AddrR[Ô];
pvAddrR.DbType = DbType.String;
pvAddrR.Size = 10;
pvAddrR.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pvAddrR);

try
{
int sqlRows = cmd.ExecuteNonQuery();

Console.WriteLine(pvAddrR.Value.ToString());
Console.WriteLine(pvNameR.Value.ToString());

}
catch (Exception e)
{
Console.WriteLine([Ô]Insere tipo de exceção: {0}[Ô], e.GetType());
Console.WriteLine([Ô] - Mensagem: {0}[Ô], e.Message);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}

TUNUSAT 10/12/2014 18:22:13
#443122
LVFIOROT,

Estava errando em alguns pontos e alguns conceitos. Agora consegui fazer funcionar para os dois com duas Stored Procedures diferentes.
Obrigado, você me ajudou muito!

Vou pedir para o [ô]FoxMan[ô] subir o exemplo.

Obrigado,
Tunusat.
Página 2 de 2 [15 registro(s)]
Tópico encerrado , respostas não são mais permitidas