ATUALIZANDO DADOS NO SITE
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!
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!
Altera para sua conexao com o banco de dados (mysql, Oracle, Sql Server):
e tenta aÃ
OleDbCommand cmd2 = new OleDbCommand();
cmd2.CommandTimeout == 600
e tenta aÃ
OleDbCommand cmd2 = new OleDbCommand();
cmd2.CommandTimeout == 600
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.
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...
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...
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??
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.
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.
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!
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!
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...
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
Aqui, iremos instanciar uma lista da classe exames
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.
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.
Caros amigos,
Muito obrigado pela atenção... GUIMORAES123, segui sua dica , e resolveu minha dificuldade...
Realmente sempre serei [Ô]Eterno Aprendiz[Ô]
Abç!!
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