ERRO AO PRENCHER TABELA VAZIA NO CSHARP

MARCIOGUIMARAES 10/08/2011 12:49:46
#381252
Ola pessoal, já agradeço antecipado qualquer ajuda.

Estou desenvolvendo um sincronizador de arquivo do antigo Access para o Postgres, mas meu problema não está sendo o Postgres e sim o Access. Coloquei um campo chamado [Ô]sincronismo[Ô] dentro do Access com apenas um digito pra marcar os registros que já foram transferidos, mas quanto o arquivo está todo transferido, dá um erro no preenchimento da tabela.
Fiz assim:


consulta = [Ô]Select count(sincronismo) as wContagem from [Ô] + wA_Tabela +[Ô] where sincronismo <> [ô]x[ô][Ô];
conexao = [Ô]Provider=Microsoft.Jet.oledb.4.0; Data Source=C:\\banco/[Ô] + wArquivo + [Ô].mdb[Ô];
using (OleDbDataAdapter Db_Access = new OleDbDataAdapter(consulta, conexao))
{
DataTable Tb_Access = new DataTable(wA_Tabela);
Db_Access.Fill(Tb_Access); <============ o erro aparece aqui apenas quando não existem registros.
.......
.......
.......

A variável [Ô]consulta[Ô] foi alterada pra tentar resolver, mas não tive sucesso nem asism.

consulta = [Ô]Select * from [Ô] + wA_Tabela +[Ô] where sincronismo <> [ô]x[ô][Ô];
=> assim a tabela ficou vazia, não aparecendo nenhum campo, nem registro e dá erro no Fill;

consulta = [Ô]Select count(sincronismo) as wContagem from [Ô] + wA_Tabela +[Ô] where sincronismo <> [ô]x[ô][Ô];
==> assim não mudou nada, só achei muito estranho que ele não devolveu nem a variável wContagem como 0, não está aparecendo nenhum registro mesmo na tabela.

toda vez que o campo for transferido, eu gravo um X no campo sincronismo, por isso gostaria de ler apenas os que não foram sincronizados ainda.

Já usei vários comando mas todos depois do Fill, o único que achei antes não funciona nem quando tem alguma coisa na tabela

Obrigado a todos
KERPLUNK 10/08/2011 13:58:43
#381266
Resposta escolhida
Count, retorna null quando não encontra nada, e esse é o erro... vc não pode preencher nada com [Ô]null[Ô]
O melhor a fazer é usar um datareader e verificar a propriedade HasRows dele...
CARLOSRAMIREZ 10/08/2011 14:20:33
#381269
Bem, uma outra alternativa ao que o KERPLUNK citou é você procurar alguma instrução como o NVL do oracle, e adicioná-la a sua sentença. Por exemplo [Ô]Select NVL(count(sincronismo) , 0)as wContagem from [Ô] + wA_Tabela +[Ô] where sincronismo <> [ô]x[ô][Ô] ou seja, se o seu count retornar nulo, e retorna 0 na sentença.
MARCIOGUIMARAES 10/08/2011 18:01:54
#381296
Desculpem a demora, mas estava testando as duas formas que vocês falaram e não consegui fazer nenhuma funcionar, mas agradeço a dica do Kerplunk que me ajudou a [Ô]resolver[Ô] o problema, deixei o erro acontecer de propósito e tratei ele. Vou colocar aqui como ficou pra ver se ajuda mais algum novato com o mesmo problema.

...
...
...
string consutla;
string conexao;
int wA_QtdRegistro;
consulta = [Ô]Select count(sincronismo) as wContagem from [Ô] + wA_Tabela +[Ô] where sincronismo <> [ô]x[ô][Ô];
conexao = [Ô]Provider=Microsoft.Jet.oledb.4.0; Data Source=C:\\Banco/[Ô] + wA_Arquivo + [Ô].mdb[Ô];
using (OleDbDataAdapter Db_Access = new OleDbDataAdapter(consulta, conexao))
{
try
{
DataTable Tb_Access = new DataTable(wA_Tabela);
Db_Access.Fill(Tb_Access);
wA_QtdRegistros = Convert.ToInt32(Tb_Access.Rows[0][[Ô]wContagem[Ô]].ToString().Trim());
}
catch(Exception)
{
wA_QtdRegistros = 0;
}
}
if (wA_QtdRegistros > 0)
{
...
...
...

E aos que forem usar o Postgres, a dica do CarlosRamirez é muito boa, existe o NVL pena que meu problema foi com o [Ô]vovô[Ô] Access, mas valeu pela dica, aprendí mais uma.

Sei que deve ter um jeito muito melhor e mais profissional, mas agradeço mesmo pelas ajudas. Um abraço a todos.
FABIOPAGANINI 12/08/2011 00:35:32
#381519
Não esqueça de encerrar o tópico caso a duvida foi sanada.
assim o tópico nao aparece mais nas consultas de dúvidas pendentes.
E qualifique a resposta que mais lhe foi útil
Abraços!
Tópico encerrado , respostas não são mais permitidas