C#使用ADO操作Excel
1 说明
把excel当成一个数据库,类似于Access数据库来操作。
2 源代码
2.1 Model层
/// <summary>
/// 人员信息
/// </summary>
public class MPerson
{
/// <summary>
/// 人员姓名
/// </summary>
public string PersonName
{
get;
set;
} /// <summary>
/// 人员家乡
/// </summary>
public string PersonHome
{
get;
set;
}
}
2.2 数据库访问接口
/// <summary>
/// 人员数据库访问接口
/// </summary>
public interface IPerson
{
/// <summary>
/// 获取所有人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <returns>所有人员信息</returns>
List<MPerson> GetAllPersonInfo(OleDbConnection conn, OleDbTransaction tran); /// <summary>
/// 添加人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <param name="person">人员信息</param>
/// <returns>影响记录数</returns>
int AddPerson(OleDbConnection conn, OleDbTransaction tran, MPerson person); /// <summary>
/// 修改人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <param name="model">人员</param>
/// <returns>影响记录数</returns>
int UpdatePerson(OleDbConnection conn, OleDbTransaction tran, MPerson model); /// <summary>
/// 查询人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <returns>所有人员信息</returns>
List<MPerson> GetPersonInfo(OleDbConnection conn, OleDbTransaction tran, string personName); /// <summary>
/// 删除人员信息【不支持】
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <param name="model">人员</param>
/// <returns>影响记录数</returns>
//int DelPerson(OleDbConnection conn, OleDbTransaction tran, MPerson model);
}
2.3 数据库访问类
/// <summary>
/// 人员信息数据库访问
/// </summary>
public class DPerson : IPerson
{
#region IPerson 成员 /// <summary>
/// 获取所有人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <returns>所有人员信息</returns>
public List<MPerson> GetAllPersonInfo(OleDbConnection conn, OleDbTransaction tran)
{
List<MPerson> list = new List<MPerson>();
string sql = "select PersonName,PersonHome from [PersonInfo$]";
OleDbCommand cmd = new OleDbCommand(sql, conn, tran);
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MPerson model = new MPerson();
model.PersonName = reader["PersonName"] == DBNull.Value ? string.Empty : reader["PersonName"].ToString();
model.PersonHome = reader["PersonHome"] == DBNull.Value ? string.Empty : reader["PersonHome"].ToString();
list.Add(model);
}
} return list;
} /// <summary>
/// 查询所有人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <returns>所有人员信息</returns>
public List<MPerson> GetPersonInfo(OleDbConnection conn, OleDbTransaction tran, string personName)
{
List<MPerson> list = new List<MPerson>();
string sql = "SELECT PersonName,PersonHome from [PersonInfo$] WHERE PersonName = @PersonName";
OleDbCommand cmd = new OleDbCommand(sql, conn, tran);
OleDbParameter[] para =
{
new OleDbParameter("@PersonName", personName.Trim()),
};
cmd.Parameters.AddRange(para);
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MPerson model = new MPerson();
model.PersonName = reader["PersonName"] == DBNull.Value ? string.Empty : reader["PersonName"].ToString();
model.PersonHome = reader["PersonHome"] == DBNull.Value ? string.Empty : reader["PersonHome"].ToString();
list.Add(model);
}
} return list;
} /// <summary>
/// 添加人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <param name="person">人员信息</param>
/// <returns>影响记录数</returns>
public int AddPerson(OleDbConnection conn, OleDbTransaction tran, MPerson person)
{
string sql = @"INSERT INTO [PersonInfo$](PersonName, PersonHome)
VALUES(@Name, @Home)";
OleDbParameter[] para =
{
new OleDbParameter("@Name", person.PersonName),
new OleDbParameter("@Home", person.PersonHome)
}; OleDbCommand cmd = null;
cmd = new OleDbCommand(sql, conn, tran);
cmd.Parameters.AddRange(para);
return cmd.ExecuteNonQuery();
} /// <summary>
/// 修改人员信息
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <param name="model">人员</param>
/// <returns>影响记录数</returns>
public int UpdatePerson(OleDbConnection conn, OleDbTransaction tran, MPerson model)
{
string sql = string.Format(@"
UPDATE [PersonInfo$]
SET PersonHome=@PersonHome
WHERE PersonName='{0}'
", model.PersonName); OleDbParameter[] para =
{
new OleDbParameter("@PersonHome", model.PersonHome.Trim())
}; OleDbCommand cmd = null;
cmd = new OleDbCommand(sql, conn, tran);
cmd.Parameters.AddRange(para);
return cmd.ExecuteNonQuery();
} /// <summary>
/// 删除人员信息【不支持】
/// </summary>
/// <param name="conn">连接</param>
/// <param name="tran">事物</param>
/// <param name="model">人员</param>
/// <returns>影响记录数</returns>
// public int DelPerson(OleDbConnection conn, OleDbTransaction tran, MPerson model)
// {
// string sql = string.Format(@"
// DELETE FROM [PersonInfo$]
// WHERE PersonName='{0}'
// ", model.PersonName);
// OleDbCommand cmd = null;
// cmd = new OleDbCommand(sql, conn, tran);
// return cmd.ExecuteNonQuery();
// } #endregion
}
2.4 数据库连接工厂
/// <summary>
/// 数据库链接工厂
/// </summary>
public class ConnectionFactory
{
/// <summary>
/// 基础数据读库
/// </summary>
public static OleDbConnection BaseInfoDBRead
{
get { return GetConnection("BaseInfoDBRead"); }
} /// <summary>
/// 基础数据写库
/// </summary>
public static OleDbConnection BaseInfoDBWrite
{
get { return GetConnection("BaseInfoDBWrite"); }
} /// <summary>
/// 根据连接字符串获取连接
/// </summary>
/// <param name="connectionKey">连接键</param>
/// <returns>连接</returns>
public static OleDbConnection GetConnection(string connectionKey)
{
OleDbConnection connection = null;
string connectionString = ConfigurationManager.ConnectionStrings[connectionKey].ConnectionString;
connection = new OleDbConnection(connectionString);
return connection;
}
2.5 数据库访问工厂
/// <summary>
/// 数据库访问工厂
/// </summary>
public class DALFactory
{
/// <summary>
/// 获取人员信息数据访问层
/// </summary>
/// <returns>数据访问层</returns>
public static IPerson GetPersonDao()
{
return new DPerson();
}
}
2.6 业务层
2.6.1 添加事物类
/// <summary>
/// 添加人员事物
/// </summary>
public class BAddPersonsTrans : ExcelDbTransaction
{
/// <summary>
/// 人员信息
/// </summary>
private List<MPerson> personList = null; /// <summary>
/// 构造函数
/// </summary>
/// <param name="list">人员信息</param>
public BAddPersonsTrans(List<MPerson> list)
{
this.personList = list;
this.Connection = ConnectionFactory.BaseInfoDBWrite;
this.IsolationLevel = System.Data.IsolationLevel.ReadCommitted;
this.IsBeginTransation = true;
} /// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess
{
get;
set;
} /// <summary>
/// 添加人员信息
/// </summary>
protected override void ExecuteMethod()
{
IPerson personDao = DALFactory.GetPersonDao();
if (this.personList != null && this.personList.Count > )
{
foreach (MPerson item in this.personList)
{
personDao.AddPerson(this.Connection, this.Transation, item);
} this.IsSuccess = true;
}
}
}
2.6.2 业务类
/// <summary>
/// 人员信息业务层
/// </summary>
public class BPerson
{
/// <summary>
/// 获取所有人员信息
/// </summary>
/// <returns>所有人员信息</returns>
public List<MPerson> GetAllPersonInfo()
{
IPerson dao = DALFactory.GetPersonDao();
OleDbConnection conn = ConnectionFactory.BaseInfoDBRead;
try
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
} return dao.GetAllPersonInfo(conn, null);
}
finally
{
conn.Close();
conn.Dispose();
}
} /// <summary>
/// 查询所有人员信息
/// </summary>
/// <returns>所有人员信息</returns>
public List<MPerson> GetPersonInfo(string personName)
{
IPerson dao = DALFactory.GetPersonDao();
OleDbConnection conn = ConnectionFactory.BaseInfoDBRead;
try
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
} return dao.GetPersonInfo(conn, null, personName);
}
finally
{
conn.Close();
conn.Dispose();
}
} /// <summary>
/// 添加人员列表
/// </summary>
/// <param name="list">人员列表</param>
/// <returns>是否成功</returns>
public bool AddPersonList(List<MPerson> list)
{
BAddPersonsTrans tran = new BAddPersonsTrans(list);
tran.Execute();
return tran.IsSuccess;
} /// <summary>
/// 修改人员信息
/// </summary>
/// <param name="model">人员对象</param>
/// <returns>影响数据库记录数</returns>
public int UpdatePerson(MPerson model)
{
IPerson dao = DALFactory.GetPersonDao();
OleDbConnection conn = ConnectionFactory.BaseInfoDBWrite;
try
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
} return dao.UpdatePerson(conn, null, model);
}
finally
{
conn.Close();
conn.Dispose();
}
} /// <summary>
/// 删除人员信息【不支持】
/// </summary>
/// <param name="model">人员对象</param>
/// <returns>影响数据库记录数</returns>
//public int DelPerson(MPerson model)
//{
// IPerson dao = DALFactory.GetPersonDao();
// OleDbConnection conn = ConnectionFactory.BaseInfoDBWrite;
// try
// {
// if (conn.State == System.Data.ConnectionState.Closed)
// {
// conn.Open();
// } // return dao.DelPerson(conn, null, model);
// }
// finally
// {
// conn.Close();
// conn.Dispose();
// }
//}
}
2.7 测试
2.7.1 配置文件
App.config配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="BaseInfoDBRead" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BaseInfoDB.xls;Extended Properties='Excel 8.0;HDR=YES;IMEX=2'"/>
<add name="BaseInfoDBWrite" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BaseInfoDB.xls;Extended Properties='Excel 8.0;HDR=YES;IMEX=2'"/>
</connectionStrings>
</configuration>
2.7.2 测试代码
/// <summary>
/// 测试
/// </summary>
public class Test
{
/// <summary>
/// 测试获取人员信息
/// </summary>
public static void TestGetAllPerson()
{
try
{
BPerson bll = new BPerson();
List<MPerson> personList = bll.GetAllPersonInfo();
if (personList != null && personList.Count > )
{
foreach (MPerson item in personList)
{
Console.WriteLine(item.PersonName + "," + item.PersonHome);
}
}
}
catch (Exception ex)
{
string str = ex.ToString();
Console.WriteLine(str);
}
} /// <summary>
/// 测试添加人员列表
/// </summary>
public static void AddPersonList()
{
try
{
BPerson bll = new BPerson();
MPerson model = new MPerson();
model.PersonName = "艾玛";
model.PersonHome = "美国";
List<MPerson> list = new List<MPerson>();
list.Add(model);
model = new MPerson();
model.PersonName = "汤姆";
model.PersonHome = "美国";
list.Add(model);
bool result = bll.AddPersonList(list);
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
} /// <summary>
/// 测试修改
/// </summary>
public static void UpdatePerson()
{
try
{
MPerson model = new MPerson();
model.PersonName = "张三";
model.PersonHome = "上海";
BPerson bll = new BPerson();
int result = bll.UpdatePerson(model);
Console.WriteLine("结果:" + result);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
} /// <summary>
/// 测试删除
/// </summary>
//public static void DelPerson()
//{
// try
// {
// MPerson model = new MPerson();
// model.PersonName = "张三";
// BPerson bll = new BPerson();
// int result = bll.DelPerson(model);
// Console.WriteLine("结果:" + result);
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.ToString());
// }
//}
}
2.7.3 测试文件
BaseInfoDB.xls,注意将属性设置为始终复制
格式如下:
注意抬头部分一定是:PersonName,PersonHome
3 注意
(1)首先,上面虽然写到事物,但是事物确不能生效,也就是要不全部执行成功,要不全部执行失败,在网上找了很久,发现代码没什么大问题,但是不能实现效果,很是郁闷,还是把代码贴出来,万一以后就知道怎么回事了呢?
(2)修改的时候,不知道为什么不能在where语句中使用参数,只能使用拼sql,才执行成功,我在查询的时候试了一下,发现可以在where语句中使用参数,不知道这里为什么不行。
(3)、另外不能进行删除操作。报出来得错误信息是:该ISAM不支持在连接表中删除数据。网上查了一下确实是不支持删除。如果要删除就只能使用修改,在查询的使用进行处理。
(4)、数据库连接字符串,excel2007以上的数据库连接字符串如下,注意IMEX的值为3,之前在工作中遇到为1和2都出现"操作必须使用一个可更新的查询"的问题,改成3 就可以了。但是具体的资料无法考证。
Provider=Microsoft.Ace.OleDb.12.0;Data Source=excel路径和文件名;Extended Properties='Excel 12.0; HDR=Yes; IMEX=3
相关链接:http://www.cnblogs.com/richinger/archive/2008/09/28/1301170.html
C#使用ADO操作Excel的更多相关文章
- oledb 操作 excel
oledb excel http://wenku.baidu.com/search?word=oledb%20excel&ie=utf-8&lm=0&od=0 [Asp.net ...
- vfp 操作excel
VFP全面控制EXCEL 收藏 VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作.比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功 ...
- 同时使用ADO与Excel类库冲突的问题
客户需要一个Demo程序实现Access数据库表导出到Excel表格,并将表中存储的照片(OLE对象)以其中一个字段(编号)命名存储到本地.程序中引入了ADO操作Access数据库("C:\ ...
- 在 VS2008 下操作 Excel 的方法总结
这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘. 一.最常用的 OLE 自动化方式 这个方式应该说是功能最全的方 ...
- 一个操作EXCEL的C#类ExcelUtils
近期在公司里一直从事服务类的工作,涉及到非常多excel的处理.部分工作内容是每天反复的,仅仅是每天的数据不同而已.我遇到的一个问题是客户每天发送的几种数据有些excel中的字段顺序是一致的,有些是不 ...
- Delphi 如何操作Excel
摘自:http://wenjieshiyu.blog.163.com/blog/static/10739413201072033115869/ 个人收藏:Delphi 控制Excel(一) 使用动态 ...
- ADO对Excel对象进行连接时的 两种方法区别
在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连 ...
- C#操作Excel(创建、打开、读写、保存)几种方法的总结
在.NET开发中,不管是web程序还是桌面软件(尤其是涉及数据库操作的MIS系统等),常常需操作Excel,如导出数据到Excel,读取Excel中数据到程序中等.总结起来,其操作不外乎创建.打开.读 ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
随机推荐
- webpack 使用中的问题
用gulp-watch代替watch webpack打包体积分析器 集合
- 项目工程结构说明(Internal)
注意:想要彻底把Internal关键字搞清楚,就耐着性子把她读完.当然了这篇文章只是对其他文章的总结.也算是引用吧.主要还是为了把知识点搞清楚 进入主题之前先来了解一下,项目.解决方案.程序集.命名空 ...
- 导出/打印项目数据报表需要设置IE浏览器
导出/打印项目数据报表需要设置IE浏览器如下: 1.将本地服务器站点设置为可信站点, 2.通过点击网页上的工具→Internet选项→安全→自定义级别→把关于activeX控件和插件的选项都设置成启用 ...
- Qt5学习笔记——QRadioButton与QbuttonGroup
[我是小标题:使用QToolButton实现radio button功能.] QRadioButton是什么? 下图是Windows系统中典型的radio button显示效果. QRadio ...
- Spring-Kafka 2.0.0发送API翻译
Kafka Template–2.2.0 api KafkaTemplate KafkaTemplate这个类包装了个生产者,来提供方便的发送数据到kafka的topic里面. 同步和异步的方法都有, ...
- Android 进阶11:进程通信之 ContentProvider 内容提供者
学习启舰大神,每篇文章写一句励志的话,与大家共勉. When you are content to be simply yourself and don't compare or compete, e ...
- Unity3d command line arguments
Options Many of these relate to Unity3d command line arguments Batch Mode - should be left enabled u ...
- .Net WebApi 添加Swagger
前言 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远. 前端和后端的唯一联系,变成了API接口:API文档 ...
- 深入理解java虚拟机-第八章
第8章 虚拟机字节码执行引擎 8.2 运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构. 每一个栈帧包括了局部变量表.操作数栈.动态连接.方法返回地址和一 ...
- 使用Audition录制自己的歌曲
Audition专为在照相室.广播设备和后期制作设备方面工作的音频和视频专业人员设计,可提供先进的音频混合.编辑.控制和效果处理功能.最多混合 128 个声道,可编辑单个音频文件,创建回路并可使用 4 ...