近来需要做个将Excel数据导入到SQLServer表中的小程序,查找了一下,解决方法如下:

一、自己编程手动读取Excel文件内容(可采用OLE操作),然后使用SQL语句插入SQLServer目标表,这个方法适应于少量数据,原因你懂的。

二、执行SQL语句插入SQLServer目标表,这个方法效率当然是比较快,原因你懂的。

如下:

print?insert into DestTable(field1,field2)  select field1,field2 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=D:\1.xls',sheet1$) 

大伙把上句放到SQL查询分析器中基本都能正确执行,但是真正放到程序执行时,大多会出现这个郁闷的错误提示:

OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。提供程序未给出有关错误的任何信息。
OLE DB 错误跟踪[OLE/DB Provider 'MICROSOFT.JET.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005:  提供程序未给出有关错误的任何信息。]。

明明都是同一个SQL语句呀!Google一下,再Google一下,没有答案。好吧,自己分析吧。

下面是我封装一个获取Excel字段的class

class OperatorExcel  {      Variant s_vExcelApp;      Variant s_vWorkBook;      Variant s_vSheet;  bool s_Init;  bool s_Loaded;      UINT s_RowCount;      UINT s_ColCount;  public:      OperatorExcel():s_vExcelApp(Unassigned),      s_vWorkBook(Unassigned),s_vSheet(Unassigned),      s_Init(false),s_Loaded(false),s_RowCount(0),s_ColCount(0)      {  try          {            s_vExcelApp=Variant::CreateObject("Excel.Application");          }catch(...)          {              Application->MessageBoxA("创建Excel对象出错,可能本机未正确安装Excel。","提示",MB_ICONERROR);              s_Init=false;  return ;          }          s_vExcelApp.OlePropertySet("Visible",false);          s_Init=True;      }      ~OperatorExcel()      {  try         {  if(s_Init)          {  if(s_Loaded)              s_vWorkBook.OleProcedure("Close");              s_vExcelApp.OleFunction("Quit");              s_vExcelApp=Unassigned;              s_vWorkBook=Unassigned;              s_vSheet=Unassigned;               s_Init=False;//销毁后置为未初始化             }         }catch(...){}      }  void Load(String file)      {  if(s_Init)          {            s_vExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",file.c_str());            s_vWorkBook=s_vExcelApp.OlePropertyGet("ActiveWorkBook");            s_vSheet=s_vWorkBook.OlePropertyGet("ActiveSheet");            s_RowCount=(UINT)s_vSheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");            s_ColCount=(UINT)s_vSheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");            s_Loaded=True;          }      }  void GetFieldsName(TStrings *fields)      {  if(fields)          {  for(UINT i=1;i<=s_ColCount;++i)              {                  String s=s_vSheet.OlePropertyGet("Cells",1,i).OlePropertyGet("Value");                  fields->Add(s);              }          }      }  };  

瞧了半天,摁是没瞧出什么不对劲,终于在一次未正确释放资源的调试中发现,居然在SQL查询分析器中执行的语句也报上述错误,哎,结果终于一致了,所以当下解决办法就是:打开任务管理器,把未关闭的Excel统统kill,或者在cmd中执行 taskkill /f /im  excel.exe 。

然后修改OperatorExcel

class OperatorExcel  {      Variant s_vExcelApp;      Variant s_vWorkBook;      Variant s_vSheet;  bool s_Init;  bool s_Loaded;  bool s_Closed;      UINT s_RowCount;      UINT s_ColCount;  public:      OperatorExcel():s_vExcelApp(Unassigned),      s_vWorkBook(Unassigned),s_vSheet(Unassigned),      s_Init(false),s_Loaded(false),s_Closed(false),      s_RowCount(0),s_ColCount(0)      {      }      ~OperatorExcel()      {  try         {  if(!s_Closed)           Destroy();         }  catch(...)         {}      }  void Create()      {  try          {            s_vExcelApp=Variant::CreateObject("Excel.Application");          }catch(...)          {              Application->MessageBoxA("创建Excel对象出错,可能本机未正确安装Excel。","提示",MB_ICONERROR);              s_Init=false;  return ;          }          s_vExcelApp.OlePropertySet("Visible",false);          s_Closed=false;          s_Init=True;      }  void Destroy()      {  if(s_Init)          {  if(s_Loaded)              s_vWorkBook.OleProcedure("Close");              s_vExcelApp.OleFunction("Quit");              s_vExcelApp=Unassigned;              s_vWorkBook=Unassigned;              s_vSheet=Unassigned;               s_Closed=True;//销毁后置为已关闭               s_Init=False;//销毁后置为未初始化             }      }  void Load(String file)      {  if(s_Init)          {            s_vExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",file.c_str());            s_vWorkBook=s_vExcelApp.OlePropertyGet("ActiveWorkBook");            s_vSheet=s_vWorkBook.OlePropertyGet("ActiveSheet");            s_RowCount=(UINT)s_vSheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");            s_ColCount=(UINT)s_vSheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");            s_Loaded=True;          }      }  void GetFieldsName(TStrings *fields)      {  if(fields)          {  for(UINT i=1;i<=s_ColCount;++i)              {                  String s=s_vSheet.OlePropertyGet("Cells",1,i).OlePropertyGet("Value");                  fields->Add(s);              }          }      }  };  

转载于:https://www.cnblogs.com/seoer/archive/2012/01/06/2314740.html

关于Excel导入SQLServer的说明相关推荐

  1. powershell excel 导入 sqlserver

    powershell excel 导入 sqlserver 更新 多表导入,这之前基础上稍加改动. cls$SqlConnection = New-Object System.Data.SqlClie ...

  2. Excel导入SqlServer数据库(一)

    业务中经常会遇到批量导入数据库的操作,今天总结一下方法. 本文利用三层的架构的思想.将整个业务分成三部分,分别是界面,业务和数据处理. 先介绍第一种方法: 即先将Excel表格的内容转化到DataTa ...

  3. excel 导入 sqlserver 字符串被截取为255长度解决方案

    原文出处: http://blog.csdn.net/xiaoma0529/article/details/21336535 excel表格导入sqlserver数据表中 内容被截取为255长度的字符 ...

  4. excel导入sqlserver数据库大数据量,可每秒控制数量

    数据库代码 USE [Test] GO /****** Object:  Table [dbo].[Table_1]    Script Date: 11/07/2017 17:27:29 ***** ...

  5. 对未安装office,不支持excel各版本的数据库进行excel导入sqlserver

    现在很多运营商越来越少自己部署服务器了,很多时候都是租用别的服务商的服务器,但这样就有很多麻烦事,比如数据库服务器没安装office,无法直接导入excel的内容 现在有一个稍微复杂点的办法来解决这个 ...

  6. 大数据量高效导入数据库(以excel导入sqlserver为例)

    本人文章陆续转向本人微信公账号发布 公众号:搬砖码农SmallNNN,期望您要是搬砖码农,一起学习探讨,祝您阅读愉快. 最近正在做一个项目,要把excel中的数据导入到sqlserver数据库中,首先 ...

  7. Excel导入sqlserver

    /// <summary> /// 上传Excel /// </summary> /// <returns></returns> public Acti ...

  8. 把excel导入sqlserver外部表不是预期格式

    把导入的文件是从xlsx改成xls类型的,注意不要直接将文件重命名,而是进去表格里面然后将其另存为xls文件!!!

  9. c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)

    对于从sqlserver中导入.导出excel,虽然sqlserver已经给了较为简单的方式,通过交互式的对话框形式实现,但是有时这种方式存在的很多问题,比方说导入.导出数据不全.而且,对于一个项目而 ...

  10. sqlserver excel导入数据时有null,为空值

    sqlserver excel导入数据时有null,最完美解决办法 1.说明为什么会出现导入的数据会为null? 因为在数据库导入数据时,他会自动检测数据的类型,文字一般检测为nvarchar类型,而 ...

最新文章

  1. 机器学习——利用K-均值聚类算法对未标注数据分组
  2. python可以自学吗-大家觉得自学python多久能学会?
  3. XWiki 11.1 发布,协作式应用开发平台
  4. MATLAB实战系列(二十三)-基于hough变换的直线检测(附MATLAB源代码)
  5. Google Map API v2 步步为营 (二)----- Location
  6. 计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx
  7. android的ListView做表格添加圆角边框
  8. 移动APP开发工作笔记001---Hbuilder连接苹果手机
  9. 使用Sonar管理代码质量(一)–简述与安装
  10. jQuery插件管理方案
  11. 教你React Native使用fetch实现图片上传
  12. shell编程入门步步高(三、shell的基本结构)
  13. 几个支持SCORM的免费平台
  14. Cadence PSpice 模型5:基于ABM库创建XC6209稳压芯片的PSpice模型实战图文教程
  15. python3提供了什么函数从标准输入读入一行文本_Python3 提供了print函数从标准输入(如键盘)读入一行文本...
  16. H264/H265编码视频流媒体播放器EasyWasmPlayer.js控制台循环报错Unsupported排查
  17. control reaches end of non-void function [-Wreturn-type] 实例分析
  18. 深度解析大快DKadoop大数据运维管理平台功能
  19. cadence电阻在哪个库_cadence元件库介绍
  20. 【新知实验室】TRTC腾讯实时音视频动手实验

热门文章

  1. apache poi excel显示 base64 图片_java操作Excel一:POI
  2. mysql5.7.19zip,mysql5.7.19zip详细安装过程和配置
  3. 好书推荐:OpenSuse
  4. 聊天机器人5步重塑酒店业
  5. Hibernate实体类注解中如何忽略某些字段的映射
  6. Oracle Active database duplication
  7. 短信猫JAVA二次开发包SMSLib,org.smslib.TimeoutException: No response from device解决方案...
  8. linux otl oracle数据库连接例子
  9. Python开发环境搭建方法简述
  10. WF4.0 RC 对比 Beta2 的变化