簡體   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