繁体   English   中英

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

[英]OLEDB connection not reading string values C#

我的要求是从本地文件夹中读取Excel文件并导入到DataTable中。 如果第一行包含字符串值,则导入工作正常;如果前三行的值是int,则列的数据类型变为Integer,并且忽略字符串值。 我想读取值。 我试图插入一行字符串值,但是由于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设置(其唯一有效值是TextMajorityType ,而Text是您在此处想要的值)。

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

您可能需要在多个位置更改设置,具体取决于您的连接字符串和Excel版本或安装的Access Connectivity Engine。 例如,在Windows 7 64位上,注册表中Jet设置的位置为HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Wow6432Node \\ Microsoft \\ Jet \\ 4.0 \\ Engines \\ Excel。

根据Excel的版本,使用ACE引擎的位置类似。 此处的更多信息,包括旧博客文章和最新评论。

基本上,使用Jet / ACE从文件导入可能会很痛苦,并且有时您甚至可能不会注意到存在问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM