下面这段代码为了查询相邻的三条记录,我用了三次连接,这样很浪费,不知道怎么样才能优化一下?public partial class Default2 : System.Web.UI.Page
{
    int n_id;
    protected void Page_Load(object sender, EventArgs e)
    {
        n_id = Int32.Parse(Request.QueryString["id"]);
        try
        {
            OleDbConnection acccon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/1.mdb").ToString());
            string selectCmd = "select * from [news] where [NID]=" + n_id;
            string selectForntNews = "select top 1 from [news] where [NID]<" + n_id;
            string selectNextNews = "select top 1 from [news] where [NID]>" + n_id;
            OleDbCommand acccom = new OleDbCommand(selectCmd, acccon);
            acccon.Open();
            OleDbDataReader race = acccom.ExecuteReader();
            while (race.Read())
            {
                Label1.Text = race["N_title"].ToString();
                Label2.Text = race["N_content"].ToString();
                Label8.Text = race["N_time"].ToString();
                Label9.Text = race["N_come"].ToString();
            }
            race.Close();
            acccon.Close();
            showForntTitle();
            showNextTitle();
        }
        catch (Exception ex)
        {
            //Response.Write(ex);
        }
    }
    private void showForntTitle()
    {
        OleDbConnection accon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/1.mdb").ToString());
        string selectForntNews = "select top 1 * from [news] where [NID]>" + n_id;
        OleDbCommand com = new OleDbCommand(selectForntNews, accon);
        accon.Open();
        OleDbDataReader race = com.ExecuteReader();
        if (race.Read())
        {
            HyperLink3.Visible = true;
            HyperLink3.NavigateUrl = "~/showNews.aspx?id=" + race["NID"].ToString();
            HyperLink3.Text += race["N_title"].ToString();
        }
        else
        {
            HyperLink3.Visible = false;
        }
        race.Close();
        accon.Close();
    }
    private void showNextTitle()
    {
        OleDbConnection accon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/1.mdb").ToString());
        string selectForntNews = "select top 1 * from [news] where [NID]<" + n_id + " order by [NID] desc";
        OleDbCommand com = new OleDbCommand(selectForntNews, accon);
        accon.Open();
        OleDbDataReader race = com.ExecuteReader();
        if (race.Read())
        {
            HyperLink4.Visible = true;
            HyperLink4.NavigateUrl = "~/showNews.aspx?id=" + race["NID"].ToString();
            HyperLink4.Text += race["N_title"].ToString();
        }
        else
        {
            HyperLink4.Visible = false;
        }
        race.Close();
        accon.Close();
    }

解决方案 »

  1.   

    把三条语句用union连起来就只用执行一次啦~
      

  2.   

    如果用UNION的话,那我要如何判断这三个对应的值呢???
    select * from [news] where [NID]=28 union select top 1 * from [news] where [NID]>28 union select top 1 * from [news] where [NID]<28 order by [NID] desc
      

  3.   

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int n_id = Int32.Parse(Request.QueryString["id"]);
                HyperLink3.Visible = false;
                HyperLink4.Visible = false;
                try
                {
                    OleDbConnection acccon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
                                                                            + Server.MapPath("~/1.mdb").ToString());
                    string selectCmd = "select * from [news] where [NID]='" + n_id 
                                     + "' union " 
                                     + "select top 1 * from [news] where [NID]<'" + n_id
                                     + "' union "
                                     + "select top 1 * from [news] where [NID]>" + n_id + "'";
                    OleDbCommand acccom = new OleDbCommand(selectCmd, acccon);
                    acccon.Open();
                    OleDbDataReader race = acccom.ExecuteReader();
                    while (race.Read())
                    {
                        if (int.Parse(race["NID"].ToString()) == n_id)
                        {
                            Label1.Text = race["N_title"].ToString();
                            Label2.Text = race["N_content"].ToString();
                            Label8.Text = race["N_time"].ToString();
                            Label9.Text = race["N_come"].ToString();
                        }
                        else if (int.Parse(race["NID"].ToString()) < n_id)
                        {
                            HyperLink3.Visible = true;
                            HyperLink3.NavigateUrl = "~/showNews.aspx?id=" + race["NID"].ToString();
                            HyperLink3.Text += race["N_title"].ToString();
                        }
                        else if (int.Parse(race["NID"].ToString()) < n_id)
                        {
                            HyperLink4.Visible = true;
                            HyperLink4.NavigateUrl = "~/showNews.aspx?id=" + race["NID"].ToString();
                            HyperLink4.Text += race["N_title"].ToString();
                        }
                    }
                    race.Close();
                    acccon.Close();
                }
                catch (Exception ex)
                {
                    //Response.Write(ex);
                }
            }
        }
      

  4.   

    要判断race["NID"]的值,来确定相应的操作是使用了相应的数据,保证不会“对错位置”~