C#对SQL Server 中的数据导入导出


2009. 17 DATABASE 数据库 1 前言 在数据库应用系统开发中, 经常需要将 Excel 中的数据直 接导入到 SQL Server 数据库中; 另外, 为了方便地对数据库中 的数据进行打印, 有时又需要将数据库中的数据导出到 Excel 中, 借助 Excel 自身的打印功能进行报表输出和打印。 以导入 导出学生信息为例, 讲解在 Visual C#2005 中实现导入导出数 据的方法。 2 数据库及表 学生信息数据库名称为: db_student。 数 据 库 中 包 含 student 表, 表中包含如下字段, 如表 1 所示。 3 数据导入 导 入 数 据 时 , 可 先 将 Excel 中的数据导入到窗体的 DataGridView 控件中, 再将 DataGridView 控件中的数据存入数 据库即可。 Excel 数据文件可以看作是一个数据库, 其中的工作表可 看作是数据库中的表。 通 过 提 供 程 序 “Microsoft.Jet.OLEDB. 4.0” 连 接 Excel 数 据 源 , 读取其中的数据, 然 后 再 显 示 到 DataGridView 控件中。 在 Visual C#2005 中新建一个项目, 在 项 目 中 添 加 一 个 Windows 窗体, 窗体文件名称为: frmInputStudent.cs。 该窗体界面运行效果如图 1 所示。 (1) 该窗体上包含如下主要控件: 1) 在 ToolStrip 工 具 栏 上 放 置 3 个 Button, 名 称 分 别 是 “tsbInput”、“tsbSave” 和 “tsbExit”。 2) 1 个 Label 控件, 显示操作说明, 其 Text 属性设置为图 1 中所示文字。 3) 1 个 DataGridView 控件, 名称为: dgvStudent。 用来显 示导入的学生信息, 4) 1 个 OpenFileDialog 控 件 , 名 称 为 “openFileDialog1”, 用来显示打开文件对话框, 选择要打开的 Excel 文件。 (2) 该窗体代码如下: using System.Data.OleDb; using System.Data.SqlClient; DataTable dt;//存放导入的数据 private void frmInputStudent_Load (object sender, EventArgs e) { C# 对 SQL Server 中的数据导入导出 李志云 摘 要: 利用 Visual C# 2005 编程将 Excel 中的数据导入到 SQL Server 2005 数据库, 以便快 速将数据存入数据库中; 解析将 SQL Server 2005 数据库中的数据导出到 Excel, 以便利用 Excel 自身的功能进行报表输出和打印。 关键词: C#; SQL Server; Excel 表 1 图 1 43 2009. 17 this.dgvStudent.ReadOnly = true; tsbSave.Enabled = false; } /* 自定义方法,导入 Excel 中的数据到数据集中 */ public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source = " + Path + ";" + "Extended Properties =Excel 8.0;"; OleDbConnection conn1 = new OleDbConnection (strConn); string strExcel = ""; OleDbDataAdapter da1 = null; DataSet ds = null; strExcel = "select 学号,姓名,性别,民 族,身 份 证 号,出 生 日 期,家庭住址,家庭电话,班级编号 from [Sheet1$]"; da1 = new OleDbDataAdapter(strExcel, strConn); ds = new DataSet(); if (conn1.State == ConnectionState.Closed) { conn1.Open(); } da1.Fill(ds); conn1.Close(); return ds; } private void tsbInput_Click(object sender, EventArgs e) //导入 Excel 文件 { string fileName = ""; try { openFileDialog1.Filter = "Excel 文件|*.xls"; openFileDialog1.ShowDialog(); fileName = openFileDialog1.FileName.ToString(); } catch (Exception ex) { MessageBox.Show("打 开 文 件 出 错 ! " + ex.Message. ToString()); } try { if (fileName ! = "")//如果已选了 Excel 文件 { DataSet ds = ExcelToDS(fileName); dt = new DataTable(); dt = ds.Tables[0]; this.dgvStudent.DataSource = dt; //将数据在表格中显示 tsbSave.Enabled = true; } } catch (Exception ex) { MessageBox.Show("导入文件出错!" + ex.Message. ToString()); } } private void tsbSave_Click(object sender, EventArgs e) //保存到数据库 { SqlConnection conn = new SqlConnection ("server= (local)\\sqlexpress;integrated security=true;database= db_student"); SqlCommand com = conn.CreateCommand(); com.CommandText = "insert into student values(@ 学号,@ 姓名,@ 性别,@ 民族,@ 身份证号,@ 出生日期,@ 家庭住 址,@ 家庭电话,@ 班级编号)"; com.Parameters.Add (new SqlParameter ("@ 学 号", SqlDbType.NChar)); com.Parameters.Add (new SqlParameter ("@ 姓 名", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 性 别", SqlDbType.NChar)); com.Parameters.Add (new SqlParameter ("@ 民 族", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 身 份 证 号", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 出 生 日 期", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 家 庭 住 址", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 家 庭 电 话", SqlDbType.NVarChar)); com.Parameters.Add (new SqlParameter ("@ 班 级 编 号", SqlDbType.NChar)); try { for (int i = 0; i < dt.Rows.Count; i++) { com.Parameters ["@ 学号"].Value = dt.Rows[i] [0].ToString(); com.Parameters ["@ 姓名"].Value = dt.Rows[i] [1].ToString(); com.Parameters ["@ 性别"].Value = dt.Rows[i] [2].ToString(); com.Parameters ["@ 民族"].Value = dt.Rows[i] [3].ToString(); com.Parameters ["@ 身 份 证 号 "].Value = dt. Rows[i][4].ToString(); com.Parameters ["@ 出 生 日 期 "].Value = dt. Rows[i][5].ToString(); com.Parameters ["@ 家 庭 住 址 "].Value = dt. 44 2009. 17 DATABASE 数据库 Rows[i][6].ToString(); com.Parameters ["@ 家 庭 电 话 "].Value = dt. Rows[i][7].ToString(); com.Parameters ["@ 班 级 编 号 "].Value = dt. Rows[i][8].ToString(); if (conn.State == ConnectionState.Closed) { conn.Open(); } com.ExecuteNonQuery(); conn.Close(); } MessageBox.Show("已成功将 EXCEL 数据导入到 数据库中! "); dgvStudent.DataSource = null; dgvStudent.ReadOnly = true; } catch (Exception ex) { MessageBox.Show (" 保 存 数 据 有 误 ! " + ex. Message.ToString()); } } private void tsbExit_Click(object sender, EventArgs e) { this.Close(); } 在导入学生信息窗体中, 导入 Excel 数据到数据集的代码 放在了一个自定义方法 ExcelToDS () 中 。 在 “导 入 Excel 文 件” 按钮的 Click 事件方法中, 调用 ExcelToDS () 方法, 得到 数 据 集 对 象 , 再将数据集对象的内容显示到表格控件 dgvStudent 中。 4 数据显示 Excel 对象模型包括了 128 个不同的对象, 从矩形、 文本 框等简单的对象到透视表、 图表等复杂的对象。 下面介绍一下 其中最重要, 也是用得最多的四个对象。 ( 1) ApplicationClass 对 象 。 ApplicationClass 对 象 处 于 Excel 对象模型层次结构的顶层, 表示 Excel 自身的运行环境。 ( 2) Workbook 对 象 。 Workbook 对 象 直 接 处 于 ApplicationClass 对象的下层, 表示一个 Excel 工作簿文件。 (3) Worksheet 对 象。 Worksheet 对 象 包 含 于 Workbook 对 象, 表示一个 Excel 工作表。 (4) Range 对 象。 Range 对 象 包 含 于 Worksheet 对 象 , 表 示 Excel 工作表中的一个或多个单元格。 导出数据库中的数据到 Excel 文件需要首先在项目中添加 对 COM 组 件 中 的 “Microsoft Excel 11.0 Object Library” 的 引 用 , 在 代 码 中 , 引 用 “ Microsoft.Office.Interop.Excel” 和 “Microsoft.Office.Core” 命名空间。 使用下面的步骤可以将数据库中的内容写入 Excel 文件: (1) 使用适配器对象执行查询命令, 查询出将要导出的数 据。 (2) 将查询结果填充到数据集或数据表对象中。 (3) 创 建 Excel 应 用 程 序 对 象 、 工作簿对象和工作表对 象。 (4) 依次将数据集或数据表对象中的每条记录写入到 Excel 工作表对象中。 在项目中再添加一个 Windows 窗 体 , 窗 体 文 件 名 称 为 : frmOutputStudent.cs。 该窗体运行效果如图 2 所示。 导出信息到 Excel 中的运行效果如图 3 所示。 (1) 该窗体上包含如下主要控件: 1) 1 个 ComboBox 控件, 提供班级编号的列表值。 2) 2 个 Button 控 件 , 名 称 分 别 为 :“ btnOutput”、 “btnExit|”。 (2) 该窗体代码如下: using System.Data.SqlClient; using Microsoft.Office.Interop.Excel; 图 2 图 3 45 2009. 17 using Microsoft.Office.Core; private void frmOutputStudent_Load (object sender, EventArgs e) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "server=(local)\\sqlexpress; integrated security=true;database=db_student"; //绑定班级编号组合框 SqlDataAdapter da = new SqlDataAdapter ("select distinct 班级编号 from student", conn); DataSet ds1 = new DataSet(); if (conn.State == ConnectionState.Closed) { conn.Open(); } da.Fill(ds1, "student"); conn.Close(); cbxClassNo.DataSource = ds1.Tables["student"]; cbxClassNo.DisplayMember = "班级编号"; } private void btnOutput_Click(object sender, EventArgs e) { SqlDataAdapter da = new SqlDataAdapter("select 学 号,姓 名,性 别,民 族,身 份 证 号,出 生 日 期,家 庭 住 址,家 庭 电 话 from student where 班 级 编 号 ='" + cbxClassNo.Text + "'", conn); System.Data.DataTable dt = new System.Data. DataTable(); int count = da.Fill(dt); if (count == 0) { MessageBox.Show("该班级没有学生记录! "); return; } ApplicationClass acExcel;//声明 Excel 应用程序对象 Workbook wb;//声明工作簿对象 Worksheet ws;//声明工作表对象 acExcel = new ApplicationClass(); acExcel.Visible = true; if (acExcel == null) { MessageBox.Show("EXCEL 无法启动! ", "信息提 示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } wb = acExcel.Workbooks.Add(true);//新建工作簿对象 ws = (Worksheet)wb.Worksheets[1]; //引用工作簿中的第 1 个工作表 //设置 Excel 表格中开头显示的内容 ws.Cells[1, 2] = "班级学生名册报表"; //在第 1 行第 2 个单元格中显示内容 ws.Cells[2, 1] = "班级编号:" + cbxClassNo.Text; ws.Cells [3, 1] = " 打 印 日 期 :" + DateTime.Now. ToLongDateString(); //设置行和列的索引 int rowindex = 5;//从第 5 行、第 1 列开始显示数据 int colindex = 1; foreach (DataColumn dc in dt.Columns) { //添加列名 ws.Cells[rowindex, colindex] = dc.ColumnName; //从第 5 行开始显示列名 colindex++; } int rowCount = dt.Rows.Count; int colCount = dt.Columns.Count; ws.get_Range (ws.Cells [rowindex + 1, 1], ws.Cells [rowCount + rowindex, colCount]).NumberFormatLocal = "@"; //设置显示的文本为字符格式,以防长数字出现科学记数法的数 //字形式 foreach (DataRow dr in dt.Rows) { //添加数据 rowindex++;//从第 6 行第 1 列开始显示数据 colindex = 1; foreach (DataColumn dc in dt.Columns) { ws.Cells [rowindex, colindex] = dr [dc. ColumnName].ToString(); colindex++; } } } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } 5 结语 利用上面的方法, 方便快捷地实现了 SQL Server 数据库中 的数据与 Excel 数据的转换。 该程序在 Visual Studio 2005+SQL Server Express2005+ Microsoft Office 2003 环境下调试通过。 (收稿日期: 2009-4-16) 46
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

丶工林云

贡献于2014-11-18

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf