C#--将Excel数据导入DataGridView,再把DataGridView导入SqlServer数据库(操作Excel的OleDbHelper通用数据访问类)

以下是学习笔记:

一,实现效果:

1,原始的Excel数据:

 

 2,点击“从外部Excel文件导入数据”。把上面的Excel文件导入UI显示

 

 3,点击“保存到数据库” 又可以把UI的数据保存在SqlServer数据库

 

 

4,分析实现以上功能的思路

 

 一,编写一个能够读取Excel的通用数据访问类OleDbHelper

 

OleDbHelper代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;

namespace DAL.Helper
{
    class OleDbHelper
    {
        //适合Excel2003版本
        // private static string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0";

        //适合Excel2007以后的版本
        private static string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0";

        /// <summary>
        /// 执行增、删、改(insert/update/delete)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static int Update(string sql)
        {
            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            try
            {
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                return result;
            }
            catch (Exception ex)
            {
                //写入日志。。。
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 执行单一结果查询(select)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static object GetSingleResult(string sql)
        {
            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            try
            {
                conn.Open();
                object result = cmd.ExecuteScalar();
                return result;
            }
            catch (Exception ex)
            {
                //写入日志。。。
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 执行多结果查询(select)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static OleDbDataReader GetReader(string sql)
        {
            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            try
            {
                conn.Open();
                OleDbDataReader objReader =
                    cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return objReader;
            }
            catch (Exception ex)
            {
                conn.Close();
                throw ex;
            }
        }
        /// <summary>
        /// 执行返回数据集的查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql)
        {
            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd); //创建数据适配器对象
            DataSet ds = new DataSet();//创建一个内存数据集
            try
            {
                conn.Open();
                da.Fill(ds);  //使用数据适配器填充数据集
                return ds;  //返回数据集
            }
            catch (Exception ex)
            {
                //写入日志。。。
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 读取数据到DataSet中
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql, string path)
        {
            OleDbConnection conn = new OleDbConnection(string.Format(connString, path));
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd); //创建数据适配器对象
            DataSet ds = new DataSet();//创建一个内存数据集
            try
            {
                conn.Open();
                da.Fill(ds);  //使用数据适配器填充数据集
                return ds;  //返回数据集
            }
            catch (Exception ex)
            {
                //写入日志。。。
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

  

二,编写ImportDataFromExcel类,添加查询Excel数据表的方法。

操作Excel跟操作SqlServer很类似,

注意:ImportDataFromExcel类很难做到通用,这个根据客户的表结构和实体属型来定制的

工作薄:整个Execl文件,类似数据库

工作表:类似的数据库的一张表

 

 

ImportDataFromExcel类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using Models;

namespace DAL.Helper
{
    /// <summary>
    /// 从Excel中导入数据
    /// </summary>
    public class ImportDataFromExcel
    {
        /// <summary>
        /// 从Excel文件中读取数据
        /// </summary>
        /// <param name="path">Excel文件的路径</param>
        /// <returns>对象的集合</returns>
        public List<Student> GetStudentByExcel(string path)
        {
            List<Student> list = new List<Student>();
            DataSet ds = OleDbHelper.GetDataSet("select * from [Student$] ", path);
            DataTable dt = ds.Tables[0];
            foreach (DataRow row in dt.Rows)
            {
                list.Add(new Student()
                    {
                        StudentName = row["姓名"].ToString(),
                        Gender = row["性别"].ToString(),
                        Birthday = Convert.ToDateTime(row["出生日期"]),
                        Age = DateTime.Now.Year - Convert.ToDateTime(row["出生日期"]).Year,
                        CardNo = row["考勤卡号"].ToString(),
                        StudentIdNo = row["身份证号"].ToString(),
                        PhoneNumber = row["电话号码"].ToString(),
                        StudentAddress = row["家庭住址"].ToString(),
                        ClassId = Convert.ToInt32(row["班级编号"])
                    });
            }
            return list;
        }

        /// <summary>
        /// 将集合中的对象插入到SqlServer数据库
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public bool Import(List<Student> list)
        {
            List<string> sqlList = new List<string>();
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.Append("insert into Students(studentName,Gender,Birthday,");
            sqlBuilder.Append("StudentIdNo,Age,PhoneNumber,StudentAddress,CardNo,ClassId)");
            sqlBuilder.Append(" values('{0}','{1}','{2}',{3},{4},'{5}','{6}','{7}',{8})");
            foreach (Student objStudent in list)
            {
                string sql = string.Format(sqlBuilder.ToString(), objStudent.StudentName,
                     objStudent.Gender, objStudent.Birthday,
                    objStudent.StudentIdNo, objStudent.Age,
                    objStudent.PhoneNumber, objStudent.StudentAddress, objStudent.CardNo,
                    objStudent.ClassId);
                sqlList.Add(sql);
            }
            return SQLHelper.UpdateByTran(sqlList);
        }
    }
}

  

三,在DataGridView中展示Excel中导入的数据

 

 

4,在SQLHelper类中编写同事“插入多条SQL语句的事务UpdateByTran方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DAL
{
    /// <summary>
    ///  通用数据访问类
    /// </summary>
    class SQLHelper
    {

        // private static readonly string connString = "Server=.;DataBase=StudentManageDB;Uid=sa;Pwd=password01!";


        private static readonly string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
   

        //private static readonly string connString =
        //    Common.StringSecurity.DESDecrypt(ConfigurationManager.ConnectionStrings["connString"].ToString());

        /// <summary>
        /// 执行增、删、改(insert/update/delete)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static int Update(string sql)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 执行单一结果查询(select)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static object GetSingleResult(string sql)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                object result = cmd.ExecuteScalar();
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 执行多结果查询(select)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string sql)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                SqlDataReader objReader =
                    cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return objReader;
            }
            catch (Exception ex)
            {
                conn.Close();
                throw ex;
            }
        }
        /// <summary>
        /// 执行返回数据集的查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataAdapter da = new SqlDataAdapter(cmd); //创建数据适配器对象
            DataSet ds = new DataSet();//创建一个内存数据集
            try
            {
                conn.Open();
                da.Fill(ds);  //使用数据适配器填充数据集
                return ds;  //返回数据集
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 启用事务执行多条SQL语句
        /// </summary>      
        /// <param name="sqlList">SQL语句列表</param>      
        /// <returns></returns>
        public static bool UpdateByTran(List<string> sqlList)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            try
            {
                conn.Open();
                cmd.Transaction = conn.BeginTransaction();   //开启事务
                foreach (string itemSql in sqlList)//循环提交SQL语句
                {
                    cmd.CommandText = itemSql;
                    cmd.ExecuteNonQuery();
                }
                cmd.Transaction.Commit();  //提交事务(同时自动清除事务)
                return true;
            }
            catch (Exception ex)
            {
                if (cmd.Transaction != null)
                    cmd.Transaction.Rollback();//回滚事务(同时自动清除事务)
                throw new Exception("调用事务方法UpdateByTran(List<string> sqlList)时出现错误:" + ex.Message);
            }
            finally
            {
                if (cmd.Transaction != null)
                    cmd.Transaction = null;
                conn.Close();
            }
        }
        /// <summary>
        /// 获取服务器的时间
        /// </summary>
        /// <returns></returns>
        public static DateTime GetServerTime()
        {
            return Convert.ToDateTime(GetSingleResult("select getdate()"));
        }
    }
}

  

5,在ImportDataFromExcel类中,编写保存“多个集合对象的”的方法

 

 

6,在UI中将导入的数据保存在SQL数据库

    //保存到数据库
        private void btnSaveToDB_Click(object sender, EventArgs e)
        {
            //【1】验证数据(保证List集合中有数据)
            if (list == null || list.Count == 0)
            {
                MessageBox.Show("目前没有要导入的数据!", "导入提示");
                return;
            }
            //【2】遍历集合(方法1:每查询一个对象,就提交一次数据)
            //(方法2:每遍历一次,就生成一条SQL语句)
            try
            {
                if (new DAL.Helper.ImportDataFromExcel().Import(this.list))
                {
                    MessageBox.Show("数据导入成功!", "导入提示");
                    this.dgvStudentList.DataSource = null;
                    this.list.Clear();
                }
                else
                {
                    MessageBox.Show("数据导入失败!", "导入提示");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("数据导入失败!具体原因:" + ex.Message, "导入提示");
            }
        }

  

posted @ 2020-11-23 22:44  包子789654  阅读(3174)  评论(2)    收藏  举报