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