私は、MS Access データベースから最新のデータを取得してから、そのデータを Oracle の既存のテーブルに取得する必要があるプロジェクトに取り組んでいます。
このプロジェクトはほぼ完了しています。ただし、小さな問題が 1 つあります。コンパイラがコンソール アプリの実行を終了すると、Oracle テーブルに 1 つの行があり、各値が null になっています。
私はこのプログラムを何時間も見つめていますが、どこにも行きません. 最初の目のセットがこの問題を解決するのに役立つかどうか疑問に思っていました.
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 テーブルに送信します。ここでも、MS Access からの情報が必要かどうかを確認するための 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();
}
}
}
}
繰り返しますが、MS Access からすべての情報を取得しています。すべてのデータを取得しているように見えますが、行が null で埋められています。誰かがここで何が起こっているのかを理解するのを手伝ってくれますか?