Я пытаюсь создать условное событие, когда я нажимаю <asp:button>
на C#.Хранимая процедура SQL Server с условием
У меня есть GridView
, связанный с двумя таблицами базы данных (в SQL Server). Я должен вставлять разные значения в один из них каждый день.
Внутри GridView
:
- У меня есть
BoundField
сID
для каждого элемента внутри таблицы базы данных - У меня есть два
TemplateFields
с текстовым полем, названныйStartGV
иEndGV
Вне GridView
:
- У меня есть
<asp:TextBox>
сAjaxCalendarExtender
. Там я должен выбрать дату. Текстовое поле являетсяTextDate
Так что, когда я нажимаю <asp:button>
, событие должно:
проверка для каждой строки в
Gridview
(сID
от первой колонкиGridView
«s и даты выбранных в текстовом поле за пределамиGridView
), если запись уже существует в базе данных- Если да, то запись базы данных должна быть обновлена wi го новых значений
- Если нет, то новая запись должна быть вставлена со значениями
Я использую хранимые процедуры для обновления и вставки.
Это код в C#:
protected void BotonSubmit_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
//HERE I SAVE THE TEXTBOXS FROM GRIDVIEW INSIDE A VARIABLE
TextBox StartGV = row.FindControl("StartGV") as TextBox;
TextBox EndGV = row.FindControl("EndGV") as TextBox;
DateTime Date = DateTime.ParseExact(TextDate.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture);
//HERE I EXTRACT THE VALUE FROM THE FIRST COLUMN (THE ID)
if (row.RowType == DataControlRowType.DataRow)
{
string ID = row.Cells[0].Text;
//HERE I CHECK IF THE ROW ALREADY EXISTS IN DATABASE TABLE:
//IF YES, UPDATE:
if (CADCATOPS.CADBatchHandoff.CheckTableDB(Convert.ToInt32(ID), Convert.ToString(Date)))
{
string connectionString = @"MY CONNECTION STRING";
SqlConnection Connection1 = null;
SqlTransaction Transaction1 = null;
{
Connection1 = new SqlConnection();
Connection1.ConnectionString = connectionString;
Connection1.Open();
Transaction1 = Connection1.BeginTransaction(System.Data.IsolationLevel.Serializable);
SqlCommand command1 = new SqlCommand("UPDATE", Connection1, Transaction1);
command1.CommandType = CommandType.StoredProcedure;
command1.Parameters.Clear();
command1.Parameters.AddWithValue("@Start", Convert.ToDateTime(StartGV.Text));
if (EndGV.Text != "")
{
command1.Parameters.AddWithValue("@End", Convert.ToDateTime(EndGV.Text));
}
command1.ExecuteNonQuery();
Transaction1.Commit();
Connection1.Close();
}
}
//IF NO, INSERT:
if (!CADCATOPS.CADBatchHandoff.CheckTableDB(Convert.ToInt32(IDBatch), Convert.ToString(FechaCT1)))
{
//FIRST OF ALL, CHECK IF THE "STARTGV" TEXTBOX IS NOT EMPTY. IF IT'S EMPTY, THE PROCESS WILL NOT START FOR THIS ROW.
if (StartGV.Text != "")
{
string connectionString = @"MY CONNECTION STRING";
SqlConnection Connection1 = null;
SqlTransaction Transaction1 = null;
{
Connection1 = new SqlConnection();
Connection1.ConnectionString = connectionString;
Connection1.Open();
Transaction1 = Connection1.BeginTransaction(System.Data.IsolationLevel.Serializable);
SqlCommand command1 = new SqlCommand("INSERT", Connection1, Transaction1);
command1.CommandType = CommandType.StoredProcedure;
command1.Parameters.Clear();
command1.Parameters.AddWithValue("@Start", Convert.ToDateTime(StartGV.Text));
if (EndGV.Text != "")
{
command1.Parameters.AddWithValue("@End", Convert.ToDateTime(EndGV.Text));
}
comando.Parameters.AddWithValue("@ID", Convert.ToInt32(ID));
comando.Parameters.AddWithValue("@DATE", Convert.ToDateTime(DATE.Text));
command1.ExecuteNonQuery();
Transaction1.Commit();
Connection1.Close();
}
}
}
}
}
}
Таким образом, это работает, но что-то не так:
Состояние
INSERT
работает отлично.UPDATE
не работает нормально: в «StartGV» и EndGV»выбранные значения для процесса всегда совпадают с последней строкой этого не происходит с процессом ВСТАВИТЬ
Почему.. не так ли?
Редактировать
Я забыл показать SELECT
заявления в моем проекте:
Внутри адаптера таблицы, я создал этот запрос, названный CheckTableDB
:
SELECT COUNT(*)
FROM BatchDatos
WHERE (ID = @ID) and ([email protected])
, а затем в C# :
public static bool CheckTableDB(int ID, string DATE)
{
return adapter.CheckTableDB(ID, DATE) != 0;
}
Я пользуюсь этим для UPDATE
и INSERT
. Он работает нормально для INSERT
, это означает, что проблема здесь отсутствует.
Вы не используете идентификатор в своем обновлении. Это может привести к вашей проблеме. –
Да, я использую его в состоянии «если есть» перед запуском процесса обновления. Я использовал «foreach», что означает, что UPDATE и INSERT работают в одной строке. Затем я проверяю, существует ли идентификатор и дата в базе данных. Если да, строка будет обновлена, если нет, строка будет вставлена. –
И внутри UPDATE мне не нужно обновлять идентификатор (ни дату), поэтому я не использую его. –