【问题标题】:How to use a IsPostBack for Update command with timing issue如何使用 IsPostBack 进行更新命令与计时问题
【发布时间】:2014-03-23 13:00:13
【问题描述】:

我有将数据插入支付分配表的 asp.net detailsview,但是我想运行一个更新命令,将数据更新到 s_transaction_enquiry 表中,这是在 C# 中完成的。当我运行代码时,更新命令在插入命令之前首先运行,因此不会将数据放入 s_transaction_enquiry 表中。

我创建了更新命令,当用户单击详细信息视图中的插入按钮时运行。 插入命令链接到详细视图的 Sql 数据源。

有人告诉我可以在 page_load 中使用“IsPostBack”属性,但确定如何执行此操作,有人可以帮助我吗??

      protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            string conn = "";
            string sqlCOmmand = "UPDATE s_transaction_enquiry, payment_allocation SET s_transaction_enquiry.payment_amount = payment_allocation.payment_amount, s_transaction_enquiry.payment_ref = payment_allocation.payment_ref, s_transaction_enquiry.payment_received_date = payment_allocation.payment_received_date WHERE payment_allocation.s_invoice_numer = s_transaction_enquiry.s_invoice_number AND payment_allocation.account_number = s_transaction_enquiry.account_number";
            conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();
            UpdateRow(conn, sqlCOmmand);
        }


    }

    public void UpdateRow(string connectionString, string insertSQL)
    {
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {

            OleDbCommand command = new OleDbCommand(insertSQL);


            command.Connection = connection;

            try
            {
                connection.Open();
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }

从数据源插入语句:

  <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" DeleteCommand="DELETE FROM [payment_allocation] WHERE [payment_ref] = ?" ProviderName="<%$ ConnectionStrings:ConnectionString1.ProviderName %>" SelectCommand="SELECT * FROM [payment_allocation]" 
             InsertCommand="INSERT INTO [payment_allocation] ([payment_ref], [account_number], [account_ref], [allocate_date], [payment_amount], [payment_received_date], [s_invoice_numer]) VALUES (?, ?, ?, ?, ?, ?, ?)">

调用插入语句的按钮:

  <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Insert" Text="Create"/>

【问题讨论】:

  • IsPostBack 只是一个在回发时引发的标志。比如,如果你点击你的按钮,它会回发到你的 aspx 页面并且 IsPostBack 会是真的。这基本上意味着 IsPostBack 只会在您第一次加载页面时为假,并且在页面回发时为真。此外,page_load 在单击事件处理程序之前执行,所以它应该没问题。你有没有可能在这里遇到不同的问题?
  • 您在 page_load 上打开了连接,但您似乎没有关闭它,这是您的完整代码吗?
  • 我以为我在更新命令运行后关闭了 Button1_click 事件的连接?是否有另一种方法可以确保 aspx 页面上的插入命令首先运行?
  • 您必须在完成插入后在页面加载中关闭连接。您在页面加载时执行操作,您必须打开/关闭它。或者更好的是,在按钮和 page_load 的连接上使用 using() 块。另外,我假设您希望插入只执行一次,而不是每次单击按钮时,因此使用if(!IsPostBack ) 仅在页面首次加载时运行它
  • 让我知道这是否适合你,所以我可以将其添加为答案

标签: c# asp.net sql ispostback


【解决方案1】:

您应该在每次操作后关闭您的连接。您已经在 'page_load' 上打开了一个连接,但没有关闭它,并且由于 page_load 在每次回发时也会执行,这意味着每次单击按钮时,您都会尝试再次打开连接而不关闭它。

还请注意,page_loadbutton_click 事件处理程序之前执行,因此每次单击按钮时都会打开连接而不关闭,并尝试在单击处理程序中再次打开它。

OleDbConnection是一个一次性对象,也就是说它实现了.dispose()函数,也意味着它可以在using()语句中使用。

using() 语句创建一个新对象并在之后处理它。 你有一个很好的解释在 C# 中打开/关闭/处理 OleDbConnection 在微软网站上:OleDbConnection Class

基本上为了让它适应你的代码,你会想做这样的事情, 为了方便起见,首先将您的数据库处理放在一个单独的函数中,并从页面加载中调用它::

    protected void Page_Load(object sender, EventArgs e)
    {
        string conn = "";
        string sqlCOmmand= "inset blablabla into blablabla";
        conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();


        InsertRow(conn,sqlCOmmand);


    }


//taken from microsoft website
public void InsertRow(string connectionString, string insertSQL)
{
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // The insertSQL string contains a SQL statement that 
        // inserts a new row in the source table.
        OleDbCommand command = new OleDbCommand(insertSQL);

        // Set the Connection to the new OleDbConnection.
        command.Connection = connection;

        // Open the connection and execute the insert command. 
        try
        {
            connection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        // The connection is automatically closed when the 
        // code exits the using block.
    }
}

好了,说清楚了这部分,就开始下一个吧:

我假设您只想在页面加载正确时才插入数据库?而不是在每次单击按钮后。因此,您需要指示asp.net 仅在首次加载且不是回发时才执行您的代码。您可能希望将 page_load 函数更改为如下所示:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string conn = "";
            string sqlCOmmand = "inset blablabla into blablabla";
            conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();
            InsertRow(conn, sqlCOmmand);
        }
    }

至于您的点击处理程序,您应该创建另一个函数 UpdateRow 并使用 using() 语句执行相同操作并将其放入您的点击处理程序中

【讨论】:

  • 我更改了我的代码(请参见上文),但它不起作用。
  • 您能否更具体地说明它是如何不起作用的?你有例外吗?你检查你的数据库看它是否被插入?
  • 没有给出异常,在我检查数据库并且它们在 s_transaction_enquiry 表中没有数据之前,它看起来很有效。
  • 根据您的代码,您似乎正在尝试更新某些内容,您确定您不是要先执行“INSERT”语句吗?您更新的数据是否存在?
  • aspx页面的detailsview中已经创建了insert语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2022-01-13
  • 2020-10-29
  • 2019-03-16
  • 2014-02-21
  • 2016-11-30
相关资源
最近更新 更多