C#,如何在Ace.OleDB中读取时更改数据类型

时间:2017-06-16 16:10:18

标签: c# .net excel oledb

我需要在同一列中读取包含一些空白单元格和一些超过255个字符的单元格的Excel文件,我试图将注册表值“TypeGuessRows”更改为“0”并且它有效,但我可以' t更改服务器上的注册表。

这是我的连接字符串:

StrConnXLS = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + SFileXLS + "';Extended Properties='Excel 12.0;HDR=YES;IMEX=YES;MAXSCANROWS=0;'";

我通过将表传递到这样的数据表来读取该表:

using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + tabela + "]", con))
                {


                    con.Open();

                    //conn.Open();
                    //Executando o UPDATE
                    cmd.ExecuteNonQuery();

                    OleDbDataAdapter oleAdapter = new OleDbDataAdapter();
                    oleAdapter.SelectCommand = cmd;
                    planilha = new DataTable("");
                    oleAdapter.FillSchema(planilha, SchemaType.Source);
                    oleAdapter.Fill(planilha);
                    //Fechando a conexão
                    con.Close();
                }

我读的就像:

 foreach (DataRow row in planilha.Rows)
 {
    string dostuff = row["test"].ToString();
 }

但是每次到达超过255个字符的文本时,它都会删除文本。 有什么方法可以改变它吗?

1 个答案:

答案 0 :(得分:0)

我从来没有找到过。实际上这真是令人讨厌。 OLEDB无论如何都会扫描前8行,并对数据类型进行假设。

IMEX = 1(偶然不是YES)强制它找到的任何混合行文本。

据我所知,此驱动程序忽略连接字符串中的ImportMixedTypes,TypeGuessRows和MaxScanRow。旧的Jet驱动程序支持它们。在我看来,这是一个倒退的步骤。

如果您的文件有一个标题行,您可以尝试HDR = No,这会强制它发送文本,因为第一行是文本,但我认为这不会有助于您的255字符限制问题。

您可以尝试使用

定位每个单元格
#header {
    margin:0 auto;
    position: fixed;
    width:100%;
    z-index:999;
    background-color:#FFFFFF;
}
#topmenu {
    background-color:#0000FF;
    height:24px;
    filter: alpha(opacity=50);
    opacity: 0.5;
   
}

#container {
    position: relative;
    top: 68px;
    width: 100%;
    height: 2000px;
    overflow: auto;
    z-index:1;
}

#content {
    margin: 0 auto;
    background-color: #DAA520;
    width: 960px;
    height: 2000px;
}

E.g。 SELECT * FROM [MySheet $ A1:A1]

但是对于大文件来说这会非常慢。