Fork me on GitHub
C# 从Excel2003将数据导入到SQL2005,数据发生截断的问题分析

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() + "\n");
            }
        }
复制代码

ok !
我们看一下测试的结果

 

通用使用DataReader也是同样的结果哦,大家有可以下载我下面的 【源码包】 自行测试哦

嘿嘿!不要以为就这样完了!

好戏才刚刚开始!

我们将刚刚的第14行数据!复制一下,粘贴在第一行,【可以查看"测试数据2.xls"】

我们在重复上面的步骤 显示输出一下

 

至此问题描述完毕!原因我还没有找到,如果代码没有问题话那就是 数据驱动程序了问题了 瞎猜了,

我调试过程序,14行数据其实是完全读取了,但是放在循环语句中就不行了,

那么是Excel2003文件的问题吗?  我设置单元格格式 为 文本 也没有效果

希望能有高手协助,也许原因就是很小的一个地方引起的。我已经在园子内提问了,但是还没有找到方法。

 

附上源代码和测试数据

https://files.cnblogs.com/Sky-cloudless/DemoExcel.rar

 

 
 
分类: C#
posted on 2013-09-05 10:49  HackerVirus  阅读(234)  评论(0编辑  收藏  举报