Получение нулевых значений вместо данных при отправке в Oracle
Я работаю над проектом, который требует, чтобы я взял самые последние данные из массива данных 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 ответа
Хорошо, я решил проблему. У меня не было кода, устанавливающего значение перед отправкой его в 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();
}
}
}
}
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();
}
}
}
}