OLEDB连接未读取字符串值C#

OLEDB连接未读取字符串值C#,c#,excel,C#,Excel,我的要求是从本地文件夹中读取excel文件并导入DataTable。导入工作正常如果第一行包含字符串值,如果前3行中的值为int,则列的数据类型将变为整数,并忽略字符串值。我想读一本关于这些值的书。我试图插入一行字符串值,但由于int数据类型,这是不允许的。请帮忙。。我有大麻烦了。 我尝试在连接字符串中使用IMEX=1,但没有成功 string Extension = ".xlsx"; string conStr = ""; switch (Extension) { case ".xls

我的要求是从本地文件夹中读取excel文件并导入DataTable。导入工作正常如果第一行包含字符串值,如果前3行中的值为int,则列的数据类型将变为整数,并忽略字符串值。我想读一本关于这些值的书。我试图插入一行字符串值,但由于int数据类型,这是不允许的。请帮忙。。我有大麻烦了。 我尝试在连接字符串中使用IMEX=1,但没有成功

string Extension = ".xlsx";
string conStr = "";
switch (Extension)
{
    case ".xls": //Excel 97-03
    conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
    break;
    case ".xlsx": //Excel 07
    conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
    break;
}
conStr = String.Format(conStr, strPath);
oledbConn = new OleDbConnection(conStr);
if (oledbConn.State != ConnectionState.Open)
    oledbConn.Open();
OleDbCommand cmd = new OleDbCommand(); ;
OleDbDataAdapter oleda = new OleDbDataAdapter();
DataTable dt = new DataTable();
dt.Columns.Add("Store", typeof(string)).DefaultValue = strPath.Substring(18, 3);
var sheets = oledbConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
cmd.Connection = oledbConn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = " SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
oleda = new OleDbDataAdapter(cmd);
//oleda.FillSchema(dt, SchemaType.Source);
dt.TableName = strPath.Substring(18, 3);

oleda.Fill(dt);

不幸的是,这与使用Jet或ACE引擎从Excel(和其他文件类型)导入时使用的注册表设置有关。引擎将扫描前N行数据(由名为TypeGuessRows的注册表值控制,该值默认为8),并使用该值确定它认为每列的数据类型是什么。如果在电子表格的第一行TypeGuessRows中检测到多种类型,则将使用ImportMixedTypes设置(其唯一有效值为Text和MajorityType,此处所需的是Text)

这里最简单的选择可能是增加typegustingrows设置。但是,如果您需要处理的电子表格包含数万行,那么您将遇到一个问题,因为我相信不管怎样,它不会采样超过16384行。如果它不认为某个特定列是混合类型,那么它就不会应用ImportMixedTypes设置(因此,如果您有20000行,前17000行都是int,那么即使最后3000行不是整数,该列也会保持int,并且在它们的位置上会得到null)。在Excel中格式化列将无效,也不会指定目标数据类型

您可能需要在多个位置更改设置,具体取决于您的连接字符串、Excel版本或安装的Access连接引擎。例如,在64位Windows 7上,Jet设置在注册表中的位置是HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel

根据Excel版本的不同,使用ACE引擎的位置相似。 更多信息,无论是在旧的博客帖子和最近的评论


基本上,使用Jet/ACE从文件导入可能是一种痛苦的经历,有时您甚至可能没有注意到存在问题。

不幸的是,这归结于使用Jet或ACE引擎从Excel(和其他文件类型)导入时使用的注册表设置。引擎将扫描前N行数据(由名为TypeGuessRows的注册表值控制,该值默认为8),并使用该值确定它认为每列的数据类型是什么。如果在电子表格的第一行TypeGuessRows中检测到多种类型,则将使用ImportMixedTypes设置(其唯一有效值为Text和MajorityType,此处所需的是Text)

这里最简单的选择可能是增加typegustingrows设置。但是,如果您需要处理的电子表格包含数万行,那么您将遇到一个问题,因为我相信不管怎样,它不会采样超过16384行。如果它不认为某个特定列是混合类型,那么它就不会应用ImportMixedTypes设置(因此,如果您有20000行,前17000行都是int,那么即使最后3000行不是整数,该列也会保持int,并且在它们的位置上会得到null)。在Excel中格式化列将无效,也不会指定目标数据类型

您可能需要在多个位置更改设置,具体取决于您的连接字符串、Excel版本或安装的Access连接引擎。例如,在64位Windows 7上,Jet设置在注册表中的位置是HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel

根据Excel版本的不同,使用ACE引擎的位置相似。 更多信息,无论是在旧的博客帖子和最近的评论


基本上,使用Jet/ACE从文件导入可能是一种痛苦的经历,有些时候你甚至可能没有注意到有问题。

Hi,请编辑您的帖子,尝试正确设置代码段的格式好吗?这对你的问题的可读性很有帮助。嗨,你能编辑一下你的文章吗?试着正确格式化你的代码片段?这真的会帮助你的问题的可读性。谢谢你的解决方案,我会尝试这个选项。谢谢你的解决方案,我会尝试这个选项。