在VS2015中使用C#操作数据库并实现Excel报表导出与打印的具体过程
在VisualStudio2015中用C#通过System.Data.SqlClient连接SQLServer、System.Data.OleDb连接Access,执行增删改查;并借助Microsoft.Office.Interop.Excel实现Excel报表导出与打印,需注意COM资源释放及连接字符串配置。
在Visual Studio 2015环境下,同时操作SQL Server和Access数据库,还要顺带搞定Excel报表的导出与打印——这几乎是每个桌面应用开发都会遇到的组合拳。最近项目里频繁用到这些功能,开发环境是VS2015,数据库在Sql和Access之间切换,Office 2013负责做Excel交互。趁热把具体实现过程整理出来,方便自己日后查阅,也希望能给有同样需求的朋友一点参考。
一、C# 连接Sql数据库
C#里连接SQL Server,最常用的就是System.Data.SqlClient命名空间。下面这段代码展示了最典型的连接与查询流程:
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
string query = "SELECT * FROM YourTableName";
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0)); // 假设第一列是字符串类型
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("连接数据库或执行查询时出错: " + ex.Message);
}
}
}
}
拆开来看,几个关键点:
- 连接字符串里要填服务器名、数据库名、用户名和密码,实际使用时把占位符替换掉就行。
- using语句是必须养成的习惯——连接、命令、读取器都能在代码块结束时自动释放,避免资源泄漏。
- 执行查询用
SqlCommand配合ExecuteReader,返回的SqlDataReader可以逐行读取结果集。这里只是示例,实际项目往往会封装成通用方法。
二、C# 连接Access数据库
Access走的不是SqlClient那一套,得用System.Data.OleDb命名空间。代码逻辑和SQL Server版本几乎一样,只是换了一组类名:
using System;
using System.Data.OleDb;
class Program
{
static void Main()
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=YOUR_ACCESS_FILE_PATH;";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
try
{
connection.Open();
string query = "SELECT * FROM YourTableName";
using (OleDbCommand command = new OleDbCommand(query, connection))
{
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("连接数据库或执行查询时出错: " + ex.Message);
}
}
}
}
这里有两个细节要留意:
- 连接字符串里的Provider指定为
Microsoft.ACE.OLEDB.12.0,它支持Office 2007及以上版本的Access数据库(.accdb文件)。如果是早期.mdb文件,可能需要用Microsoft.Jet.OLEDB.4.0。 - 路径是Access文件的实际物理路径,建议用绝对路径或者通过
AppDomain.CurrentDomain.BaseDirectory拼接。
三、SQL语句操作
无论用SQL Server还是Access,基础的增删改查语法差异很小。以插入数据为例:
-- Sql插入语句示例
INSERT INTO YourTableName (Column1, Column2, Column3)
VALUES ('Value1', 'Value2', 'Value3');
-- Access插入语句示例,语法基本一致
INSERT INTO YourTableName (Column1, Column2, Column3)
VALUES ('Value1', 'Value2', 'Value3');
INSERT INTO后面跟表名和列名,VALUES里填对应值,顺序要一致。需要注意一点:Access对某些关键字(如Date、Name)比较敏感,如果列名是关键字,记得用方括号括起来,比如[Date]。
四、Excel报表导出
在VS2015中操作Excel,通常借助Microsoft.Office.Interop.Excel库。添加引用的路径是:项目右键→添加引用→COM选项卡→选择“Microsoft Excel 15.0 Object Library”(15.0对应Office 2013)。

下面是一段把内存数据写入Excel并保存的示例:
using System;
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main()
{
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = workbook.Sheets[1];
// 假设已经从数据库获取到数据
string[,] data = { { "Data1", "Data2" }, { "Data3", "Data4" } };
for (int i = 0; i < data.GetLength(0); i++)
{
for (int j = 0; j < data.GetLength(1); j++)
{
worksheet.Cells[i + 1, j + 1] = data[i, j];
}
}
workbook.Sa veAs("YourExcelFilePath.xlsx");
workbook.Close();
excelApp.Quit();
}
}
流程很直观:新建Excel应用实例→创建工作簿→获取第一个工作表→遍历数据并写入单元格→保存文件→清理对象。需要特别注意的是,Interop操作完成后一定要调用Quit()和ReleaseComObject(本例略),否则Excel进程会一直挂在后台。另外,生产环境建议考虑NPOI或EPPlus等无Office依赖的第三方库,避免COM权限和版本兼容问题。
五、Excel报表打印
打印同样基于Interop,代码甚至更简单:
using System;
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main()
{
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workbook = excelApp.Workbooks.Open("YourExcelFilePath.xlsx");
Excel.Worksheet worksheet = workbook.Sheets[1];
worksheet.PrintOut();
workbook.Close();
excelApp.Quit();
}
}
PrintOut()方法不带参数时使用默认打印机和默认设置。如果需要对打印份数、页面范围等做精细化控制,可以传入PrintOutEx的重载参数。同样,用完记得释放COM资源。

总结
以上就是在VS2015 + Office 2013环境下,用C#操作SQL Server和Access数据库,并完成Excel报表导出与打印的一套完整方案。代码本身不算复杂,但资源释放、连接字符串配置、引用添加这些细节很容易踩坑。实际项目中建议把这些数据库操作封装成独立的数据访问层,Excel操作则可以考虑更轻量的开源组件。
