关于C#导入excel到sql server的问题

问题描述

上星期做的C#导入excel到sqlserver解决了重复导入信息的问题,加多一个ID列,但是发现导入了第一个excel文件的数据之后第二个导入不了了。求大神指点或解决。我的winform里只有三个控件:两个botton和一个dataGridView1usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.OleDb;usingSystem.Data.SqlClient;usingSystem.Text.RegularExpressions;usingKQ;usingSZCID.Environment;usingSZCID.Environment.Tools;namespaceWindowsFormsApplication59{publicpartialclassForm1:Form{stringfile=null;publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){OpenFileDialogfileDialog=newOpenFileDialog();fileDialog.Multiselect=true;fileDialog.Title="请选择文件";fileDialog.Filter="所有文件(*.*)|*.*";stringfileName=fileDialog.SafeFileName;//获取文件名if(fileDialog.ShowDialog()==DialogResult.OK){file=fileDialog.FileName;try{using(ExcelexcelHelper=newExcel(file)){DataTabledt=excelHelper.ExcelToDataTable(fileName,true);dataGridView1.DataSource=dt;}}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);}}}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidbutton2_Click(objectsender,EventArgse){DataTabledt=newDataTable();stringconnstring="server=.;database=shoucao;uid=zxf;pwd=zxf123";SqlConnectionconn=newSqlConnection(connstring);conn.Open();//DataRowdr=null;if(this.dataGridView1.DataSource!=null){intallrow=this.dataGridView1.Rows.Count;//总行数stringzdbh=null;stringjyrqsj=null;stringzzh=null;stringfkh=null;stringjyje=null;stringshfy=null;stringjsje=null;stringxtckh=null;stringxtgzh=null;stringjyqd=null;stringjyle=null;intid=0;//intA=0;try{for(inti=0;i<dataGridView1.Rows.Count;i++){zdbh=this.dataGridView1.Rows[i].Cells[0].Value.ToString();jyrqsj=this.dataGridView1.Rows[i].Cells[1].Value.ToString();zzh=this.dataGridView1.Rows[i].Cells[2].Value.ToString();fkh=this.dataGridView1.Rows[i].Cells[3].Value.ToString();jyje=this.dataGridView1.Rows[i].Cells[4].Value.ToString();shfy=this.dataGridView1.Rows[i].Cells[5].Value.ToString();jsje=this.dataGridView1.Rows[i].Cells[6].Value.ToString();xtckh=this.dataGridView1.Rows[i].Cells[7].Value.ToString();xtgzh=this.dataGridView1.Rows[i].Cells[8].Value.ToString();jyqd=this.dataGridView1.Rows[i].Cells[9].Value.ToString();jyle=this.dataGridView1.Rows[i].Cells[10].Value.ToString();++id;stringsqlInsert="insertintodataGridViewvalues('"+id+"','"+zdbh+"','"+jyrqsj+"','"+zzh+"','"+fkh+"','"+jyje+"','"+shfy+"','"+jsje+"','"+xtckh+"','"+xtgzh+"','"+jyqd+"','"+jyle+"')";SqlCommandcmd=newSqlCommand(sqlInsert,conn);cmd.ExecuteNonQuery();}}catch(Exception){//MessageBox.Show("Exception:"+ex.Message);}}if(dataGridView1.Rows.Count>0)//把数据库表中的数据显示到表中,可判断有没有数据{MessageBox.Show("导入成功!");}else{MessageBox.Show("没有数据!");}}privatevoiddataGridView1_CellContentClick(objectsender,DataGridViewCellEventArgse){}}}Excel.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.IO;usingSystem.Data;usingSystem.Text.RegularExpressions;usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;usingNPOI.HSSF.UserModel;namespaceKQ{classExcel:IDisposable{privatestringfileName=null;privateIWorkbookworkbook=null;privateFileStreamfs=null;privatebooldisposed;publicExcel(stringfileName){this.fileName=fileName;disposed=false;}///<summary>///将excel中的数据导入到DataTable中///</summary>///<paramname="sheetName">excel工作薄sheet的名称</param>///<paramname="isFirstRowColumn">第一行是否是DataTable的列名</param>///<returns>返回的DataTable</returns>publicDataTableExcelToDataTable(stringsheetName,boolisFirstRowColumn){ISheetsheet=null;DataTabledata=newDataTable();intstartRow=0;try{fs=newFileStream(fileName,FileMode.Open,FileAccess.Read);if(fileName.IndexOf(".xlsx")>0)//2007版本workbook=newXSSFWorkbook(fs);elseif(fileName.IndexOf(".xls")>0)//2003版本workbook=newHSSFWorkbook(fs);if(sheetName!=null){sheet=workbook.GetSheet(sheetName);if(sheet==null){sheet=workbook.GetSheetAt(0);//如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet}}else{sheet=workbook.GetSheetAt(0);}//获取并显示设置列if(sheet!=null){//获取第一行,并设置为列IRowfirstRow=sheet.GetRow(0);intcellCount=firstRow.LastCellNum;//一行最后一个cell的编号即总的列数if(isFirstRowColumn){for(inti=firstRow.FirstCellNum;i<cellCount;++i){ICellcell=firstRow.GetCell(i);if(cell!=null){stringcellValue=cell.StringCellValue;if(cellValue!=null){string[]s=Regex.Replace(cellValue.Trim(),"\s+","").Split('');//将多余的空格转成一个空格,然后变成数组for(inta=0;a<s.Length;a++){if(s[a].ToString()!=null&&s[a].ToString().Length!=0){DataColumncolumn=newDataColumn(s[a]);data.Columns.Add(column);//赋值到当前行的每一列,直接给dataTable}}}}}startRow=sheet.FirstRowNum+1;}else{startRow=sheet.FirstRowNum;}//最后一列的标号//获取每一行的数据introwCount=sheet.LastRowNum;for(inti=startRow;i<=rowCount;++i){IRowrow=sheet.GetRow(i);if(row==null)continue;//没有数据的行默认是null       DataRowdataRow=data.NewRow();for(intj=row.FirstCellNum;j<cellCount;++j){if(row.GetCell(j)!=null)//同理,没有数据的单元格都默认是null{//循环列读取string[]s=Regex.Replace(row.GetCell(j).StringCellValue,"\s+","").Split('');for(inta=0;a<s.Length;a++){if(s[a].ToString()!=null&&s[a].ToString().Length!=0){DataColumncolumn=newDataColumn(s[a]);//将当前行的数据赋给dataRow,然后将dataRow给dataTabledataRow[a]=column.ToString();}}}}data.Rows.Add(dataRow);}}returndata;}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);returnnull;}}publicvoidDispose(){thrownewException("Themethodoroperationisnotimplemented.");}}}

