最近帮朋友做了个小项目。遇到了一些问题,记录如下
1.如何使用Access
两年前用过一点Access,感觉它小问题很多,就没有再用。这次的程序是放在千兆宽网的虚拟主机上,这个虚拟主机不支持Sqlite,读取数据的时候是好的,只要往数据库里边写东西,就会报错,Some Disk I/O Error Occured。很神奇,换了一个虚拟主机试试,没有问题。说明不是我程序的问题。后来只能换成Access。用ADO.NET读取数据库其实都差不多,主要就是一个连接字串的问题,还有就是一些数据库差异要注意。

1.1 数据库连接串

<add name="ConnectionString" connectionString="data source=|DataDirectory|we.mdb;Provider=Microsoft.Jet.OLEDB.4.0" /> 连接串很简单,只需要指定DataSource就可以,这里的|DataDirectory|是指的App_Data目录。Asp.net的这种方式可以使我们很方便的用相对路径来指定数据库文件的位置。这里的Provider采用Oledb驱动。

1.2 使用

在程序中使用是很简单的,只是把Connection,Command之前的前缀换掉就可以了。举一个例子:
 
public DataTable GetAll(string num,int min,int startRecord, int pageSize)
{
string sql = string.Format("select Num ,minPrice ,isUsed from PhoneNumber where Num like '{0}%' and isUsed=0", num);
if (min != 0)
{
sql += "and [email protected]";
}
using (OleDbConnection conn = new OleDbConnection(SqlHelper.ConnStr))
{
conn.Open();
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
if (min != 0)
cmd.Parameters.AddWithValue("p1", min);
OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
DataTable table = new DataTable();
adp.Fill(startRecord,pageSize,table);
return table;
}
}

当然还要添加using:using System.Data.OleDb;
using System.Data;ADO.NET的处理方式都是很类似的,事实上,ADO.NET有一套以Db为前缀的Connection,Command等类,这些具体的类都是继承自DbConnection,所以看起来都是一样的。

1.3 差异

上面提到,Access是很诡异的。以下列举一些我遇到的:

1.3.1 user 是关键字,如果有表名或者列名是user而没有加中括号,是会出错的。当然,一致地在所有的表名和列名外加中括号是一个良好的编程习惯。

1.3.2 直接插DateTime型的数据是会报错的,即使数据库里的字段类型确实是Date,插入的方式是把C#的DateTime型ToString()过后再插入。

1.3.3 没有bool型,或者bit型,叫yesno……

1.3.4一个命令里边不支持多条sql。这个限制也很讨厌,每次执行一个command的时候里面只能包含一条sql,非常不方便,即使是小巧如Sqlite的数据库也没有这个限制。

1.3.5 参数顺序的问题. 声明的参数顺序必须要和你往command里边添加参数的声明一致.否则很有可能什么错也不报,就是不影响结果(update的时候,其他时候没试过). Access真是极品数据库啊!!例如
 
string sql = "update [user] set [email protected], [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected] "
+ "where [email protected]";
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("p1", entity.WorkField);
cmd.Parameters.AddWithValue("p3", entity.Company);
cmd.Parameters.AddWithValue("p4", entity.IC);
cmd.Parameters.AddWithValue("p5", entity.Contact);
cmd.Parameters.AddWithValue("p6", entity.Phone);
cmd.Parameters.AddWithValue("p7", entity.Mobile);
cmd.Parameters.AddWithValue("p8","");
cmd.Parameters.AddWithValue("p9", string.IsNullOrEmpty(entity.Email)?" ":entity.Email);
cmd.Parameters.AddWithValue("p10", string.IsNullOrEmpty(entity.Introduction)?" ":entity.Introduction);
cmd.Parameters.AddWithValue("p2", entity.UserName);
int i= cmd.ExecuteNonQuery();这样是可以的,但是把

cmd.Parameters.AddWithValue("p2", entity.UserName);

提到前面去,就不行了,更新不了. 幸好在csdn上搜到有人也问这个问题,不然都不知道怎么搞。

2.z-index的问题。
包含在其他HTML元素内部的HTML元素的z-index只是相对于位于同一层次的元素的z-index,对其父元素之外的元素的z-index没有影响,也就是说如果父元素的z-index很小,比如是0,内部元素的z-index很高,1000.父元素相邻的元素的z-index是2,如果内部元素溢出去了,和相邻元素重合,那么被覆盖的还是内部元素。
最新资讯
雄安新区能源互联网标准化试点工作启动

雄安新区能源互联网标

近日,雄安新区能源互联网标准化试点工作正式启动。
快递员私拆女客户包裹、信息骚扰 顺丰:已启动调查

快递员私拆女客户包裹

有微博网友发文称顺丰快递员私自打开客户包裹、发信息
不靠病毒潜入体内 “上帝的手术刀”更安全

不靠病毒潜入体内 “

在把CRISPR-Cas9送到细胞中时,需要借助载体的帮助。其
直击|完美世界教育推人才计划 共建中俄艺术学院

直击|完美世界教育推

完美世界控股集团旗下完美世界教育与俄罗斯Atlant公司
英伟达发声明:特斯拉对两者自动驾驶芯片比较不准确

英伟达发声明:特斯拉对

据国外媒体报道,英伟达发布声明称,特斯拉对两者自动驾驶
英国约百分之六人口拥有特殊“防胖基因”

英国约百分之六人口拥

果然,有些人就是“干吃不胖”的体质,可以在别人羡慕嫉妒
最新文章
八步解决ACCESS自动编号问题(将SQL SERVER 2000数据库,转换为ACCESS数据库)

八步解决ACCESS自动编

这篇文章主要介绍了将SQLSERVER2000数据库转换为ACCES
Access转Sql Server问题 实例说明

Access转Sql Server问

对于网上的一些access转sqlserver的解决方法,比较多,其
Access字符串处理函数整理

Access字符串处理函数

在access数据库中用的到的一些字符串处理函数代码,需要
access中显示MSysObjects系统表的设置方法

access中显示MSysObje

这篇文章主要介绍了access中显示MSysObjects系统表的
Access使用查询--1.1. 用选择查询建立计算字段

Access使用查询--1.1.

1.用选择查询建立计算字段建一个选择查询,添加“车队运
用 INNER JOIN语法联接多个表建记录集

用 INNER JOIN语法联

用INNERJOIN语法联接多个表建记录集多表联接建立记录