SqlCommand, SqlDataReader

24/06/2005

0

Estou utilizando Ado.net, criei uma pesquisa generica, aonde envio o string contendo o select e o filtro (´select * from tabela where campo = @pFiltro´). Abaixo:

Function CarregaDados(pSelect:String; pFiltro:Integer):SqlDataReader
var conn:SqlConnection; SqlCmd:SqlCommand; pFiltroparam:SqlParameter;
begin
conn := SqlConnection.Create(´string de conexao´);

Sqlcmd := SqlCommand.Create(pSelect,conn);

pFiltroparam := SqlParameter.Create(´@pFiltro´, SqlDbType.Int, 4);
pFiltroparam.Value := TObject(pFiltro);
SqlCmd.Parameters.Add(pFiltroparam);

conn.Open;
result := SqlCmd.ExecuteReader(CommandBehavior.CloseConnection);

end;

No evento do botao faço a chamada a funcao:

procedure botao evento click
var vConsulta:SqlDataReader;
begin

try
DataGrid1.DataSource := CarregaDados(´Select * from Tabela where campo = @pFiltro´,Convert.ToInt32(txtCodigo.text));
DataGrid1.Databind();

finally

end;

end;



E não aparece nada no datagrid... porque :?: :?: :?:

Mas quando faço a mesma operação no DropdownList já funciona...:shock:

Desde já obrigado.

Luiz Fernando


Ze Lele

Ze Lele

Responder

Posts

25/06/2005

Cristiam

Faça assim:

procedure botao evento click 
var vConsulta:SqlDataReader; 
 ds: DataSet;
begin 

try 
ds := Dataset.Create(´DataSet1´);
vConsulta := CarregaDados(´Select * from Tabela where campo = @pFiltro´,Convert.ToInt32(txtCodigo.text)); 
vConsulta.Fill(ds);
DataGrid1.DataSource := ds.tables[0];
DataGrid1.Databind(); 

finally 

end; 

end; 


Acredito q dessa forma irá funcionar. ;)


Responder

26/06/2005

Sanses

Pelo que entendi voce quer criar uma consulta generica, ou seja, utilizar a função de consulta para outras consultas ao banco também. Lembre-se que é preciso atentar para o tipo de parametro. Mas vamos lá, No evento click do botão vc tem uma variavel vConsulta do tipo datareader que não está sendo utilizada, coloque esta variavel para receber o datareader da função. ai é só ler o datareader:

vConsulta := CarregaDados(´Select * from Tabela where campo = @pFiltro´,Convert.ToInt32(txtCodigo.text));
datagrid1.datasouce := vConsulta;
while vConsulta.Read do
begin
datagrid1.databind;
end;


[]´s
Sanses


Responder

27/06/2005

Ze Lele

Desde já agradeço as respostas...

Resolvi assim, mudando o retorno da função, mas a sua solução do while eh muito boa, quanto a solução do fill eu tive problemas com o bdp nos campos Numeric aonde o conteúdo era <null> por isso a mudança para o ado.net.

A mensagem de erro que ocorre quando tento abastecer um dataset com um retorno numeric null é Input string.... não me lembro de toda a mensagem, mas com o datareader do ado.net resolveu pode retornar qq coisa.

Estou meio de pe atras com este fill ai nesta função mas assim não retornou erro ´por enquanto´.

Valew.


Function CarregaDados(pSelect:String; pFiltro:Integer):DataTable;
var conn:SqlConnection; Adapter:SqlDataAdapter; pFiltroparam:SqlParameter;
begin

conn := SqlConnection.Create(´string de conexao´);

pFiltroparam := SqlParameter.Create(´@pFiltro´, SqlDbType.Int, 4);

Adapter := SqlDataAdapter.Create(pSelect, conn);

Adapter.SelectCommand.Parameters.Add(pFiltroparam).Value := TObject(pFiltro);

Adapter.SelectCommand.CommandType:=CommandType.Text;

Result := DataTable.Create;

Adapter.Fill(Result);

end;


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar