получение нулевых значений вместо данных при отправке в Oracle - PullRequest
0 голосов
/ 30 апреля 2011

Я работаю над проектом, который требует, чтобы я взял самые последние данные из массива данных MS Access, а затем данные в существующую таблицу в Oracle.

Я почти завершил этот проект; однако у меня есть одна небольшая проблема: когда компилятор заканчивает работу консольного приложения, таблица оракула имеет одну строку, в которой каждое значение теперь равно нулю.

Я часами смотрю на эту программу, и ничего не получаю. Мне было интересно, может ли первый набор глаз помочь мне решить эту проблему.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.OracleClient;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Data.Odbc;


namespace ConsoleApplication4
{




    class Program2
    {

        static void Main(string[] args)
        {




            string connectionString = "Dsn=Gas_meter";
            string col0 = "";
            string col1 = "";
            string col2 = "";
            string col3 = "";
            string col4 = "";
            string col5 = "";
            string col6 = "";
            string col7 = "";
            string col8 = "";

Это устанавливает соединение с MS Access и получает самые последние данные из таблицы

OdbcConnection DbConnection = new OdbcConnection(connectionString);
        OdbcCommand DbCommand = DbConnection.CreateCommand();
        DbConnection.Open();
        DbCommand.CommandText = "SELECT DateTime, S1Flow, S2Flow, S3Flow, S4Flow, S1FlowTotal, S2FlowTotal, S3FlowTotal, S4FlowTotal FROM CommonStation WHERE Format(DateTime, 'mm/dd/yyyy') >=(select Format(max(DateTime),'mm/dd/yyyy') from CommonStation)";
        DbCommand.ExecuteNonQuery();
        OdbcDataReader DbReader = DbCommand.ExecuteReader();

Эта часть выводит имя поля в окно консоли. Эта и следующие команды Console.WriteLine () являются своего рода проверками работоспособности для меня, чтобы убедиться, что он захватывает все данные, которые я ищу.

int fCount = DbReader.FieldCount;
        Console.Write("");

        for (int i = 0; i < fCount; i++)
        {
            String fName = DbReader.GetName(i);
            Console.Write(fName + "\t");
        }
        Console.WriteLine();

Эта часть отправляет данные в таблицу Oracle. Здесь снова есть команда Console.WriteLine () для проверки работоспособности информации из MS Access, что я хочу.

 try
        {

        while (DbReader.Read())
        {            
            string connString = "DSN=Gas_meter_proj;Uid=cm;Pwd=cmdev123";
            OdbcConnection conn = new OdbcConnection(connString);         
            string sqlins = @"insert into Commonstation(CommStatDate_Time, S1_Flow, S2_Flow, S3_Flow, S4_Flow, S1_Flow_Total, S2_Flow_Total, S3_Flow_Total, S4_Flow_Total ) values (to_date('" +col0+"', 'MM/DD/YYYY HH:MI:SS AM' ),to_number('" + col1 + "'), to_number('" + col2 + "'), to_number('" + col3 + "'), to_number('" + col4 + "'),to_number('" + col5 + "'),to_number('" + col6 + "'),to_number('" + col7 + "'),to_number('" + col8 + "'))";
            OdbcCommand cmdnon = new OdbcCommand(sqlins, conn);
            cmdnon.Parameters.Add(col0, OdbcType.DateTime);
            cmdnon.Parameters.Add(col1, OdbcType.Int);
            cmdnon.Parameters.Add(col2, OdbcType.Int);
            cmdnon.Parameters.Add(col3, OdbcType.Int);
            cmdnon.Parameters.Add(col4, OdbcType.Int);
            cmdnon.Parameters.Add(col5, OdbcType.Int);
            cmdnon.Parameters.Add(col6, OdbcType.Int);
            cmdnon.Parameters.Add(col7, OdbcType.Int);
            cmdnon.Parameters.Add(col8, OdbcType.Int);
            conn.Open();

            col0 = DbReader["DateTime"].ToString();
            col1 = DbReader["S1Flow"].ToString();
            col2 = DbReader["S2Flow"].ToString();
            col3 = DbReader["S3Flow"].ToString();
            col4 = DbReader["S4Flow"].ToString();
            col5 = DbReader["S1FlowTotal"].ToString();
            col6 = DbReader["S2FlowTotal"].ToString();
            col7 = DbReader["S3FlowTotal"].ToString();
            col8 = DbReader["S4FlowTotal"].ToString();

            Console.Write(col0 + "\t");
            Console.Write(col1 + "\t");
            Console.Write(col2 + "\t");
            Console.Write(col3 + "\t");
            Console.Write(col4 + "\t");
            Console.Write(col5 + "\t");
            Console.Write(col6 + "\t");
            Console.Write(col7 + "\t");
            Console.Write(col8 + "\t");
            int rowsAffected = cmdnon.ExecuteNonQuery(); 
            Console.WriteLine();
            conn.Close();
            Console.WriteLine(rowsAffected);           
        }

Эта загвоздка в том случае, если при запуске программы возникает общая ошибка, у меня есть общее объяснение, что это такое и откуда оно исходит.

     }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {

                DbReader.Close();
                DbCommand.Dispose();
                DbConnection.Close();


            }

        }
    }
}

