前几天做一个项目的时候,需要从外部导入数据,当时数据都在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):
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;