Array
(
)

SqlCommand, SqlDataReader

Ze Lele
   - 24 jun 2005

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


Cristiam
   - 25 jun 2005

Faça assim:

#Código


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. ;)


Sanses
   - 26 jun 2005

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


Ze Lele
   - 27 jun 2005

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;