Опять же, я получаю всю информацию из MS Access, и кажется, что я получаю все данные, но есть строка, заполненная нулем. Может ли кто-нибудь помочь мне понять, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Хорошо, я решил проблему.У меня не было кода, устанавливающего значение перед отправкой его в oracle, поэтому он изначально устанавливал значение как нулевое значение, потому что это то, что было установлено в начале кода.Эта часть окончательного кода теперь работает как надо.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OracleClient;
using System.Data.SqlClient;
using System.IO;
using System.Data.Odbc;

namespace ConsoleApplication4
{    
  class Program2
  {
    static void Main(string[] args)
    {
      string connectionString = "Dsn=Gas_meter";
      string col0 = "";
      string col1 = "";
      string col2 = "";
      string col3 = "";
      string col4 = "";
      string col5 = "";
      string col6 = "";
      string col7 = "";
      string col8 = "";
      string sqlins = "";
      string connString = "DSN=Gas_meter_proj;Uid=cm;Pwd=cmdev123";
      OdbcConnection conn = new OdbcConnection(connString);
      OdbcCommand cmdnon = new OdbcCommand(sqlins, conn);
      conn.Open();
      cmdnon.Parameters.Add(col0, OdbcType.DateTime);
      cmdnon.Parameters.Add(col1, OdbcType.Numeric);
      cmdnon.Parameters.Add(col2, OdbcType.Numeric);
      cmdnon.Parameters.Add(col3, OdbcType.Numeric);
      cmdnon.Parameters.Add(col4, OdbcType.Numeric);
      cmdnon.Parameters.Add(col5, OdbcType.Numeric);
      cmdnon.Parameters.Add(col6, OdbcType.Numeric);
      cmdnon.Parameters.Add(col7, OdbcType.Numeric);
      cmdnon.Parameters.Add(col8, OdbcType.Numeric);

      OdbcConnection DbConnection = new OdbcConnection(connectionString);
      OdbcCommand DbCommand = DbConnection.CreateCommand();
      DbConnection.Open();
      DbCommand.CommandText = "SELECT DateTime, S1Flow, S2Flow, S3Flow, S4Flow, S1FlowTotal, S2FlowTotal, S3FlowTotal, S4FlowTotal FROM CommonStation WHERE Format(DateTime, 'mm/dd/yyyy') >= (select Format(max(DateTime), 'mm/dd/yyyy') from CommonStation)";
      OdbcDataReader DbReader = DbCommand.ExecuteReader();
      int fCount = DbReader.FieldCount;
      Console.Write("");
      /*
        for (int i = 0; i < fCount; i++)
        {
          String fName = DbReader.GetName(i);
          Console.Write(fName + "\t");
        }
      */
      Console.WriteLine();
      try
      {
        while (DbReader.Read())
        {
          col0 = DbReader["DateTime"].ToString();
          col1 = DbReader["S1Flow"].ToString();
          col2 = DbReader["S2Flow"].ToString();
          col3 = DbReader["S3Flow"].ToString();
          col4 = DbReader["S4Flow"].ToString();
          col5 = DbReader["S1FlowTotal"].ToString();
          col6 = DbReader["S2FlowTotal"].ToString();
          col7 = DbReader["S3FlowTotal"].ToString();
          col8 = DbReader["S4FlowTotal"].ToString();
          cmdnon.CommandText = "insert into Commonstation(CommStatDate_Time, S1_Flow, S2_Flow, S3_Flow, S4_Flow, S1_Flow_Total, S2_Flow_Total, S3_Flow_Total, S4_Flow_Total ) values (to_date('" + col0 + "', 'MM/DD/YYYY HH:MI:SS AM' ), to_number('" + col1 + "'), to_number('" + col2 + "'), to_number('" + col3 + "'), to_number('" + col4 + "'), to_number('" + col5 + "'), to_number('" + col6 + "'), to_number('" + col7 + "'), to_number('" + col8 + "'))";
          Console.Write(col0 + "\t");
          Console.Write(col1 + "\t");
          Console.Write(col2 + "\t");
          Console.Write(col3 + "\t");
          Console.Write(col4 + "\t");
          Console.Write(col5 + "\t");
          Console.Write(col6 + "\t");
          Console.Write(col7 + "\t");
          Console.Write(col8 + "\t");
          int rowsAffected = cmdnon.ExecuteNonQuery(); 
          Console.WriteLine();
          Console.WriteLine(rowsAffected);
        }
      }
      catch (Exception ex)
      {
         Console.WriteLine(ex.ToString());
      }
      finally
      {
         conn2.Close();      
         DbReader.Close();
         DbCommand.Dispose();
         DbConnection.Close();
      }          
    }
  }
}
0 голосов
/ 30 апреля 2011

