OLEDB 组件是微软开发的用于连接 Excel 工作簿,将 Excel 文件作为数据源进行读写,在使用时与 SQL 几乎一样。
1 引入命名空间
using System.Data.OleDb; // 使用命名空间
2 查询操作
// 查询学生信息
private DataRowCollection findStudentById() {
string id = textNumber.Text;
// 查询语句,Sheet1 是工作簿中的表名,后面的$是语法要求,必须加上
string SqlText = "select * from [Sheet1$] where 证件号 = '" + id + "'";
// 使用 LoadDataFromExcel 函数从 excel_File_Path 给定的路径读取工作簿内容,SqlText 作为查询语句,返回一个 DataSet 类型
DataSet ds = LoadDataFromExcel(excel_File_Path, SqlText);
// 得到一个数据表的集合,存放了所有的 Sheet
DataTableCollection datatable_collection = ds.Tables;
// 取出 数据表集合的第 1 个值,返回一个 DataTable 对象
DataTable dt = datatable_collection[0]; // 第一张表就是我们的数据
// 返回该 Sheet 的所有行记录
return dt.Rows;
}
// 从Excel中加载数据
private DataSet LoadDataFromExcel(string DataFileName, string SqlText) {
try {
// 连接语句,指定读取的文件名
string strConn = "Provider=microsoft.ace.oledb.12.0;Extended Properties=Excel 8.0;Data Source=" + DataFileName;
// 新建 OleDbConnection 连接对象
OleDbConnection Conn = new OleDbConnection(strConn);
Conn.Open(); // 打开连接
OleDbCommand Cmd = new OleDbCommand(SqlText, Conn);
OleDbDataAdapter oda = new OleDbDataAdapter();
oda.SelectCommand = Cmd;
DataSet ds = new DataSet();
oda.Fill(ds);
Conn.Close(); // 关闭连接
return ds;
} catch {
MessageBox.Show("请先导入表格!");
return null;
}
}
3 插入操作
// 登记来访学生信息
private int InsertDetectedStudentInfo(string xh, string xm, string sex, string id_Card, string xznj, string xy,
string zy, string bj, string sfzj, string xszt, string syd, string mz, string xslb) {
// 获取需要执行插入操作的 excel 文件名
string DataFileName = create_excel_path;
string strConn = "Provider=microsoft.ace.oledb.12.0;Extended Properties=Excel 8.0;Data Source=" + DataFileName;
OleDbConnection Conn = new OleDbConnection(strConn);
Conn.Open();
// 插入语句 insert into [Sheet1$] (字段名1,字段名2,...,字段名n) values (?,?,...,?)
OleDbCommand top = new OleDbCommand("insert into [Sheet1$] (学号,姓名,性别,证件号,现在年级,学院,专业,班级,是否在籍,学生状态,生源地,民族,学生类别) values(?,?,?,?,?,?,?,?,?,?,?,?,?)", Conn);
// top.Parameters.AddWithValue("?", 变量名) 这种写法较优,推荐使用
top.Parameters.AddWithValue("?", xh);
top.Parameters.AddWithValue("?", xm);
top.Parameters.AddWithValue("?", sex);
top.Parameters.AddWithValue("?", id_Card);
top.Parameters.AddWithValue("?", xznj);
top.Parameters.AddWithValue("?", xy);
top.Parameters.AddWithValue("?", zy);
top.Parameters.AddWithValue("?", bj);
top.Parameters.AddWithValue("?", sfzj);
top.Parameters.AddWithValue("?", xszt);
top.Parameters.AddWithValue("?", syd);
top.Parameters.AddWithValue("?", mz);
top.Parameters.AddWithValue("?", xslb);
// 如果执行成功,返回受到影响的行数,应该是一个非0数字
int res = top.ExecuteNonQuery();
Conn.Close();
return res;
}
4 测试查询以及插入函数,仅展示部分代码段
// 调用查询函数,返回数据行集合
DataRowCollection drc = findStudentById();
// 查询到了记录
if (drc.Count > 0) {
// 获取第 0 行 第 0 列数据值
string xh = drc[0][0].ToString();
string xm = drc[0][1].ToString();
string sex = drc[0][2].ToString();
string id_Card = drc[0][3].ToString();
string xznj = drc[0][4].ToString();
string xy = drc[0][5].ToString();
string zy = drc[0][6].ToString();
string bj = drc[0][7].ToString();
string sfzj = drc[0][8].ToString();
string xszt = drc[0][9].ToString();
string syd = drc[0][10].ToString();
string mz = drc[0][11].ToString();
string xslb = drc[0][12].ToString();
// 将这些数据值插入到 excel 文件中
int res = InsertDetectedStudentInfo(xh, xm, sex, id_Card, xznj, xy, zy, bj, sfzj, xszt, syd, mz, xslb);
if (res > 0) {
MessageBox.Show("核酸检测完成,已将该生信息登记入表!");
} else {
MessageBox.Show("登记失败,请放入下一张卡!");
}