C# でMicrosoft.ACE.OLEDB.12.0ドライバーを使用して、Excel ファイル (XLS) の読み取りと書き込みを行います。私のリーダーの拡張プロパティは次のようになります: Excel 8.0;HDR=NO;IMEX=1; ライターの場合は次のようになります。Excel 8.0;HDR=NO;IMEX=0;
これがシナリオです: 私は Excel ファイル、たとえばinput.xlsから読み取り、新しいoutput.xlsファイルを作成し、ライターを使用して書き込みます。次に、MS Excel でファイルoutput.xlsを開き、さらにいくつかの行を追加します。
次に、output.xlsをプログラムへの入力としてフィードします。デバッグすると、OleDb を使用して最初に書き込まれた行のみが読み取られることがわかります。追加した新しい行は読み取られず、ライターは読み取られた行を吐き出します。
これはOleDbの仕組みですか?つまり、データベースをロックされているものとして扱い、外部挿入を評価しません。または、ファイルの作成方法と保存方法に問題がある可能性はありますか?
private void Initialize(string fileName, FileType fileType)
{
string connectionString = GetConnectionString(fileName, fileType);
string sheet;
using (OleDbConnection connection = OpenConnection(connectionString))
{
DataTable sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
}
tableName = "[ListingDetails]";
conn = new OleDbConnection();
conn.ConnectionString = connectionString;
conn.Open();
cmd1 = new OleDbCommand();
cmd1.Connection = conn;
cmd1.CommandText = string.Format(CultureInfo.InvariantCulture, @"CREATE TABLE {0} {1}", tableName, fieldstring);
int x = cmd1.ExecuteNonQuery();
}
public void InsertRow(string[] data)
{
StringBuilder fieldString = new StringBuilder();
fieldString.Append("(");
foreach (var h in headers)
{
fieldString.Append(" ["+h+"], ");
}
fieldString.Remove(fieldString.Length - 2, 2);
fieldString.Append(")");
StringBuilder dataString = new StringBuilder();
dataString.Append("('");
foreach (var d in data)
{
if(d!=null)
dataString.Append(d.Replace("'", "''") + "', '");
else
dataString.Append("', '");
}
dataString.Remove(dataString.Length - 4, 4);
dataString.Append("')");
cmd1.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO {0} {1} values {2}", tableName, fieldString, dataString);
int x = cmd1.ExecuteNonQuery();
}
ファイルを閉じるには、conn.Close();
ここで Initialize() メソッドでシートを作成/使用する方法を疑っています。
PS 同様の質問を見たことがありますが、データと IMEX フラグが 1 に設定されていないことに問題があるようです。これは重複した質問ではないことを事前に伝えておきます。
ありがとう