当前位置: 首页 > news >正文

编程经验:定义了过多字段-Excel

//p_Path Excel文件目录

public DataTable GetDataFromExcel(string p_Path)

 {

 string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + p_Path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=0'";

    OleDbConnection conExcel = new OleDbConnection(strCon);

    DataSet ds = new DataSet();

    DataTable dt = new DataTable();

    try

    {

      if (!File.Exists(p_Path))

      {

         dt.TableName = "false";

       }

       else

       {

         conExcel.Open();

         string strSql = "select * from  [Sheet1$A:CV] where [银行账号] is not null and [银行账号] <> ''";

       //  string strSql = "select * from  [Sheet1$] where [银行账号] is not null and [银行账号] <> ''";

         OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strSql, conExcel);

         int i = myDataAdapter.SelectCommand.Parameters.Count;

         System.Data.OleDb.OleDbCommandBuilder builder = newOleDbCommandBuilder(myDataAdapter);

         builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)

         builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)

         myDataAdapter.Fill(ds, "Sheet1$");//这个地方会报错“定义了过多的字段”

         dt = ds.Tables[0].Copy();

         conExcel.Close();

          ds.WriteXml("c://EXML.xml"); //Excel To XML

          }

        }

       catch (Exception e)

        {

         if (conExcel.State == ConnectionState.Open)

         conExcel.Close();

         log4net.LogManager.GetLogger(this.GetType()).Error("GetDataFromExcel(" + p_Path + ")",e);

         dt.TableName = "false";

         }

        File.Delete(p_Path);//删除文件

         return dt;

}

 

string strSql = "select * from  [Sheet1$] where [银行账号] is not null and [银行账号] <> ''";

使用上面会出现定义了过多的字段这个错误。 郁闷的是你的Excel表字段就几十列(有效数据列),为什么会说“定义了过多的字段”呢?,为什么我要特别强调是有效的数据列呢????

 

问题原因:

 

Excel总列数是A-IV 255个单位长度),建立Excel时候,执行了插入操作,会是Excel长度超过255(虽然列数还是A-IV),导致无法读取。用上面的查询语句没有限制Sheet1$ 这张表的列数(程序在构造OleDbDataAdapter会加载所有的列数,包括空白列),这样就超过了Excel长度域

 

解决方法:

 

目前我这张Sheet1$表有效数据列最长只有100列(其他的是空白列),所以查询条件我就限定在A—CV列,这样就在myDataAdapter.Fill(ds, "Sheet1$");就不会报定义了过多的字段出错。

 

 我猜想,插入行也同样会出现这样的问题,只要我们在查询条件下,限定行数和列数就可以避免此类问题。

 

官网的解释

 

症状:

 

当您添加新字段或更改现有字段的属性后,保存表时,您收到消息"定义了过多的字段,"跟邮件"中遇到错误保存。 数据类型未被更改"。 即使您有 255 个或更少在表中定义的字段,您将会收到这些消息。 

注意: 您还收到此信息如果添加或修改基于具有太多的字段的表的报表中的字段。 
注意: 此错误消息生成 Microsoft Jet 数据库引擎 3.0 保留的错误号 3190 

本文假定您熟悉 Visual Basic for Applications 和创建 Microsoft Access 应用程序使用随 Microsoft Access 提供的编程工具。 有关 Visual Basic for Applications 的更多信息,请参阅"构建应用程序与 Microsoft Access"手册的版本。 

注意: Visual Basic for Applications 被称为 Access Basic  Microsoft Access 版本 1 x  2.0。 有关Access Basic,请参考 Microsoft Access 版本 1 x 中的"介绍到 Programming"手动或在 Microsoft Access 版本2.0"构建应用程序"手册

 

原因:

 

若要释放内部的列数为已删除的字段或字段,修改其属性,执行以下项:

·          Microsoft Access 7.0  97,单击另存为 / 导出在的文件菜单并保存不同的名称表。 然后,删除原始表,并重命名为原始表名称的新表。 

警告: 在文件菜单在版本 1 x  2.0 上单击另存为复制表,不记录结构。 在使用追加查询来填充新的表之前,不要删除原始表。

·          Microsoft Access 1 x  2.0,单击保存文件菜单上,并保存不同的名称表。 填充新表,原始表中的数据。 然后,删除原始表,并重命名为原始表名称的新表。 

您还可以通过压缩数据库来释放内部的列数。

 

相关文章:

  • A potentially dangerous Request.Form value was detected from the client (txtTest=).
  • ajaxpro 返回undefined 值為null
  • Cannot open database db1 requested by the login. The login failed.
  • Invalid postback or callback argument
  • 网页视频播放器代码大全
  • String or binary data would be truncated 异常解决办法
  • C# 将本地文件远程拷贝到其他电脑
  • HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
  • AjaxPro ‘未定义’解决方案
  • FlashFXP v3.5.4注册码+FlashFXP v3.6.0注册码+FlashFXP v3.7.2.build.1266...
  • Google Maps API一例错误处理 SCRIPT5007: 无法获取属性“firstChild”的值: 对象为 null 或未定义 main.js
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • 解决Requset.Write()弹出提示框变形问题
  • Google Maps API openInfoWindowHtml a is undefined
  • Intervention/image 图片处理扩展包的安装和使用
  • IP路由与转发
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Koa2 之文件上传下载
  • miaov-React 最佳入门
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vuex 笔记整理
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 写代码的正确姿势
  • 一个完整Java Web项目背后的密码
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 第二十章:异步和文件I/O.(二十三)
  • "无招胜有招"nbsp;史上最全的互…
  • # Panda3d 碰撞检测系统介绍
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (11)MSP430F5529 定时器B
  • (33)STM32——485实验笔记
  • (42)STM32——LCD显示屏实验笔记
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)Neo4j下载安装以及初次使用
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)http协议
  • **PHP二维数组遍历时同时赋值
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件_Git:.gitignore
  • .Mobi域名介绍
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net MySql
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 知识杂记
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net6使用Sejil可视化日志
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /proc/vmstat 详解
  • @ModelAttribute 注解