ATUALIZANDO DADOS NO SITE

PAULOOLIVEIRA 06/03/2017 15:13:54
#472216
Caros, boa tarde...

Tenho que atualizar uma base de dados num site, aproximadamente 4000 registros...

faço um reader, e tento correr ele dentro de um while....

quando chega aos 1800 registros +- , retorna o seguinte erro

[Ô]tentativa de leitura ultrapassou o fim do fluxo[Ô],

ja pesquisei nas faculdades google, atualizei o driver .net para o mais atual.. e continua o mesmo errro...

alguma ideia? grato!

DAMASCENO.CESAR 06/03/2017 15:29:21
#472217
Altera para sua conexao com o banco de dados (mysql, Oracle, Sql Server):
e tenta aí

OleDbCommand cmd2 = new OleDbCommand();
cmd2.CommandTimeout == 600
MESTRE 06/03/2017 15:42:43
#472219
Citação:

:
Caros, boa tarde...

Tenho que atualizar uma base de dados num site, aproximadamente 4000 registros...

faço um reader, e tento correr ele dentro de um while....

quando chega aos 1800 registros +- , retorna o seguinte erro

[Ô]tentativa de leitura ultrapassou o fim do fluxo[Ô],

ja pesquisei nas faculdades google, atualizei o driver .net para o mais atual.. e continua o mesmo errro...

alguma ideia? grato!



1. Qual banco de dados utiliza?
2. Normalmente em casos como esse acontece um pequeno problema Time_out conection, como está configurada sua string de conexão com o banco de dados ?
3. Tem certeza que seu Reader está certo dentro de um while com .HasRows ?
4. Porque não usa uma Stored Procedure ? ela é mais rápido do que utilizar um procedimento SQL.
PAULOOLIVEIRA 06/03/2017 16:19:34
#472221
Ola companheiros...

Damasceno, ja coloquei o timeout na conexao , e tb. no command, como 9999 , transfere 1800 registros depois da pau...

Mestre.. começa a subir os dados, como mencionei acima...
MESTRE 06/03/2017 16:36:09
#472223
Citação:

:
Ola companheiros...

Damasceno, ja coloquei o timeout na conexao , e tb. no command, como 9999 , transfere 1800 registros depois da pau...

Mestre.. começa a subir os dados, como mencionei acima...


ja tentou utilizando Stored Procedure??
KERPLUNK 06/03/2017 23:23:52
#472234
Mais uma listinha:
1 - Certifique-se que a conexão é aberta, fechada e descartada em cada operação.
2 - Conforme o banco de dados, é possível a inserção em lote, ou seja, vários comandos de inserção de uma só vez.
3 - Certifique-se que esse erro de leitura está acontecendo com o banco de dados do server e não o seu local.
PAULOOLIVEIRA 07/03/2017 09:16:52
#472240
Kerplunk, bom dia!!

A cada operacao fecho a conexao e faço o dispose.. conforme abaixo....

O problema é quando estou fazendo o while no data reader....

veja funcao que faz o update no site...

public void GravaSite(string instrucao)
{
site.Dispose();
site.Close();
site.Open();
MySqlCommand cmd = new MySqlCommand(instrucao, site);
try
{
if (site.State == ConnectionState.Closed)
{
site.Open();
}
cmd.ExecuteNonQuery();
}
catch (MySqlException ex)
{
clsFuncoes.xsql = [Ô][Ô];
clsFuncoes.xsql = [Ô]insert into logs([ô][Ô]+DateTime.Now.Date+ [Ô][ô] , [ô]Erro na transferencia: [Ô] + ex.ToString() +[Ô][ô])[Ô];
GravaSite(clsFuncoes.xsql);
listaAtividades.Items.Add([Ô]Erro de transferencia de dados....[Ô] + DateTime.Now.Date + [Ô] [Ô] + DateTime.Now.TimeOfDay);
Application.Exit();
}
finally
{
if (site.State == ConnectionState.Open)
{
site.Close();
site.Dispose();

}
}
}

data reader... atual....

MySqlDataReader drExames;
// pegando os dados dos associados no servidor
sql = [Ô][Ô];
sql = [Ô]select * from exames where categoria = [ô]SP[ô] or categoria = [ô]SR[ô] or categoria = [ô]SC[ô] or categoria = [ô]SI[ô] or categoria = [ô]TP[ô][Ô];
i = 0;
MySqlCommand cmdExames = new MySqlCommand(sql, conexao);
cmdExames.CommandTimeout = 999;
drExames = cmdExames.ExecuteReader(CommandBehavior.CloseConnection);
while (drExames.Read())
{
clsFuncoes.xsql = [Ô][Ô];
clsFuncoes.xsql = [Ô]insert into exames (categoria,codigo,depende,dataAtual,validade,hoje,tipo,controle) [Ô];
clsFuncoes.xsql = clsFuncoes.xsql + [Ô] values([ô][Ô] + drExames[[Ô]categoria[Ô]].ToString() + [Ô][ô],[ô][Ô];
clsFuncoes.xsql = clsFuncoes.xsql + drExames[[Ô]codigo[Ô]].ToString() + [Ô][ô],[ô][Ô];
clsFuncoes.xsql = clsFuncoes.xsql + drExames[[Ô]depende[Ô]].ToString() + [Ô][ô],[ô][Ô];
if (string.IsNullOrEmpty(drExames[[Ô]dataatual[Ô]].ToString()))
{ clsFuncoes.xsql = clsFuncoes.xsql + null + [Ô][ô],[ô][Ô];}
else{ clsFuncoes.xsql = clsFuncoes.xsql + funcoes.Transforma(Convert.ToDateTime(drExames[[Ô]dataatual[Ô]].ToString())) + [Ô][ô],[ô][Ô];}
if (string.IsNullOrEmpty(drExames[[Ô]validade[Ô]].ToString()))
{ clsFuncoes.xsql = clsFuncoes.xsql + null + [Ô][ô],[ô][Ô]; }
else{ clsFuncoes.xsql = clsFuncoes.xsql + funcoes.Transforma(Convert.ToDateTime(drExames[[Ô]validade[Ô]].ToString())) + [Ô][ô],[ô][Ô]; }
if (string.IsNullOrEmpty(drExames[[Ô]hoje[Ô]].ToString()))
{ clsFuncoes.xsql = clsFuncoes.xsql + null + [Ô][ô],[ô][Ô]; }
else{ clsFuncoes.xsql = clsFuncoes.xsql + funcoes.Transforma(Convert.ToDateTime(drExames[[Ô]hoje[Ô]].ToString())) + [Ô][ô],[ô][Ô]; }
clsFuncoes.xsql = clsFuncoes.xsql + drExames[[Ô]tipo[Ô]].ToString() + [Ô][ô],[ô][Ô];
clsFuncoes.xsql = clsFuncoes.xsql + drExames[[Ô]controle[Ô]].ToString() + [Ô][ô])[Ô];
GravaSite(clsFuncoes.xsql);
Application.DoEvents();
i++;
lblDescricao.Text = [Ô]Transferindo Exames...[Ô];
lblQuantia.Text = Convert.ToString(i);
}

