追求新生活 名字2008

活着的意义

针对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")%>

研究下去,估计还有更多发现的...

 

posted on 2012-01-13 16:57  pyman  阅读(551)  评论(0编辑  收藏  举报

导航