MÉTODO USANDO REFERENCIA
Olá amigos, estou precisando de ajuda para usar um método utilizando referencia a um OleDbDataReader, caso eu esteja errado por favor me corrijam porque começei utilizar agora C#, abaixo parte do código que da o erro:
OleDbDataReader dr;
ProcuraProduto(ref dr); //erro ocorre nesta linha (Use of unassigned local variable [ô]dr[ô])
.....
//método criado
public void ProcuraProduto( ref OleDbDataReader drProd)
a ideia é fazer uma pesquisa no método e retornar o resultado.
OleDbDataReader dr;
ProcuraProduto(ref dr); //erro ocorre nesta linha (Use of unassigned local variable [ô]dr[ô])
.....
//método criado
public void ProcuraProduto( ref OleDbDataReader drProd)
a ideia é fazer uma pesquisa no método e retornar o resultado.
Aqui no fórum tem um tópico fixo sobre isso, coloquei vários exemplos lá.
Kerplunk , vc poderia mandar o link para que eu pudesse ver sua postagem?
Sinceramente se você quer simplesmente fazer isso
Então deveria fazer isso
Não tem porque usar referencia se precisa retornar apenas um valor, pra isso existe o retorno do método.
Quando a passar por referencia, existem duas formas no C#, uma que você passa uma variável já inicializada que pode ter o seu valor modificado pelo método, que no caso é a que você tentou usar, com o keyword ref, e a outra é a que você pode passar uma variável ainda não inicializada que vai receber um valor do método, que é usando o keyword out
Neste caso funcionaria para você, seria só trocar o ref por out também na chamada da função, porém ainda digo que se a função só retorna um valor então use o valor de retorno dela e não o out
public void ProcuraProduto( ref OleDbDataReader drProd)
Então deveria fazer isso
public OleDbDataReader ProcuraProduto()
Não tem porque usar referencia se precisa retornar apenas um valor, pra isso existe o retorno do método.
Quando a passar por referencia, existem duas formas no C#, uma que você passa uma variável já inicializada que pode ter o seu valor modificado pelo método, que no caso é a que você tentou usar, com o keyword ref, e a outra é a que você pode passar uma variável ainda não inicializada que vai receber um valor do método, que é usando o keyword out
public void ProcuraProduto(out OleDbDataReader drProd)
Neste caso funcionaria para você, seria só trocar o ref por out também na chamada da função, porém ainda digo que se a função só retorna um valor então use o valor de retorno dela e não o out
boa tarde Ocelot, o que você disse perfeito, mas agora quando executo as linhas abaixo após passar pela segunda linha ocorre o erro segue abaixo:
dr = ProcuraProduto();
dr.Read(); // erro - tentativa invalida de chamar Read quando o leitor estava fechado
dr = ProcuraProduto();
dr.Read(); // erro - tentativa invalida de chamar Read quando o leitor estava fechado
Ai o problema já é dentro do ProcuraProduto, como o erro não foi um NullReferenceException então ele está retornando o datareader, porém este está sendo retornada já fechado.
estou enviando o método caso possa me ajudar de alguma forma.
[txt-color=#0000f0] public OleDbDataReader ProcuraProduto()
{
using (OleDbConnection conexaoAccess = clsAccess.getInstancia().getConexao())
{
try
{
conexaoAccess.Open();
OleDbCommand cmd = new OleDbCommand([Ô]Select probar, prodes, proven, proest from Produto where probar = [ô][Ô] + txtprobar.Text + [Ô][ô][Ô], conexaoAccess);
OleDbDataReader dr = cmd.ExecuteReader();
return dr;
}
catch (OleDbException oledbex)
{
MessageBox.Show([Ô]Erro de acesso aos dados [Ô] + oledbex.Message, [Ô]Erro[Ô]);
OleDbCommand cmd = new OleDbCommand([Ô]Select probar, prodes, proven, proest from Produto where probar = [ô]xxxxxxxxxxxx[ô][Ô], conexaoAccess);
OleDbDataReader dr = cmd.ExecuteReader();
return dr;
}
finally
{
//fecha a conexao
conexaoAccess.Close();
}
}
}
[/txt-color]
[txt-color=#0000f0] public OleDbDataReader ProcuraProduto()
{
using (OleDbConnection conexaoAccess = clsAccess.getInstancia().getConexao())
{
try
{
conexaoAccess.Open();
OleDbCommand cmd = new OleDbCommand([Ô]Select probar, prodes, proven, proest from Produto where probar = [ô][Ô] + txtprobar.Text + [Ô][ô][Ô], conexaoAccess);
OleDbDataReader dr = cmd.ExecuteReader();
return dr;
}
catch (OleDbException oledbex)
{
MessageBox.Show([Ô]Erro de acesso aos dados [Ô] + oledbex.Message, [Ô]Erro[Ô]);
OleDbCommand cmd = new OleDbCommand([Ô]Select probar, prodes, proven, proest from Produto where probar = [ô]xxxxxxxxxxxx[ô][Ô], conexaoAccess);
OleDbDataReader dr = cmd.ExecuteReader();
return dr;
}
finally
{
//fecha a conexao
conexaoAccess.Close();
}
}
}
[/txt-color]
Tópico encerrado , respostas não são mais permitidas