针对mdb数据库不同字符串连接的应用和初探(含Repeater小学习)
近日研究整合多种功能的系统,遇到一些问题,与以前一些知识结合,感觉又有了新的理解,并且遇到不理解的疑问,多查网络就可以解决了。
针对mdb中,
1、一般config文件中,目前发现的最好些法是
<add key="ConnectionString" value="provider=Microsoft.Jet.OLEDB.4.0; Data Source="/>
<add key="Path" value="~/App_Data/ok.mdb"/> 形式
然后,在类文件中定义
public static readonly string conn = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString() + System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["Path"]) + ";";
这是我发现最好的写法,因为涉及下面的一些常应用。
2、类文件中写
public static OleDbConnection Acc_Conn() //数据库连接
{
OleDbConnection acc_conn=new OleDbConnection (conn);
return acce_conn;
}
public static DataSet accessGetDataSet(string sql) //定义数据记录集
{
OleDbConnection Conn = Acc_Conn();
OleDbDataAdapter data = new OleDbDataAdapter (sql, Conn);//已经选择了数据
DataSet DS = new DataSet();//定义好数据集
data.Fill(DS);;//数据填充到数据集里
return DS;
}
3、应用
如果要获得数据库的一个表table1的一个字段,很简单
string sql="select * form table1 where id="+id;
string ziduan=class_name.accessGetDataSet(string sql).table[0].rows[0].["需要字段"].toString();
实在好用的,
4、我之所以写,是因为这时候,有一种情况,就是当各个web页面分布在不同层的目录,这时候,有以下的做法
先在类中写方法
public string accessdb3()
{
string path = "provider=microsoft.jet.oledb.4.0;data source=" + System.Web.HttpContext.Current.Server.MapPath(@"..\..\App_Data\ok.mdb");//这里表示这页面离根目录有两层
return path;
}
当应用的时候,就写
class_name d1=new class_name();//class_name是类,这里要实例化才可以用的
string path = d1.accessdb3();
conn = new OleDbConnection(path);
conn.Open();
OleDbCommand cmd = new OleDbCommand(sql, conn);
OleDbDataReader odr = cmd.ExecuteReader();
while (odr.Read())//读数据
{
do anything;
}
odr.close();
conn.close();
如果我们需要高度统一,可读性强,又与以前的一些好的风格一致,我做了如下修改,大侠请指正。
可以在类文件中写
public static DataSet accessGetDataSet3(string sql) //定义数据记录集
{
dbcenter db3 = new dbcenter();//这里已经实例化了
string db3_path = db3.accessdb3();
OleDbConnection Conn = new OleDbConnection(db3_path);
OleDbDataAdapter data = new OleDbDataAdapter(sql, Conn);//已经选择了数据
DataSet DS = new DataSet();//定义好数据集
data.Fill(DS); ;//数据填充到数据集里
return DS;
}
这样写,又可以应用到第3点的方法了。
string edit_type ;
edit_type = class_name.accessGetDataSet3("select * from ok where ok_id="+id).Tables[0].Rows[0]["edit_type"].ToString();//主要是取数据方便
就是简单修改了下,只修改连接字符串的一些定义而已,如果写不好,还可能引发有
“从索引 0 处开始,初始化字符串的格式不符合规范”等错误,不过,慢慢地,能读懂,也就能想办法解决的了
再举一个例子:我们平时可能用到组件Repeater来显示数据.而且要分页.我们看看两种写法的比较
第一种,
PagedDataSource pds = new PagedDataSource();
pds.DataSource = class_name.accessGetDataSet3("select * from edit_ok order by edit_id desc").Tables[0].DefaultView;
pds.CurrentPageIndex = Convert.ToInt32(Label2.Text) - 1;
pds.AllowPaging = true;
pds.PageSize = 10;//设置每个页面显示的数量
Repeater1.DataSource = pds;
Label1.Text = pds.PageCount.ToString();//获取所有页面
Label2.Text = (pds.CurrentPageIndex + 1).ToString(); //获取当前页面
this.lbtnpritPage.Enabled = true;
this.lbtnFirstPage.Enabled = true;
this.lbtnNextPage.Enabled = true;
this.lbtnLastPage.Enabled = true;
if (pds.CurrentPageIndex < 1)
{
this.lbtnpritPage.Enabled = false;
this.lbtnFirstPage.Enabled = false;
}
if (pds.CurrentPageIndex == pds.PageCount - 1)
{
this.lbtnNextPage.Enabled = false;
this.lbtnLastPage.Enabled = false;
}
Repeater1.DataBind();
第二中写法
OleDbConnection conn;
PagedDataSource pds = new PagedDataSource();
class_name d1 = new class_name();
string path=d1.accessdb3();
conn = new OleDbConnection(path);
string sql = "select * from edit order_ok by edit_id desc";
OleDbDataAdapter oda = new OleDbDataAdapter(sql, conn);
DataSet ds = new DataSet();
oda.Fill(ds, "title");
pds.DataSource = ds.Tables[0].DefaultView;
pds.CurrentPageIndex = Convert.ToInt32(Label2.Text) - 1;
pds.AllowPaging = true;
pds.PageSize = 10;//设置每个页面显示的数量
Repeater1.DataSource = pds;
Label1.Text = pds.PageCount.ToString();//获取所有页面
Label2.Text = (pds.CurrentPageIndex + 1).ToString(); //获取当前页面
this.lbtnpritPage.Enabled = true;
this.lbtnFirstPage.Enabled = true;
this.lbtnNextPage.Enabled = true;
this.lbtnLastPage.Enabled = true;
if (pds.CurrentPageIndex < 1)
{
this.lbtnpritPage.Enabled = false;
this.lbtnFirstPage.Enabled = false;
}
if (pds.CurrentPageIndex == pds.PageCount - 1)
{
this.lbtnNextPage.Enabled = false;
this.lbtnLastPage.Enabled = false;
}
Repeater1.DataBind();
这样,红色一句等于蓝色的几行了。应该是高度的浓缩.但研究下去也是有一定区别的。第一种是用类内的方法,而另外一种是重新定义实例化才应用。不过,第二种来说是比较传统的,不够高度集中和浓缩.
这里也当做Repeater的一个简单学习吧.嘿嘿!
记得了,这里Repeater是在html源代码中写的代码,没有gridview的那种编辑向导的,但有数据源向导,也可以写代码连接数据库,连接后,就可以这里写(这里用表格显示三列)
<table width="95%" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#f1f1f1">
<td width="30%">文章标题</td>
<td width="17%">加入时间</td>
<td width="8%">操 作</td>
</tr>
<ItemTemplate>
<tr bgcolor="#FFFFFF" align="center" >
<td align="left"><img src="../images/admin_top_open.gif" height="16"/><a href='admin_edit_edit.aspx?id=<%# Eval("edit_id") %>'><%# Eval("edit_title") %></a>
</td>
<td align="center"><%# Eval("edit_time") %>
</td>
<td align="center"><a href='admin_edit_edit.aspx?id=<%# Eval("edit_id") %>'>修改</a><a href='admin_edit_delete.aspx?id=<%# Eval("edit_id") %>'> 删除</a>
</td>
</tr>
</ItemTemplate>
</table>
或者简单的不用表格的写法,只显示一个字段和对应的链接
<ItemTemplate>
<li><a href=
'<%# Eval("edit_title_link)%>'
target=
"_blank"
>
<%# Eval(
"edit_title"
)%></a></li>
</ItemTemplate>
也是可以的。
有时候
优化
直接使用DataItem可减少Eval函数的执行步骤,优化页面解析时间:
<%# ((DataRowView)Container.DataItem)["edit_title"]%>替换<%# Eval("edit_title")%>
研究下去,估计还有更多发现的...