1、数据库要给访问权限,在我的电脑里,右击access数据库,点击“属性”菜单,选“安全”选项卡,选择Users组,赋给完全控制的权限
如果没有安全选项卡,点击菜单“工具”->“文件夹选项”,进入“查看”选项卡,把“使用简单文件共享”前的勾去掉
2、连接数据库的时候,如果想要做到可以随时更改数据库的名称,也不用重新编译网站,就把数据库的路径记录在web.config文件里:
<connectionStrings>
<add name=”aceConnectionString” connectionString=”目录\\\\数据库名称.mdb” providerName=”System.Data.OleDb” />
</connectionStrings>
使用这两个方法取值:
public static string connectString = “Provider=Microsoft.Jet.OleDb.4.0;Data Source=” + HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
public static string GetDB()
{
return HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
}
在每个页面,如果用到AccessDataSource控件,这个控件是不会自己读取这个值的,可以在Page_Load页面里,使用AdsAd.DataFile = NnllClass.GetDB();给他赋值
protected void Page_Load(object sender, EventArgs e)
{
AdsAd.DataFile = NnllClass.GetDB();
}
3、如果使用AccessDataSource添加、删除、修改记录,要注意参数的问题,有一些网站,对一些参数报错的信息,给出的答案说access数据库应该使用拼接的sql语句,不可以使用参数,这种说法是不对的,access数据库也可以使用参数传递的方式增删改查数据库的
就是,因为vs.net 2005不可以像使用ms sql时一样子,自动会检索出参数,所以全部参数要自己手动添加,在添加参数的时候,要很小心,不要少了,也不要多了,也不要搞乱了顺序
发现AccessDataSource控件,好像是根据绑定字段的顺序来对应传入的参数的,也就是说,如果你在FormView里,是这样子绑定的:
<asp:TextBox ID=”myField1TextBox” runat=”server” Text=’<%# Bind(“myField1″) %>’ MaxLength=”20″></asp:TextBox>
<asp:TextBox ID=”myField2TextBox” runat=”server” Text=’<%# Bind(“myField2″) %>’ MaxLength=”20″></asp:TextBox>
定义参数的时候,就应该这样子定义:
<InsertParameters>
<asp:Parameter Name=”myField1″ Type=”String” Size=”20″ ConvertEmptyStringToNull=”False” />
<asp:Parameter Name=”myField2″ Type=”String” Size=”20″ ConvertEmptyStringToNull=”False” />
</InsertParameters>
次序不要搞乱了,搞乱了数据格式不同时,会报错,具体的出错信息我忘记了
定义参数的时候,还有一个要注意的问题就是,参数名不要写错,参数不要写漏
使用sql数据库时,参数名不对,或者参数个数不对,都会得到很明显的出错信息,就是,access数据库,在这种时候,是不报错的,如果参数名写错了,只会说有n个参数没有值,如果是写漏了参数,他有时候会直接替你更新数据库,而更新的时候,是以绑定的顺序来对应参数的值的,这时候,如果后面的参数值,大于前面的参数对应的字段大小,就会得到“字段太小”的出错信息
<InsertParameters>
<asp:Parameter Name=”myField1″ Type=”String” Size=”20″ ConvertEmptyStringToNull=”False” />
<asp:Parameter Name=”myField2″ Type=”String” Size=”20″ ConvertEmptyStringToNull=”False” />
</InsertParameters>
如果少了一个
<asp:Parameter Name=”myField3″ Type=”String” Size=”200″ ConvertEmptyStringToNull=”False” />
在更新的时候,会把myField3的值,写进myField2里,如果myField3的值的长度大于20,就会报“字段太小”了
3、如果不习惯AccessDataSource控件,那就自己绑定数据吧,给出一些方法:
#region 返回数据库地址
public static string GetDB()
{
return HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["aceConnectionString"].ConnectionString);
}
#endregion
#region 打开数据库:SqlConnection OpenConnect()
public OleDbConnection OpenConnect(Page aPage,bool setMsg)
{
try
{
OleDbConnection dbConnect = new OleDbConnection(connectString);
if (!dbConnect.State.Equals(ConnectionState.Open))
{
dbConnect.Open();
}
return dbConnect;
}
catch (OleDbException ex)
{
if (setMsg)
{
SetMsgJS(aPage.Master, “连接数据库失败:” + ex.Message.Replace(“\\n”, “”).Replace(“\\r”, “”));
}
return null;
}
}
#endregion
#region 关闭数据库:void CloseConnect(SqlConnection dbConnect)
public void CloseConnect(OleDbConnection dbConnect)
{
if (dbConnect.State.Equals(ConnectionState.Open))
{
dbConnect.Close();
}
}
#endregion
#region 读取数据,返回DataSet
public DataSet GetDataSet(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, out string msg, bool setMsg)
{
msg = “”;
//创建并设置SqlCommand
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//创建SqlDataAdapter并获取数据
DataSet ds = new DataSet();
try
{
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);
dataAdapter.Fill(ds);
}
catch (InvalidOperationException eo)
{
msg = “读取数据失败:” + eo.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
catch (OleDbException ex)
{
msg = “读取数据失败:” + ex.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
//返回数据
return ds;
}
#endregion
#region 读取数据,返回SqlDataReader
public OleDbDataReader GetDataReader(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, OleDbParameter[] p, out string msg, bool setMsg)
{
msg = “”;
//设置命令
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//设置参数
if (p != null)
{
foreach (OleDbParameter pi in p)
{
dbCommand.Parameters.Add(pi);
}
}
//读取第一个结果集
OleDbDataReader dbReader = null;
try
{
dbReader = dbCommand.ExecuteReader();
}
catch (InvalidOperationException eo)
{
msg = “读取数据失败:” + eo.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
catch (OleDbException ex)
{
msg = “读取数据失败:” + ex.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
}
return dbReader;
}
#endregion
#region 执行sql命令或存储过程
public int execCommand(Page aPage, OleDbConnection dbConnection, CommandType commandType, string commandText, OleDbParameter[] p, out string msg, bool setMsg)
{
bool needCloseDB = false;
int row = 0;
msg = “”;
//创建并设置SqlConnection
if (dbConnection == null)
{
needCloseDB = true;
dbConnection = OpenConnect(aPage, setMsg);
if (dbConnection == null) return -1;
}
//创建并设置SqlCommand
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
//设置参数
if (p != null)
{
foreach (OleDbParameter pi in p)
{
dbCommand.Parameters.Add(pi);
}
}
//执行命令
try
{
row = dbCommand.ExecuteNonQuery();
}
catch (InvalidOperationException eo)
{
msg = eo.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
row = -1;
}
catch (OleDbException ex)
{
//执行过程出错
msg = ex.Message.Replace(“\\n”, “”).Replace(“\\r”, “”) + “\\\\n”;
if (setMsg)
{
SetMsgJS(aPage.Master, msg);
}
row = -1;
}
//关闭数据库
if (needCloseDB)
{
CloseConnect(dbConnection);
}
return row;
}
#endregion
上面的方法都用到一个SetMsgJS方法,这个方法是用来给母版页设置信息的
public static void SetMsgJS(MasterPage masterPage, string msg)
{
Literal lt = (Literal)masterPage.FindControl(“LiteralMsg”);
if (lt != null)
{
lt.Text += msg;
}
}
在母版页里定义是这样子的:
<script type=”text/javascript”>
var msg = “”;
msg = “<asp:Literal ID=”LiteralMsg” runat=”server”></asp:Literal>”;
if(msg != “”)
{
alert(msg);
}
</script>