Как использовать команду IsPostBack for Update с проблемой синхронизации

У меня есть подробное представление asp.net, которое вставляет данные в таблицу распределения платежей, однако я хочу запустить команду обновления, которая обновляет данные в таблице s_transaction_enquiry, что делается в C#. Когда я запускаю код, команда обновления запускается перед командой вставки, поэтому данные не помещаются в таблицу s_transaction_enquiry.

Я создал команду обновления для запуска, когда пользователь нажимает на кнопку вставки в представлении сведений. Команда вставки связана с источником данных Sql подробного вида.

Мне сказали, что я могу использовать свойство IsPostBack в page_load, но уверен, как это сделать, есть кто-нибудь, кто мог бы мне помочь??

      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"/>

1 ответ

Вы должны закрыть соединение после каждого действия. Вы открыли соединение на "page_load", но не закрыли его, и с тех пор page_load выполняется также при каждой обратной передаче, что означает, что каждый раз, когда вы нажимаете кнопку, вы пытаетесь снова открыть соединение, не закрывая его.

также обратите внимание, что page_load выполняется до button_click Поэтому каждый раз, когда вы нажимаете кнопку, вы открываете соединение, не закрывая его, и пытаетесь открыть его снова в обработчике кликов.

OleDbConnection является одноразовым объектом, что означает, что он реализует функцию.dispose(), что также означает, что он может использоваться в using() заявление.

Оператор using() создает новый объект и удаляет его после. у вас есть довольно хорошее объяснение об открытии / закрытии / удалении OleDbConnection в C# здесь на веб-сайте Microsoft: класс OleDbConnection

в основном для того, чтобы адаптировать его к вашему коду, вы бы хотели сделать что-то вроде этого, сначала для удобства поместите обработку вашей базы данных в отдельную функцию и вызовите ее из загрузки страницы::

    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() и поместить его в свой обработчик кликов.

Другие вопросы по тегам