关于Excel导入SQLServer的说明
2012-01-06 15:18
120 查看
近来需要做个将Excel数据导入到SQLServer表中的小程序,查找了一下,解决方法如下:
一、自己编程手动读取Excel文件内容(可采用OLE操作),然后使用SQL语句插入SQLServer目标表,这个方法适应于少量数据,原因你懂的。
详细代码可查看这位哥们的:点击打开链接
二、执行SQL语句插入SQLServer目标表,这个方法效率当然是比较快,原因你懂的。
如下:
大伙把上句放到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
然后修改OperatorExcel
最后还有一个细节:
导入时的可能会需要类型转换,可以使用convert(type,field)转换。
一、自己编程手动读取Excel文件内容(可采用OLE操作),然后使用SQL语句插入SQLServer目标表,这个方法适应于少量数据,原因你懂的。
详细代码可查看这位哥们的:点击打开链接
二、执行SQL语句插入SQLServer目标表,这个方法效率当然是比较快,原因你懂的。
如下:
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
//--------------------------------------------------------------------------- #ifndef OpExcelH #define OpExcelH //--------------------------------------------------------------------------- #include <vcl.h> 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); } } } }; #endif
最后还有一个细节:
导入时的可能会需要类型转换,可以使用convert(type,field)转换。
相关文章推荐
- 关于Excel导入SQLServer的说明
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- 关于使用navicat向sqlserver和mysql数据库导入excel的问题
- 写了一个关于简单的Excel表格导入sqlserver
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- excel中电话记录数据导入到sqlserver,字符串电话或者数字电话为null的解决方案!
- 关于Excel中的需求或者是用例导入到QC中遇到的问题
- 关于从Excel导入到SQL Server 2000里表头及数字丢失的解决办法
- 高效的将excel导入sqlserver(web)
- EXCEL导入关于合并单元格的处理类
- 将excel高效导入sqlserver的可行方法
- 关于将EXCEL文件导入到MYSQL数据库的一些方法
- 关于把解析SQL文件和把解析的结果导入Excel中
- 关于Excel导入、导出的权限配置问题
- 如何高效的将excel导入sqlserver?
- 黄聪:c#中高效的excel导入sqlserver的方法
- php导出Excel php导入Excel PhpExcel使用说明 PhpExcel使用手册
- 关于sqlserver的数据导入导出