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

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

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

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

    好戏才刚刚开始!

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

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

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

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

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

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

    附上源代码和测试数据

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

     
     
    分类: C#
  • 相关阅读:
    go 接收发送文件
    【0031】反转整数/判断回文
    【003】链表或字符串的【反转】【左旋转】
    【002】链表或字符串模拟加法/加一/乘法
    【01】数组中只出现一次的数字
    【面试题050】树中两个结点的最低公共祖先
    【面试题049】把字符串转换成整数
    【面试题048】不能继承的类
    【面试题047】不用加减乘除做加法
    【面试题046】求1+2+...+n
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3302795.html
Copyright © 2020-2023  润新知