C#Excel导入SQLServer

       正在做一个体检管理系统,涉及到把Excel数据导入到SQLServer,本以为挺简单的一件事还是折腾了会,在读取完数据更新到数据库时用了三种方法,觉得这个最可取,话不多说,来看代码。

       B S系统,先使用FileUpload控件保存当前Excel文件到服务器,再读取Excel中的数据,如下:

public DataSet  GetExcelTabel()
    {
        
        string isXls = "";//用来保存文件扩展名
        //检查文件是否存在
        if (FileUpload1.HasFile == false)//HasFile用来检查FileUpload是否有指定文件
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "");
            //return;//当无文件时,返回
            return null;
        }
        //System.IO.Path.GetExtension获得文件的扩展名
        isXls = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
        //如果不是excel文件给出提示
        if (isXls != ".xls")
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "");
            //return;//当选择的不是Excel文件时,返回
            return null;
        }
        //给文件名加上时间
        string filename = DateTime.Now.ToString("yyyymmddhhMMss") + FileUpload1.FileName;
        //获取Execle文件名  DateTime日期函数
        string savePath = Server.MapPath(("~\\uploads\\") + filename);//Server.MapPath 获得虚拟服务器相对路径
        //如果已经存在就清空
        ClearFile(Server.MapPath("~\\uploads"));
        FileUpload1.SaveAs(savePath);                        //SaveAs 将上传的文件内容保存在服务器上
        try
        {
            //连接字符串
            string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + savePath + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
            //建立adapter获取Excel中的数据
            OleDbDataAdapter da = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
            //填充读取的Excel数据到DataSet
            DataSet ds = new DataSet();
            da.Fill(ds, "T_TeamPatient");
            return ds;
        }
        catch (Exception)
        {
            return null;
            throw new Exception ("获取Excel中的数据失败");
        }
    }
          再把读取的数据导入到数据库中:
public bool ImportToSQL()
    {
        DataSet ds=GetExcelTabel ();//从excel中获取的dataset
        
        DataSet dsPre = new DataSet();//从数据库获取的dataset
        //建立数据库连接
        string connString = "server=.;database=CHAOYANG_HOSPITAL;uid=sa;pwd=123456";
        string sqlnowtxt = "select * from T_TeamPatient";
        SqlConnection sqlconn = new SqlConnection(connString);
        SqlCommand sqlcmd = new SqlCommand(sqlnowtxt , sqlconn);
        try
        {
            sqlconn.Open();
            //建立映射
            SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
            da.Fill(dsPre,"T_TeamPatient");//从数据库中获取数据
            //复制excel表dataset中的数据表格
            DataTable dt = ds.Tables[0].Copy ();
            //添加到即将更新到数据库的dataset
            foreach (DataRow  dr in dt.Rows )
            {
                dsPre.Tables[0].Rows.Add(dr.ItemArray);
            }

            //更新数据库
            SqlCommandBuilder scb = new SqlCommandBuilder(da);
            da.UpdateCommand = sqlcmd;
            da.Update(dsPre, "T_TeamPatient");
            return true;
        }
        catch (Exception)
        {
            return false;
            throw new Exception("导入数据到数据库失败");
        }
        finally {
            sqlconn.Close();
            sqlcmd.Dispose();
        }             
        
    }
         在这里,更新dsPre时,提供给大家另外两种思路:

             DataTable dt = ds.Tables[0].Copy ();
            dsPre.Tables.Add(dt);
            dsPre.Tables.Remove(dsPre.Tables[0]);
即先删除从数据库来的表,再补充上Excel的数据表,再更新上去,为什么需要先copy一下?因为dt原属于ds,如果强制添加给dsPre则会引发“已经属于另外一个DataSet”的错误。这个方法更适合替换数据而非补充数据。

        另外一种方法是,先将读取的Excel数据转换为DataRow数组,使用Merge将两张表合并:

      dsPre .Merge (dataRow[]);
         当然最好是把数据库连接写成一个独立的函数,以供其它函数调用;需要注意的是总需要“select”语句让SqlDataAdapter知道需要更新数据库的哪张表;Update时标明映射的数据库表名。

        维护考试系统时,里面有导入Excel到数据库的函数,想着直接粘贴过来,改来改去反而越改越乱,索性自己写了一个。

        

你可能感兴趣的:(C#Excel导入SQLServer)