C#导⼊Excel⽂件和数据库⽂件的对⽐
前⼏天做⼀个项⽬的时候,需要从外部导⼊数据,当时数据都在Excel⾥⾯,因此在⽹上学习了很久的导⼊Excel数据到程序⾥⾯的相关知识。发现从Excel⽂件中导⼊数据和从数据库导⼊数据有很多相同点,但也有⼀些⽅⾯的不同,因此对这两者做个对⽐,更能加深学习的效果。
第⼀,两个“五步⾛”:
从数据库(这⼉特指sql server)⾥获取数据,需要遵循以下步骤:
⾸先,导⼊命名空间:
using System.Data.SqlClient; // 连接SQLServer专⽤
using System.Data;
第⼆步,创建连接(需要SqlConnection),⼀般语法为:
SqlConnection lo_conn = new SqlConnection("Server=服务器名字或IP;Database=数据库名字;uid=⽤户名;pwd=密码");
例如:
SqlConnection lo_con = new SqlConnection();
lo_con.ConnectionString = "server=.;database=stu;uid=sa;pwd=sa";
此时,并没有真正连接到数据库,还需要再来⼀步:
lo_conn.Open(); //此时,才真正连接到了数据库。
第三步,向数据库发送SQL语句,此时需要使⽤SqlCommand:
SqlCommand lo_cmd = new SqlCommand();  //创建命令对象
lo_cmd.CommandText = "这⾥是SQL语句";  //写SQL语句
lo_cmd.CommandType = CommandType.Text;
lo_cmd.Connection = lo_con;            //指定连接对象,即上⾯创建的
第四步,处理SQL命令或返回结果集,此时需要使⽤SqlDataReader:
lo_cmd.ExecuteNonQuery();  //这个仅仅执⾏SQL命令,不返回结果集,实⽤于建表、批量更新等不需要返回结果的操作。
SqlDataReader lo_reader = lo_cmd.ExecuteReader();//返回结果集,以流的形式返回数据
或者,第四步,以数据集的⽅式返回结果集,此时还需要DataSet:
SqlDataAdapter dbAdapter = new SqlDataAdapter(lo_cmd); //注意与上⾯的区分开,与上⾯有何区别呢?
DataSet ds = new DataSet(); //创建数据集对象
dbAdapter.Fill(ds); //⽤返回的结果集填充数据集,这个数据集可以被能操作数据的控件DataBind
第五步,关闭连接:
lo_reader.Close();//或者dbAdapter.Close();
lo_conn.Close();
那,从Excel导⼊数据也需要遵循以下步骤(采⽤OleDB读取Excel⽂件的⽅法,⽹上还有另外常⽤的两
种,此处,不多介绍):
第⼀步,建⽴连接字符串(与连接数据库时的lo_cmd.ConnectionString⼀样):
string strCon = string.Format("Provider=Microsoft.Jet.OLEDB.{0}.0;" +
"Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" +
"data source={3};",
(fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (hasTitle ? "Yes":"NO"), filePath);
在这句话中出现的HDR和IMEX的含义:其中HDR⽤来设置是否将Excel表中的第⼀⾏作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是⽤来告诉驱动程序使⽤Excel⽂件的模式,其值有0、1、2三种,分别代表导出、导⼊、混合模式。在这⼉需要注意:当我们设置IMEX=1时,将强制混合数据转为⽂本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8⾏数据⾄少有⼀个是⽂本项的时候才起作⽤,如果某列前8⾏数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后⾏⾥的含有⽂本的数据仍然变空。
Excel 2003的连接字符串为:strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel
8.0;HDR=Yes;IMEX=1;'";
Excel 2007/2010 的连接字符串为:strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel
12.0;HDR=Yes;IMEX=1;'";
可以通过后缀名来判断:Excel 2003为.xls,Excel 2007/2010为.xlsx。
第⼆步,建⽴连接(此处⽤到了OleDBConnection):excel listview控件
OleDbConnection myConn = new OleDbConnection(strCon);
第三步,建⽴查询语句(与连接数据库的SQL语句lo_cmd.CommandText⼀样):
string strCom = " SELECT * FROM [⽂科$]";
第四步,以数据集的⽅式返回结果集(此处⽤到了OleDBAdapter):
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn)
DataSet ds = new DataSet();
myCommand.Fill(ds);
第五步,关闭连接:
myConn.Close();
myCommand.Close();
总结⼀下,从数据库获取数据的步骤——五步⾛:
1、导⼊命名空间;
2、创建连接,此时需要SqlConnection;
3、向数据库发送SQL语句,此时需要使⽤SqlCommand;
4、处理SQL命令或返回结果集,此时需要使⽤SqlDataReader;或者以数据集的⽅式返回结果集,此时还需要DataSet;
5、关闭连接;
从Excel⽂件中获取数据的步骤——五步⾛:
1、建⽴连接字符串;
2、建⽴连接,此处⽤到了OleDBConnection;(注:1、2步相当于从数据库获取数据的第1步)
3、建⽴查询语句(与连接数据库的SQL语句lo_cmd.CommandText⼀样);
4、以数据集的⽅式返回结果集,此处⽤到了OleDBAdapter和DataSet;
5、关闭连接;
从这两个“五步⾛”中,可以发现从数据库中获取数据和从Excel⽂件中获取数据的过程基本⼀样;不⼀样的只是连接字符串以及所使⽤的连接类不⼀样,⽽且这些不⼀样只是内容的不⼀样,样式以及作⽤都类似。
第⼆,数据怎么⽤?
数据库获取数据有两种⽅式,返回结果集,⽤到SqlDataReader;或者通过数据集的⽅式返回结果集,⽤到DataSet;
举个例⼦来说,有⼀个成绩数据库,程序从成绩数据库获取成绩之后,第⼀,⽤于呈现到界⾯;第⼆,计算总分及排名;
⼀、从数据库获取数据呈现到界⾯,只需要将获取的数据关联到C#提供的数据显⽰控件,普遍使⽤的有两类:DataGridView控件及ListView控件,其中DataGridView通过数据源读取数据库,⾃带增、删、改、查及排序的功能;⽽ListView的增删改查需要⾃⼰⼿动编写,⼀般是在需要多种⽅式显⽰数据时使⽤。因此,在功能上,DataGridView更好,但在性能上,ListView更甚⼀筹。(具体使⽤见下⼀篇⽂章);在此,使⽤DataGridView控件;
连接数据库的代码如下:
DataTable GetDataFromSql()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=.;database=GK_score;uid=sa;pwd=***";
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select * From bj_score";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
//SqlDataReader reader = cmd.ExecuteReader(); //以流的形式从数据库读取数据
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
DataTable dt2 = GetDataFromSql();
dataGridView2.DataSource = dt2;
读取数据显⽰如下:
⼆、从Excel⽂件中获取数据并呈现到界⾯上,也使⽤DataGridView插件,代码如下:
DataTable GetDataFromExcel(boolean hasTitle = false){
string strCon = string.Format("Provider=Microsoft.Jet.OLEDB.{0}.0;" +
Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" + "data source={3};",
(fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (hasTitle ? "Yes" : "NO"), filePath);    string strCom = " SELECT * FROM [⽂科$]";
OleDbConnection myConn = new OleDbConnection(strCon)
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
myCommand.Fill(ds);
if (ds == null || ds.Tables.Count <= 0) return null;
return ds.Tables[0];
}
DataTable dt = this.GetDataFromExcelByConn();
dataGridView1.DataSource = dt;
界⾯呈现也如上图所⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。