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 STOP GUESSING 并将数据作为 Text 给我?

如果没有,你能帮我解决任何问题吗?

提前致谢

4

4 回答 4

8

我通过为连接字符串添加 IMEX=1 找到了一个解决方案,但它有一种特殊的格式,在以下链接中进行了描述。

IMEX 参数适用于使用混合数字和字母值的列。Excel 驱动程序通常会扫描前几行以确定每列要使用的数据类型。如果根据对前几行的扫描确定一列是数字的,则此列中包含字母字符的任何行都将返回为 Null。IMEX 参数(1 是输入模式)将列的数据类型强制为文本,以便正确处理字母数字值。

问候

于 2010-08-30T12:18:44.910 回答
2

这不完全正确!显然,如果前 8 行为空,无论 IMEX=1,Jet/ACE 总是假定字符串类型,如果前 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端工作吗?这个在 Excel 中运行的示例会将混合数据类型放入 SQL Server 表中:

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 个字符的文本数据被截断。如果您有一个大于 0 的 TypeGuessRows 数字并且第一个超过 255 个字符的文本出现在该数字之外,则会发生这种情况。

另请参阅为 excel ACE 驱动程序设置 TypeGuessRows

于 2018-12-07T16:28:55.953 回答