7

ExcelからOracleデータベースにデータをインポートするユーティリティを作成しています。

Excelファイルの固定テンプレートがあります。

JetプロバイダーとADO.Net-Ole接続ツールでデータをインポートしようとすると、次の問題が見つかりました。列にデータ型が混在しているためにインポートされていない列があります[stringと番号]、

インターネットでこの問題を探しました。理由はExcelからデータ型を推測しているためです。

ロードコード:

connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0;");
string columns = "P_ID, FULL_NAME_AR, job_no, GENDER, BIRTH_DATE, RELIGION, MARITAL_STATUS, NAT_ID, JOB_Name, FIRST_HIRE_DATE, HIRE_DATE, CONTRACT_TYPE, GRADE_CODE, QUALIFICATION";
string sheetName = "[Emps$]";
OleDbCommand command = new OleDbCommand(string.Format("select {0} from {1} where p_id is not null", columns, sheetName), connection);

connection.Open();
dr = command.ExecuteReader();
DataTable table = new DataTable();
table.Load(dr);

Excelに推測を停止し、データをテキストとして表示するにはどうすればよいですか?

ない場合は、回避策を教えていただけますか?

前もって感謝します

4

4 に答える 4

8

接続文字列にIMEX=1を追加することで解決策を見つけましたが、次のリンクで説明されている特別な形式があります。

IMEXパラメーターは、数値とアルファ値が混在する列用です。Excelドライバーは通常、各列に使用するデータ型を決定するために最初の数行をスキャンします。最初の数行のスキャンに基づいて列が数値であると判断された場合、この列に英字が含まれる行はすべてNullとして返されます。IMEXパラメーター(1は入力モード)は、英数字値が適切に処理されるように、列のデータ型をテキストに強制します。

よろしく

于 2010-08-30T12:18:44.910 に答える
2

これは完全には正しくありません!明らかに、Jet / ACEは、IMEX = 1に関係なく、最初の8行が空白の場合は常に文字列型を想定し、最初の8行が数値の場合は常に数値型を使用します(これもIMEX = 1に関係なく)。レジストリで行を0に読み取っても、同じ問題が発生しました。これは、それを機能させるための唯一の確実な方法でした。

try
{
    Console.Write(wsReader.GetDouble(j).ToString());
}
catch   //Lame unfixable bug
{
    Console.Write(wsReader.GetString(j));
}
于 2012-07-16T19:55:34.957 に答える
1

エクセルエンドから作業できますか?この例をExcelで実行すると、混合データタイプがSQLServerテーブルに配置されます。

Dim cn As New ADODB.Connection

scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
& sFullName _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

cn.Open scn

s = "SELECT Col1, Col2, Col3 INTO [ODBC;Description=TEST;DRIVER=SQL Server;" _
& "SERVER=Some\Instance;Trusted_Connection=Yes;" _
& "DATABASE=test].TableZ  FROM [Sheet1$]"
cn.Execute s
于 2010-08-29T14:41:34.050 に答える
1

別の解決策は、レジストリの設定TypeGuessRowsを追加または変更することです。値を0に設定すると、ドキュメント全体がスキャンされます。

残念ながら、インストールしたライブラリとそのバージョンによっては、レジストリのさまざまな場所に設定が表示される場合があります。

例:[HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] "TypeGuessRows" = dword:00000000

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Access Connectivity Engine \ Engines \ Excel] "TypeGuessRows" = dword:00000000

これにより、255文字を超えるテキストデータの切り捨ても防止されます。これは、TypeGuessRowsの数が0より大きい場合に発生し、255文字を超える最初のテキストがその数を超えて発生します。

ExcelACEドライバーのTypeGuessRowsの設定も参照してください。

于 2018-12-07T16:28:55.953 に答える