drExames.Dispose();
strLog = [Ô]Finalizado PASSO3 - Atualizado Dados Exames do Associado.[Ô] + DateTime.Now.Date + [Ô] [Ô] + DateTime.Now.TimeOfDay;
listaAtividades.Items.Add(strLog);
listaAtividades.Items.Add([Ô]Total Registros..[Ô] + i);


Grato!

KERPLUNK 07/03/2017 20:34:08
#472247
Nossa... amigo, o que você está precisando é organizar esse código e parar imediatamente de usar esse método [Ô]GravaSite[Ô]. Conexões remotas e recursividade não se falam muito bem...
GUIMORAES 08/03/2017 09:13:45
#472261
Resposta escolhida
PAULOOLIVEIRA,

Seu código está um pouco desorganizado...
Mas vamos lá. Pelo que pude notar, você está fazendo uma leitura e com base nos dados, está fazendo um insert em outra tabela.
Quando você faz o insert, você acaba fechando a conexão, mas dentro do seu código [Ô]Principal[Ô], onde está ocorrendo a recursividade, ela deveria estar ativa, pois o datareader ainda continua realizando a leitura.

Para entender melhor, vamos fazer uma pequena orientação a objetos, coisa simples e que pode resolver seu problema.

Aqui, devemos criar uma classe para receber os dados da tabela, pense que esta classe deve ser o espelho da sua tabela no banco de dados.

ex
  
public Class Exames
{
string categoria {get;set;}
int32 codigo {get;set;}
string dependente {get;set;}
...
}



Aqui, iremos instanciar uma lista da classe exames
  

List<Exames> listaDeExames = new List<Exames>();

string sql = [Ô][Ô];
sql = [Ô]select * from exames where categoria = [ô]SP[ô] or categoria = [ô]SR[ô] or categoria = [ô]SC[ô] or categoria = [ô]SI[ô] or categoria = [ô]TP[ô][Ô];

MySqlDataReader drExames;

MySqlCommand cmdExames = new MySqlCommand(sql, conexao);
cmdExames.CommandTimeout = 999;
drExames = cmdExames.ExecuteReader(CommandBehavior.CloseConnection);

while(drExames.Read)
{
//Aqui iremos instanciar um objeto do tipo exame, para que possamos adicionar ele na lista.
Exames exames = new Exames();

exames.categoria = drExames[[Ô]categoria[Ô]];
exames.codigo = Convert.ToInt32(drExames[[Ô]codigo[Ô]]);
exames.dependente = drExames[[Ô]dependente[Ô]]

//Após adicionar os valores aos atributos da classe, iremos adicionar essa [Ô]Instancia[Ô] da classe na lista.

listaDeExames.add(exames);

}

//Fechar a sua conexão aqui.

//Depois que você pegou os dados, basta percorrer o seu <list> e adicionar no banco.
foreach(var item in listaDeExames)
{
//Aqui dentro você faz o insert
sql = [Ô]insert into exames (categoria,codigo,depende,dataAtual,validade,hoje,tipo,controle) values[Ô];
sql += [Ô](@categoria,@codigo,@depende,@dataAtual,@validade,@hoje,@tipo,@controle);

//Conectar seu banco
MySqlCommand cmd = new MySqlCommand(sql, site);
cmd.Parameters.AddWithValue([Ô]@categoria[Ô],item.categoria);
cmd.Parameters.AddWithValue([Ô]@codigo[Ô],item.codigo);
...
...
...
cmd.ExecuteNonQuery();

//Fechar sua conexão
}



Isto seria o básico para sair desta redundância que você está fazendo, organizar o código vai muito além disso que mostrei acima, e o uso da orientação a objetos é fundamental para um código organizado, limpo e eficiente.
PAULOOLIVEIRA 15/03/2017 07:29:37
#472445
Caros amigos,

Muito obrigado pela atenção... GUIMORAES123, segui sua dica , e resolveu minha dificuldade...

Realmente sempre serei [Ô]Eterno Aprendiz[Ô]

Abç!!
Tópico encerrado , respostas não são mais permitidas