C# 从Excel2003将数据导入到SQL2005,数据发生截断的问题分析
问题描述:大家没有遇到过这种情况使用自己编写的工具读取Excel2003文件中的数据,然后执行插入语句将数据批量导入到SQL2005.
一定有人遇到过数据截断的情况,大多数的原因是因为,数据库中的字段设置的太小导致的,只要稍微修改下就能解决。
但是下面的情况发生的原因是在读取Excel2003文件中的数据式,发生的读取数据截断,这种情况该怎么解决呢?
首先屡一下导入数据的思路,
将Excel2003加载到DataTable,或者你直接使用DataReader一行一行的从Excel2003问价中读取,读取一条插入一条
然后直接你的SQL语句导入;这样基本就ok了!
读取Excel2003文件的核心代码如下
我们采用两种方式 DataTable的方式和DataReader的方式
public class Conmmon { /// <summary> /// 读取excel文件获得DataTable /// </summary> /// <param name="strExcelFileName">目标Excel文件完全路径</param> /// <param name="strSheetName">工作表的名字</param> /// <returns></returns> public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName) { //string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';"; string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;IMEX=1';"; string strExcel = "select * from [" + strSheetName + "$]"; DataSet ds = new DataSet(); using (OleDbConnection conn = new OleDbConnection(strConn)) { conn.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn); adapter.Fill(ds, strSheetName); return ds.Tables[strSheetName]; } } /// <summary> /// 读取excel文件获得DataReader /// </summary> /// <param name="strExcelFileName"></param> /// <param name="strSheetName"></param> /// <returns></returns> public static OleDbDataReader ExcelToDataReader(string strExcelFileName, string strSheetName) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;IMEX=1';"; //string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';"; string strExcel = "select * from [" + strSheetName + "$]"; OleDbConnection conn = new OleDbConnection(strConn); OleDbCommand cmd = new OleDbCommand(strExcel, conn); try { conn.Open(); OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; } catch (System.Data.OleDb.OleDbException e) { throw new Exception(e.Message); } } }
ok!如果代码有什么问题,请大家指出来!
下面我们开始使用上面的代码输出一下“测试数据文件.xls”文件中的内容【在下面下载和源代码一起】
//使用DataTable的方式 private void btnTest_Click(object sender, EventArgs e) { DataTable myT = Conmmon.ExcelToDataTable(this.txtExcel.Text, "Content"); object obj = null; foreach (DataRow myrow in myT.Rows) { obj = myrow["qvod"]; txtResult.AppendText(obj.ToString() + " "); } }
ok !
我们看一下测试的结果
通用使用DataReader也是同样的结果哦,大家有可以下载我下面的 【源码包】 自行测试哦
嘿嘿!不要以为就这样完了!
好戏才刚刚开始!
我们将刚刚的第14行数据!复制一下,粘贴在第一行,【可以查看"测试数据2.xls"】
我们在重复上面的步骤 显示输出一下
至此问题描述完毕!原因我还没有找到,如果代码没有问题话那就是 数据驱动程序了问题了 瞎猜了,
我调试过程序,14行数据其实是完全读取了,但是放在循环语句中就不行了,
那么是Excel2003文件的问题吗? 我设置单元格格式 为 文本 也没有效果
希望能有高手协助,也许原因就是很小的一个地方引起的。我已经在园子内提问了,但是还没有找到方法。
附上源代码和测试数据