Excel≈数据库
本节标题的意思就是我们可以用excel作为数据库使用。为什么是约等于呢?是因为在使用的过程中不能进行删除操作。删除时就会提示 "该 ISAM 不支持在链接表中删除数据"。其他的查询和更新我们都可以进行操作。
既然是excel,那么和数据库也是有区别的:
1、 一次删除一整条记录,否则将出现以下错误信息:
Deleting data in a linked table is not supported by this ISAM.
只能通过分别清空各个字段的内容来删除一条记录。
2、 删除包含 Excel 公式的单元格中的值,否则将出现以下错误信息:
Operation is not allowed in this context.
3、 虽然电子表格中已被删除的数据原来所在的行现在是空行,但无法将其删除,而且记录集将继续显示对应于这些空行的空记录。针对这个问题,通常简单的做法就是清空字段的值,类似这样的写法:UPDATE sheet1$ SET NAME = NULL, DeptName= NULL WHERE DeptId = 1;当然,你要知道的是,这一行并没有真正删除掉,所以通常在select的时候要进行一定的筛选,例如:SELECT * FROM sheet1$ WHERE DeptId IS NOT NULL;
连接字符串
使用Excel作为数据库时要注意连接字符串的设置,具体设置如下:
private static readonly string Conn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "data source='Security.xls';Extended Properties='Excel 8.0; HDR=YES; IMEX=2'";
字符串的解释:
provider:不用解释了吧,驱动提供方式。
data source:数据源,这里就是xls文件的路径
HDR ( HeaDer Row ):
若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称
若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称
IMEX ( IMport EXport mode ):
IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
一些其他字符串:
string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
特别注意:必须注意连接字符串的正确写入,否则会报“不能连接数据库”的错误。
Oledb版本的一个sqlhelper
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
public class SqlHelper
{
/// <summary>
/// 从配置文件中读取连接数据库的字符串
/// </summary>
private static readonly string Conn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "data source='Security.xls';Extended Properties='Excel 8.0; HDR=YES; IMEX=2'";
/// <summary>
/// 定义连接数据库的变量
/// </summary>
OleDbConnection SqlConn;
/// <summary>
/// 定义操作数据库所需要的变量
/// </summary>
OleDbCommand SqlComm;
/// <summary>
/// 定义选择数据库中内容的对象
/// </summary>
OleDbDataReader DataReader;
/// <summary>
/// 定义数据表对象
/// </summary>
DataTable Dt;
public SqlHelper()
{
}
~SqlHelper()
{
}
public virtual void Dispose()
{
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
SqlConn = new OleDbConnection();
SqlConn.ConnectionString = Conn;
SqlConn.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
SqlConn.Close();
}
/// <summary>
/// 执行不带参数的增加、删除、或修改
/// </summary>
/// <param name="cmdtext">sql语句字符串</param>
/// <param name="cmdtype">要执行的命令类型</param>
public bool ExecAddUpdateDelete(string Cmdtext, CommandType Cmdtype)
{
Open();
//对SqlCommand对象进行实例化
SqlComm = new OleDbCommand(Cmdtext, SqlConn);
SqlComm.CommandType = Cmdtype;
//执行命令
SqlComm.ExecuteNonQuery();
Close();
return true;
}
/// <summary>
/// 执行带参数的增加、删除、修改
/// </summary>
/// <param name="cmdtext">sql语句字符串</param>
/// <param name="cmdtype">要执行的命令类型</param>
/// <param name="Paras">所有参数</param>
public bool ExecAddUpdateDelete(string Cmdtext, CommandType Cmdtype, OleDbParameter[] Paras)
{
Open();
//对SqlCommand对象进行初始化
SqlComm = new OleDbCommand(Cmdtext, SqlConn);
SqlComm.CommandType = Cmdtype;
//对参数赋值
SqlComm.Parameters.AddRange(Paras);
//执行命令
SqlComm.ExecuteNonQuery();
Close();
return true;
}
/// <summary>
/// 执行带参数的查询,返回数据表
/// </summary>
/// <param name="cmdtext">存储过程的名称</param>
/// <param name="cmdtype">要执行的命令类型</param>
/// <param name="Paras">所有参数</param>
public DataTable ExecSelect(string Cmdtext, CommandType Cmdtype, OleDbParameter[] Paras)
{
Open();
//对SqlCommand对象进行实例化
SqlComm = new OleDbCommand(Cmdtext, SqlConn);
SqlComm.CommandType = Cmdtype;
//给参数赋值
SqlComm.Parameters.AddRange(Paras);
//返回DataReader对象
DataReader = SqlComm.ExecuteReader();
Dt = new DataTable();
//返回DataTable对象
Dt.Load(DataReader);
//返回数据表
Close();
return Dt;
}
/// <summary>
/// 执行不带参数的选择,返回数据表
/// </summary>
/// <param name="cmdtext">存储过程的名称</param>
/// <param name="cmdtype">要执行的命令类型</param>
public DataTable ExecSelect(string Cmdtext, CommandType Cmdtype)
{
Open();
//对SqlCommand对象进行实例化
SqlComm = new OleDbCommand(Cmdtext, SqlConn);
SqlComm.CommandType = Cmdtype;
//返回DataReader对象
DataReader = SqlComm.ExecuteReader();
//返回DataTable对象
Dt = new DataTable();
Dt.Load(DataReader);
//返回数据表
Close();
return Dt;
}
}
总结
通过本文我们要知道Excel可以作为简单的数据库使用,但是其和数据库的根本区别也要知道。