解决方案

解决方案二:
把ID列删除了也能导入,但是就是可能重复导入,求大神教

时间: 2024-09-10 12:25:06

关于C#导入excel到sql server的问题的相关文章

导入excel数据sql server 文本被截断解决办法

excel文件里面的某一单元格文本非常长,在导入SQL Server 2008时,会出现如下错误: - 正在执行 (错误) 消息 错误 0xc020901c: 数据流任务 1: 输出"Excel 源输出"(9) 上的 输出列"F6"(30) 出错.返回的列状态是:"文本被截断,或者一个或多个字符在目标代码页中没有匹配项.". 解决方法:先将Excel数据导入到Access中,再将access数据导入到sql server中 解决方法二直接修改字段

asp.net Excel转换为SQL Server的方法_实用技巧

1.功能分析 通过Microsoft.Jet.OLEDB.4.0方式可实现使用ADO.NET访问Excel的目的,如以下示例代码为连接Excel数据的字符串: 复制代码 代码如下: string strOdbcCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\2010年图书销售情况.xls;Extended Properties=Excel 8.0"; 2.实施方法 程

怎样从MS Office Excel 2007导入数据到SQL Server 2005

SSIS开发人员经常会需要从一个Microsoft Office Excel 2007电子数据表导入数据.这篇文章提供了一个关于怎样从一个Microsoft Office Excel 2007电子数据表导入数据到一个SQL Server 2005数据库的逐步指导. 第一步是点击开始并选择运行并输入CMD然后在命令提示符里输入DTSWIZARD.SQL Server 导入和导出向导的欢迎界面将显示出来,如下图所示: 当你点击下一步按钮时,它将进入选择数据源向导界面.用户应该选择数据源为Micros

联系使用Excel和SQL server

这篇文章是基于两个软件的――SQL Server 和 Excel.这篇文章会帮助你了解如何将这两个软件天衣无缝地衔接起来,来进行数据的输出.通过这种方法,你所提供的报表和信息将帮助他们更有效地进行工作,并且可以减少用户们求助公司DBA的频率. 当今,许多公司都使用SQL Server来处理关于产品.服务和支持方面的数据――所有那些你能够想象得到的数据.通常,安装有SQL Server的公司都同时安装有非常庞大和贵重的软件应用程序,这些应用程序是用来从数据库中插入和查找数据用的.当这些应用程序能够

如何远程把sql server中的数据备份和导入到本地sql server中?

server|备份|数据 一:备份远程数据库,将备份文件拷贝到本地,然后在本地还原数据库. 二:将远程数据库的数据文件跟日志文件拷贝到本地(拷贝之前需要先停止远程数据库服务,否则无法进行拷贝),然后在本地进行附加数据库操作. 三:(需要知道远程数据库的登录名跟密码)打开企业管理器,在"sql server"组上右键选择"新建sql server注册",点下一步,在"可用的服务器"中输入远程服务器的IP,然后点击"添加",继续下

用Excel建立SQL Server数据字典和报表的脚本

这是一个很好的问题.解决这个问题最简单的方法是从扩展属性中获得值到物理表中,因此你可以很容易通过Microsoft Excel.报表服务或其它任何报表工具导出数据. 要启动这个过程,你需要配置下面列出的存储过程dbo.sp_get_extendedproperty. [dbo].[sp_get_extendedproperty] USE [master] GO CREATE PROCEDURE [dbo].[sp_get_extendedproperty] @databasename varch

SQL SERVER导入数据到ORACLE的方法总结

我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去ORACLE数据库执行. CREATE TABLE TEST (       ID   INT ,       NAME VARCHAR(12)   )   INSERT INTO dbo.TEST   SELECT 1001, 'Kerry' UNION ALL   SELECT 1002, 'Jim

批量装载XML文件到SQL SERVER 2K

server|xml 出于项目的需求,要从一个服务器的SQL导出数据然后导入到另一SQL服务器,项目要求不能作简单的数据同步,所以想采用XML数据格式处理.网上看到很多文章都是大同小异,说的不是很详细,例子也 全,基本都看不大懂.现在还有俩个 问题: 1.datetime类型字段有没有更好的处理方法? 2.主键重复问题,不忽略而是替换怎么处理?有什么参数嘛? 以下是偶的代码,共三部分:形成SCHEMA文件.从SQL SERVER创建XML数据.导入XML到SQL SERVER include文件

MS SQL Server 2000数据转换服务部署

server|数据|转换 1. 目标 MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务.现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包.所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作.其中需要重点解决的一个问题是,在目标环境中,DT