How to resolve a problem in C# when executing the ". Executereader()" command and error is returned?

Asked

Viewed 186 times

0

I am trying to execute the command "Executereader()" and always returns the error "threw an Exception of type 'System.Invalidoperationexception".

The idea of this part of the code is:

  1. Open a ". xls" file (Is working)
  2. Get the company’s CNPJ inside the file (It’s working)
  3. Search if this company is already registered (The mistake happens here)
  4. Search if the note (related to this company) has already been registered
  5. Place the ". xls" file data related to this note in a temporary table.

As I said, I’m new to the C# language and I still can’t quite understand how this type of research works.

Could you help me with that?

I’ll put this part of the code here.

From now on, thank you.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
using Importador_SCI.Classes;
using System.Data.SqlClient;

namespace Importador_SCI.Classes
{
    class clsImporta
    {
        public OleDbConnection _olecon;
        private OleDbCommand _oleCmd;
        private String _StringConexao;
        private String NomeCopia;
        private String Diretorio;
        private String Planilha;
        private int DeuErro;
        private String Documento;
        private String CNPJ;
        private int StatusGravacao;
        private String CodEmpresa;

        //Função de Importação do arquivo para as tabelas temporárias
        public bool ImportaSCI(string CaminhoArquivo)
        {

            //////////////////////////////////
            //      Status de Gravação      //
            //------------------------------//
            //  0 = Tudo OK para importar   //
            //  1 = Nota já importada       //
            //  2 = Empresa não cadastrada  //
            //  3 = Produto não cadastrado  //
            //////////////////////////////////

            //Cria uma cópia temporária do arquivo para que esta seja importada
            Diretorio = System.IO.Path.GetDirectoryName(CaminhoArquivo);
            NomeCopia = "#Tmp_Copia_Imp.xls";
            System.IO.File.Copy(CaminhoArquivo, Diretorio + "\\" + NomeCopia, true);

            //Preenche Variável de conexão
            _StringConexao = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;ReadOnly=False';", Diretorio + "\\" + NomeCopia);

            //Zera os erros
            DeuErro = 0;

            //Abre o arquivo
            AbreConexao();

            try
            {
                //Pega o Nome da primeira Planilha
                DataTable dt_Plan = _olecon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                foreach (DataRow dr in dt_Plan.Rows)
                {
                    Planilha = dr[2].ToString();
                    break;
                }

                //Faz pesquisa na primeira planilha
                this._oleCmd.CommandText = "SELECT * FROM [" + Planilha + "]";

                OleDbDataReader reader = this._oleCmd.ExecuteReader();

                //Verifica se existem linhas para serem importadas
                if (reader.HasRows)
                {
                    //Cria a tabela temporária 'Tmp_NotasEntradas'
                    StringBuilder sql = new StringBuilder();

                    sql.Append("CREATE TABLE #Tmp_NotasEntradas (");
                    sql.Append("StatusGravacao [int] NOT NULL, ");
                    sql.Append("[nNF] [nvarchar](9) NOT NULL, ");
                    sql.Append("[natOp] [nvarchar](60) NULL, ");
                    sql.Append("[cod_empresa] [int] NULL,");
                    sql.Append("[Operação] [int] NULL, ");
                    sql.Append("[contCFOP] [int] NULL, ");
                    sql.Append("[indPag] [int] NULL, ");
                    sql.Append("[mod] [smallint] NULL, ");
                    sql.Append("[serie] [nvarchar](3) NULL, ");
                    sql.Append("[dEmi] [smalldatetime] NOT NULL, ");
                    sql.Append("[dSaiEnt] [smalldatetime] NULL, ");
                    sql.Append("[hSaiEnt] [time](7) NULL, ");
                    sql.Append("[DataLancamento] [smalldatetime] NULL, ");
                    sql.Append("[tpNF] [smallint] NULL,");
                    sql.Append("[Condição] [int] NULL, ");
                    sql.Append("[Transportadora] [int] NULL, ");
                    sql.Append("[status] [tinyint] NULL, ");
                    sql.Append("[modFrete] [bit] NULL, ");
                    sql.Append("[qVol] [numeric](10, 2) NULL, ");
                    sql.Append("[esp] [nvarchar](50) NULL, ");
                    sql.Append("[nVol] [nvarchar](60) NULL, ");
                    sql.Append("[pesoL] [numeric](10, 2) NULL,");
                    sql.Append("[pesoB] [numeric](10, 2) NULL, ");
                    sql.Append("[vICMS] [numeric](10, 2) NULL, ");
                    sql.Append("[vBC] [numeric](10, 2) NULL, ");
                    sql.Append("[vBCST] [numeric](10, 2) NULL, ");
                    sql.Append("[vST] [numeric](10, 2) NULL, ");
                    sql.Append("[vProd] [numeric](10, 2) NULL, ");
                    sql.Append("[vFrete] [numeric](10, 2) NULL, ");
                    sql.Append("[vSeg] [numeric](10, 2) NULL, ");
                    sql.Append("[vDesc] [numeric](10, 2) NULL, ");
                    sql.Append("[vII] [numeric](10, 2) NULL, ");
                    sql.Append("[vIPI] [numeric](10, 2) NULL, ");
                    sql.Append("[vPIS] [numeric](10, 2) NULL, ");
                    sql.Append("[vCOFINS] [numeric](10, 2) NULL, ");
                    sql.Append("[vOutro] [numeric](10, 2) NULL, ");
                    sql.Append("[vNF] [numeric](10, 2) NULL, ");
                    sql.Append("[vRetPIS] [numeric](10, 2) NULL, ");
                    sql.Append("[vRetCofins] [numeric](10, 2) NULL, ");
                    sql.Append("[vretCSLL] [numeric](10, 2) NULL, ");
                    sql.Append("[vBCIRRF] [numeric](10, 2) NULL, ");
                    sql.Append("[vRetIRRF] [numeric](10, 2) NULL, ");
                    sql.Append("[vBCRetPrev] [numeric](10, 2) NULL, ");
                    sql.Append("[vRetPrev] [numeric](10, 2) NULL, ");
                    sql.Append("[observacoes] [nvarchar](255) NULL, ");
                    sql.Append("[arquivo] [xml] NULL, ");
                    sql.Append("[chaveAcesso] [varchar](60) NULL, ");
                    sql.Append("[infAdFisco] [nvarchar](255) NULL, ");
                    sql.Append("[class1] [char](1) NULL, ");
                    sql.Append("[ObservacaoEBS] [nvarchar](255) NULL, ");
                    sql.Append("[xmlCancelado] [xml] NULL, ");
                    sql.Append("[NumeroOC] [nvarchar](50) NULL, ");
                    sql.Append("[IndustrializadoPorOP] [bit] NOT NULL, ");
                    sql.Append("[NotaOperacaoTriangular] [int] NULL, ");
                    sql.Append("[EmpresaIndustrializadora] [int] NULL, ");
                    sql.Append("[CreditoICMS] [numeric](10, 2) NULL, ");
                    sql.Append("[Aliquota] [numeric](10, 4) NULL, ");
                    sql.Append("[ICMSSNST] [int] NULL, ");
                    sql.Append("[vICMSST] [numeric](10, 2) NULL ");
                    sql.Append(")");


                    System.Data.SqlClient.SqlCommand cmd = new SqlCommand(sql.ToString(), clsConecta.Con);

                    try
                    {
                        //Executa o comando de criação da tabela temporária 'Tmp_NotasEntradas'
                        cmd.ExecuteNonQuery();

                        //Percorre o arquivo verificando se a empresa está cadastrada e se a nota para essa empresa já foi importada
                        while (reader.Read())
                        {
                            if (reader[10].ToString() != "Documento" && reader[10].ToString() != "")
                            {
                                Documento = reader[10].ToString();
                                CNPJ = reader[7].ToString().Replace(".", "").Replace("-", "").Replace("/", "");

                                //Pesquisa se a empresa está cadastrada, pelo CNPJ
                                cmd.CommandText = "SELECT COD_EMPRESA FROM Empresas WHERE CNPJ = '" + CNPJ.ToString() + "'";

                                SqlDataReader dr = cmd.ExecuteReader();

                                if (dr.FieldCount == 0)
                                {
                                    StatusGravacao = 2;
                                }
                                else
                                {

                                   **O ERRO ACONTECE NESSA LINHA ABAIXO**
                                    //Pega o Código da Empresa
                                    CodEmpresa = dr["COD_EMPRESA"].ToString();

                                    //Verifica se a nota já foi importada
                                    cmd.CommandText = "SELECT COUNT(*) AS QNT " + 
                                                      "FROM NotasEntradas N " +
                                                           "INNER JOIN Empresas E ON N.cod_empresa = E.COD_EMPRESA" +
                                                      "WHERE N.nNF = " + Documento.ToString() +
                                                            "AND E.CNPJ = '" + CNPJ.ToString() + "'";

                                    dr = cmd.ExecuteReader();

                                    if (dr.FieldCount > 0)
                                    {
                                        StatusGravacao = 1;
                                    }
                                    else
                                    {
                                        //Adiciona essa nota na tabela temporária
                                        StringBuilder sqlQuery = new StringBuilder();
                                        sqlQuery.Append("INSERT INTO #Tmp_NotasEntradas () VALUES (");


                                        cmd.CommandText = sqlQuery.ToString();
                                        cmd.ExecuteNonQuery();
                                    }
                                }



                                //Insere os produtos relacionados com as notas na tabela 'Tmp_Produtos'

                                //Insere as faturas relacionadas com as notas na tabela 'Tmp_Faturas'

                                //Se tudo ocorreu bem, insere todos os dados das tabelas temporárias nas oficiais
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Ocorreu um erro ao se tentar criar a tabela temporária 'Tmp_NotasEntradas'.\n\n Mensagem de Erro: \n" + ex.Message, "SISTOP - Erro no Carregamento", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        //Atribui False para o retorno
                        DeuErro = 1;
                    }
                }
                else
                {
                    MessageBox.Show("O arquivo escolhida não possue nenhuma linha de informação válida para ser importada", "SISTOP - Erro no Carregamento", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    //Atribui False para o retorno
                    DeuErro = 1;
                }

                reader.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocorreu um erro na importação do arquivo.\n\n Mensagem de Erro: \n" + ex.Message, "SISTOP - Erro no Carregamento", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //Atribui False para o retorno
                DeuErro = 1;
            }

            //Fecha arquivo
            FechaConexao();

            //Exclue o arquivo Cópia
            System.IO.File.Delete(Diretorio + "\\" + NomeCopia);


            //Ao final, retorna FALSE caso tenha ocorrido algum erro ou TRUE caso tenha dado certo
            if (DeuErro == 1)
            {
                DeuErro = 0;
                return false;
            }
            else {
                return true;
            }
        }
  • Your code is unnecessarily complicated, you don’t need all that. It does not seem to need a temporary table in the database, store in memory... you can put line break in the string using a @ before the first "... deuErro = 0/1 use a Boolean... StatusGravacao use an Enum... make a method to read the file, another to search the company. As for the specific error, point out which line occurs, and which Exception message.

  • The error message is this "'dr["COD_EMPRESA"]' threw an Exception of type 'System.Invalidoperationexception" {"Invalid read attempt when no data exists." }. As for storing in memory, instead of the temporary table, I will search how I can do it. Thank you for explaining the line break. As for the variables, there is no problem as they are, because it is temporary this way same.

  • about the mistake, just missed a dr.Read() so that the Reader points to the first record, save in memory, only use a List<T> where T is the type of its object.

  • That’s right. Sorry for the lack of experience in this language. I spent a long time researching and had not understood what could be wrong.

  • No need to apologize, everyone had the day 1, rsrs but recommend to take a look here in the community have a lot of material showing how to elaborate the questions, although already solved your problem, it is bad to elaborate an answer with a question that is not clear, try to put only the relevant part. Good studies

  • 1

    Beyond the .Read(), check whether the dr has lines before trying to read and assign values, there is the property HasRows

Show 1 more comment
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.