1) Почему вы вызываете ExecuteNonQuery, а затем запускаете программу чтения?Удалите оператор ExecuteNonQuery.

2) Ваша проверка работоспособности использует все строки, и к моменту, когда код достигает оператора while (DbReader.Read()), больше нет строк, которые необходимо пройти.Снимите проверку работоспособности.

После внесения вышеуказанных изменений ваш код должен выглядеть следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.OracleClient;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Data.Odbc;
namespace ConsoleApplication4
{    
 class Program2
    {
        static void Main(string[] args)
        {
            string connectionString = "Dsn=Gas_meter";
            string col0 = "";
            string col1 = "";
            string col2 = "";
            string col3 = "";
            string col4 = "";
            string col5 = "";
            string col6 = "";
            string col7 = "";
            string col8 = "";
                        OdbcConnection DbConnection = new OdbcConnection(connectionString);
                        OdbcCommand DbCommand = DbConnection.CreateCommand();
                        DbConnection.Open();
                        DbCommand.CommandText = "SELECT DateTime, S1Flow, S2Flow, S3Flow, S4Flow, S1FlowTotal, S2FlowTotal, S3FlowTotal, S4FlowTotal FROM CommonStation WHERE Format(DateTime, 'mm/dd/yyyy') >=(select Format(max(DateTime),'mm/dd/yyyy') from CommonStation)";
                        //DbCommand.ExecuteNonQuery(); //####THIS STATEMENT IS NOT REQUIRED. REMOVE IT
                        OdbcDataReader DbReader = DbCommand.ExecuteReader();
                        int fCount = DbReader.FieldCount;
                        Console.Write("");

                        //####THIS FOR LOOP WILL READ THRU ALL RECORDS. REMOVE IT
                        /*
                        for (int i = 0; i < fCount; i++)
                        {
                                String fName = DbReader.GetName(i);
                                Console.Write(fName + "\t");
                        }
                        */
                    Console.WriteLine();
                    try
                    {
                        while (DbReader.Read())
                        {            
                            string connString = "DSN=Gas_meter_proj;Uid=cm;Pwd=cmdev123";
                            OdbcConnection conn = new OdbcConnection(connString);         
                            string sqlins = @"insert into Commonstation(CommStatDate_Time, S1_Flow, S2_Flow, S3_Flow, S4_Flow, S1_Flow_Total, S2_Flow_Total, S3_Flow_Total, S4_Flow_Total ) values (to_date('" +col0+"', 'MM/DD/YYYY HH:MI:SS AM' ),to_number('" + col1 + "'), to_number('" + col2 + "'), to_number('" + col3 + "'), to_number('" + col4 + "'),to_number('" + col5 + "'),to_number('" + col6 + "'),to_number('" + col7 + "'),to_number('" + col8 + "'))";
                            OdbcCommand cmdnon = new OdbcCommand(sqlins, conn);
                            cmdnon.Parameters.Add(col0, OdbcType.DateTime);
                            cmdnon.Parameters.Add(col1, OdbcType.Int);
                            cmdnon.Parameters.Add(col2, OdbcType.Int);
                            cmdnon.Parameters.Add(col3, OdbcType.Int);
                            cmdnon.Parameters.Add(col4, OdbcType.Int);
                            cmdnon.Parameters.Add(col5, OdbcType.Int);
                            cmdnon.Parameters.Add(col6, OdbcType.Int);
                            cmdnon.Parameters.Add(col7, OdbcType.Int);
                            cmdnon.Parameters.Add(col8, OdbcType.Int);
                            conn.Open();
                            col0 = DbReader["DateTime"].ToString();
                            col1 = DbReader["S1Flow"].ToString();
                            col2 = DbReader["S2Flow"].ToString();
                            col3 = DbReader["S3Flow"].ToString();
                            col4 = DbReader["S4Flow"].ToString();
                            col5 = DbReader["S1FlowTotal"].ToString();
                            col6 = DbReader["S2FlowTotal"].ToString();
                            col7 = DbReader["S3FlowTotal"].ToString();
                            col8 = DbReader["S4FlowTotal"].ToString();
                            Console.Write(col0 + "\t");
                            Console.Write(col1 + "\t");
                            Console.Write(col2 + "\t");
                            Console.Write(col3 + "\t");
                            Console.Write(col4 + "\t");
                            Console.Write(col5 + "\t");
                            Console.Write(col6 + "\t");
                            Console.Write(col7 + "\t");
                            Console.Write(col8 + "\t");
                            int rowsAffected = cmdnon.ExecuteNonQuery(); 
                            Console.WriteLine();
                            conn.Close();
                            Console.WriteLine(rowsAffected);           
                        }
                    }
                    catch (Exception ex)
                    {
                            Console.WriteLine(ex.ToString());
                    }
                    finally
                    {
                            DbReader.Close();
                            DbCommand.Dispose();
                            DbConnection.Close();
                    }
        }
    }
}
...