■13066 / inTopicNo.6) |
Re[5]: エクセルデータとDataSetをマージする |
□投稿者/ 七曜 (37回)-(2008/01/24(Thu) 01:19:35)
|
■No13040 (まぐねしうむ さん) に返信
> TableName変更後マージしたDataSetのTablesの個数を確認した所
> 1個なのでなんらかのマージの処理は行っていると思います。
ですからね、
dsUserData.Merge(ds, false);
とした場合、スキーマが一致しない場合は追加(MissingSchemaAction.Add)になるので、テーブル名を一致させたら、
次はカラム名も一致しないとカラムが追加されてしまうわけですよ。
で、各データをFillした場合のDataSetに設定されているスキーマは
[DataSet.GetXmlSchema メソッド]
http://msdn2.microsoft.com/ja-jp/library/system.data.dataset.getxmlschema(VS.80).aspx
を使うと見れます。
コードだとこんな感じですかね。
private DataSet GetData(Boolean showSchema, String excelFilePath, String mdbFilePath)
{
String datasetName = "UserInfo";
String tableName = "UserData";
String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + excelFilePath + "; Extended Properties=Excel 8.0;";
//String commandText = "SELECT * FROM [UserData$]";
String commandText = "SELECT * FROM [UserDataNew$]"; //1行目にColumnNameにあたる行を追加したSheetを読んでみる。
DataSet dsExcel = ReadData(connectionString, commandText, datasetName, tableName);
if (showSchema)
{
MessageBox.Show(dsExcel.GetXmlSchema(), "Excel側のスキーマ");
}
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbFilePath + ";";
commandText = "SELECT * FROM UserData";
DataSet dsMDB = ReadData(connectionString, commandText, datasetName, tableName);
if (showSchema)
{
MessageBox.Show(dsMDB.GetXmlSchema(), "MDB側のスキーマ");
}
dsMDB.Merge(dsExcel, false);
if (showSchema)
{
MessageBox.Show(dsMDB.GetXmlSchema(), "マージ後のMDB側のスキーマ");
}
return dsMDB;
}
private DataSet ReadData(String connectionString, String commandText, String datasetName, String tableName)
{
DataSet dsResult = new DataSet(datasetName);
using (OleDbDataAdapter oAdapter = new OleDbDataAdapter(commandText, connectionString))
{
oAdapter.Fill(dsResult, tableName);
}
return dsResult;
}
ちなみにDataAdapterは、コネクションのOpenはしてくれる(たしかCloseもしてくれる)のと、Disposableなので
例の様に書くと、すっきりしたりして。usingはスコープを抜ける際に対象のオブジェクトをDisposeするので
構造化例外処理を書く場合は、usingの外側でtry...catchしておけばfinallyで後始末しなくってもOKです。
で、試した感じで簡単そうなのは、コード例でも書いていますが
1行目にColumnNameにあたる行を追加したSheetを読んでみる
です。これだとカラム名が一致するのとある程度はデータタイプも一致するのでスキーマが一致します。
あとは・・・Excel読み込み時のcommandText(SELECT構文)でスキーマが一致するような構文を入れるとかかな。
いずれにしてもExcel側は
String commandText = "SELECT * FROM [UserData$]";
これで読み込むと1行目の内容がカラム名に設定されるので、スキーマを一致させられない場合は
Mergeメソッドを諦める必要があるかもしれません。
(その場合は、Excel側の行と列をループさせて、mdb側に行の追加をするとかになります。たぶん。)
|
|