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可以作为简单的数据库使用,但是其和数据库的根本区别也要知道。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。