2013-01-17 131 views
0

我在asp.net網頁上有一個按鈕,我已經編碼讀取頁面加載的訪問數據庫中的布爾列的值,以及按鈕是否根據列的值是真的還是假的。更新數據庫中的布爾值

基本上這個按鈕是一個產品的顯示/隱藏按鈕(點擊它隱藏產品,或者如果已經隱藏,點擊它使其可見)。

我收到一些奇怪的行爲,當產品被隱藏,點擊使產品可見的作品(更新數據庫),但是,隱藏它並沒有,我不知道爲什麼一個人會工作,但其他不會。

代碼如下:

if (!IsPostBack) 

    try 
    { 
     s = WebConfigurationManager.ConnectionStrings["LNDatabase"].ConnectionString; 
     conn = new OleDbConnection(s); 
     cmd = new OleDbCommand("SELECT * FROM products WHERE products.prod_id = @test", conn); 
     OleDbParameter test = new OleDbParameter("@test", OleDbType.Integer); 
     test.Value = Request.QueryString["prod_id"]; 
     cmd.Parameters.Add(test); 

     conn.Open(); 
     dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
     dr.Read(); 
     title.Text = dr["shortdesc"].ToString(); 
     description.Text = dr["longdesc"].ToString(); 
     price.Text = dr["price"].ToString(); 

     productcat = dr["cat"].ToString(); 
     product_live = dr["live"].ToString(); 


    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message.ToString()); 
    } 
    finally 
    { 
     dr.Close(); 
     conn.Close(); 
    } 

protected void Page_Load(object sender, EventArgs e) 

if (!IsPostBack) 
    { 
     bool prod_live_bool = Convert.ToBoolean(product_live); 

     if (prod_live_bool == true) 
     { 
      live_label.Text = "This product is visible to customers"; 
      livelabelbutton.Text = "Hide this product"; 
      livelabelbutton.Click += new EventHandler(this.hideproduct_click); 

     } 
     else 
     { 
      live_label.Text = "This product is not visible to customers"; 
      livelabelbutton.Text = "Make this product visible"; 
      livelabelbutton.Click += new EventHandler(this.showproduct_click); 
     } 

    } 

protected void hideproduct_click(object sender, EventArgs e) 
{ 
    string prodid = Request.QueryString["prod_id"]; 
    s = WebConfigurationManager.ConnectionStrings["LNDatabase"].ConnectionString; 
    string str = "UPDATE products SET live = @hide WHERE [email protected]"; 

    using (OleDbConnection conn = new OleDbConnection(s)) 
    { 
     using (OleDbCommand cmd = new OleDbCommand(str, conn)) 
     { 
      OleDbCommand mycommand = new OleDbCommand(); 

      OleDbParameter hideparam = new OleDbParameter("@hide", OleDbType.Boolean); 
      hideparam.Value = false; 
      cmd.Parameters.Add(hideparam); 
      OleDbParameter product = new OleDbParameter("@product", OleDbType.VarChar); 
      product.Value = prodid; 
      cmd.Parameters.Add(product); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    Response.Redirect(Request.RawUrl); 
} 

protected void showproduct_click(object sender, EventArgs e) 
{ 
    string prodid = Request.QueryString["prod_id"]; 

    s = WebConfigurationManager.ConnectionStrings["LNDatabase"].ConnectionString; 
    string str = "UPDATE products SET live = @show WHERE [email protected]"; 

    using (OleDbConnection conn = new OleDbConnection(s)) 
    { 
     using (OleDbCommand cmd = new OleDbCommand(str, conn)) 
     { 
      OleDbCommand mycommand = new OleDbCommand(); 

      OleDbParameter hideparam = new OleDbParameter("@show", OleDbType.Boolean); 
      hideparam.Value = true; 
      cmd.Parameters.Add(hideparam); 
      OleDbParameter product = new OleDbParameter("@product", OleDbType.VarChar); 
      product.Value = prodid; 
      cmd.Parameters.Add(product); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    Response.Redirect(Request.RawUrl); 
} 

很抱歉的長碼。

+0

OMG ....在後面的代碼中的sql語句字符串..什麼是一個很好的編程模式 –

+0

是不好的?我對asp.net相當陌生...... –

+0

取決於你認爲不好的東西....對我來說,將整個應用程序放在一個單獨的代碼文件中,沒有關注點分離或數據訪問層,甚至是一個ORM。 –

回答

2

如果命令按鈕的位置是切換[live]是/否字段的值,則讓數據庫引擎執行您所需的操作。

UPDATE products SET live = (Not live) WHERE [email protected] 

Not返回一個布爾值的倒數。所以Not True返回FalseNot False返回True。因此UPDATE語句將live設置爲與執行UPDATE之前包含的任何內容相反。在Access會話中嘗試它作爲一個新的查詢來檢查它是如何運作的。

如果這是令人滿意的,你不需要單獨的例程來隱藏和顯示。

+0

嗨HansUp,感謝您的回覆。這是正確的,它只是爲了切換'實時'列中的「是/否」字段的值。你能解釋一下你的建議是多麼的有趣嗎?我試圖實現它,但它不工作... –

+0

HansUp你是一個天才,這完美的作品,非常感謝你的幫助! –

+0

@HansUP'+ 1'因爲'String不能保持空對話..從來沒有機會表現出讚賞:) – bonCodigo