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

标签 c# .net excel oledb

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

这是我的连接字符串:

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 个字符的文本时,它都会剪切文本。 有什么办法可以改变吗?

最佳答案

我从来没有找到过。这实际上是一个真正的麻烦。 OLEDB 无论如何都会扫描前 8 行,并对数据类型做出假设。

IMEX=1(顺便说一句不是 YES)强制它找到的任何混合行文本。

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

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

您可以尝试使用以下方法定位每个单元格

SELECT * FROM [<SheetName>$<optional range>]

例如从 [MySheet$A1:A1] 中选择 *

但这在大文件上会很慢。

关于C#,如何在读取 Ace.OleDB 时更改数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593652/

相关文章:

excel - 计算满足特定条件的 Excel 电子表格中的唯一行

VBA LastRow 计算不起作用

c# - 替换富文本框中的所有文本

c# - 基于服务的数据库 vs SQL Server Compact vs LocalDB?

c# - 如何将身份用户从 MVC5 应用程序迁移到 ASP.NET Core 2.2 应用程序

.net - DLL (.Net) 中的 GUID

c# - 围绕异步等待

c# - 如何加载大量数据到DataTable

c# - MVC 中代码分析规则集 CA1506 的最佳解决方案是什么(我不想压制)

c# - 数据库函数 "cannot be translated into a LINQ to Entities store expression"