2016-05-14 3 views
0

Я пытаюсь создать условное событие, когда я нажимаю <asp:button> на C#.Хранимая процедура SQL Server с условием

У меня есть GridView, связанный с двумя таблицами базы данных (в SQL Server). Я должен вставлять разные значения в один из них каждый день.

Внутри GridView:

  • У меня есть BoundField с ID для каждого элемента внутри таблицы базы данных
  • У меня есть два TemplateFields с текстовым полем, названный StartGV и EndGV

Вне GridView:

  • У меня есть <asp:TextBox> с AjaxCalendarExtender. Там я должен выбрать дату. Текстовое поле является TextDate

Так что, когда я нажимаю <asp:button>, событие должно:

  • проверка для каждой строки в GridviewID от первой колонки 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, это означает, что проблема здесь отсутствует.

+0

Вы не используете идентификатор в своем обновлении. Это может привести к вашей проблеме. –

+0

Да, я использую его в состоянии «если есть» перед запуском процесса обновления. Я использовал «foreach», что означает, что UPDATE и INSERT работают в одной строке. Затем я проверяю, существует ли идентификатор и дата в базе данных. Если да, строка будет обновлена, если нет, строка будет вставлена. –

+0

И внутри UPDATE мне не нужно обновлять идентификатор (ни дату), поэтому я не использую его. –

ответ

1

Без условий, когда вы обновляете все строки в таблице. Вам нужно использовать ID из своего GV для обновления точной строки в БД.

Смежные вопросы