2014-10-13 2 views
1

У меня есть форма окна (в VisualStudio-10), которая может загружать/сохранять записи в базе данных, перемещаться по существующим записям и редактировать их в форме. Я хотел бы сделать, чтобы число форм (4-значный первичный ключ для каждой записи) увеличивалось на 1 от последней записи в таблице Access DB при каждом создании новой записи.Windows Form - номер формы автоинкремента из последнего значения таблицы acess

Есть ли способ вызвать индекс последней записи, увеличить его на 1 и напечатать этот номер в текстовом поле номера формы? До сих пор я не смог найти много полезной информации в моих поисках, поэтому, если вы можете указать мне в правильном направлении или на другой вопрос, это было бы очень полезно, спасибо.

Это функция обновления/соединение с db. Имя базы данных: servicereq1 и имя таблицы servicereq. В текстовом поле я хотел бы, чтобы обновленный ключ отображался в формате: serviceRequestNumberTextBox. Спасибо еще раз за помощь.

private void updateButton_Click_1(object sender, EventArgs e) 
    { 
     { 

      OleDbConnection conn = new OleDbConnection(); 
      AppDomain.CurrentDomain.SetData("DataDirectory", @"\\prod\ServiceRequests"); 
      conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\servicereq1.mdb"; 

      OleDbCommand cmd = new OleDbCommand("UPDATE servicereq SET ServiceRequestNumber = @servreq, DateLogged = @datelogged, LoggedBy = @loggedby, [Problem In Environment] = @problemfoundin, Function = @function, [Other Impacts] = @summary, Account = @earningsaccount, [From] = @from, [To] = @to, Status = @status, Description = @description, Fixer = @fixer, [Time Estimate] = @timeestimate, [Actual Start] = @actualstart, [Actual Finish] = @actualfinish, [Actual Time] = @actualtime, [Programs/Forms] = @programsforms, Comments = @comments, [Retest Date] = @requestdate, Tester = @tester, [Code In Environment] = @codein WHERE (ServiceRequestNumber = @servreq)"); 
      cmd.Connection = conn; 

      conn.Open(); 

      if (conn.State == ConnectionState.Open) 
      { 
       cmd.Parameters.AddWithValue("@servreq", serviceRequestNumberTextBox.Text); 
       cmd.Parameters.AddWithValue("@datelogged", dateLoggedTextBox.Text); 
       cmd.Parameters.AddWithValue("@loggedby", loggedByComboBox.Text); 
       cmd.Parameters.AddWithValue("@problemfoundin", problem_In_EnvironmentComboBox.Text); 
       cmd.Parameters.AddWithValue("@function", functionTextBox.Text); 
       cmd.Parameters.AddWithValue("@summary", other_ImpactsTextBox.Text); 
       cmd.Parameters.AddWithValue("@earningsaccount", accountTextBox.Text); 
       cmd.Parameters.AddWithValue("@from", fromTextBox.Text); 
       cmd.Parameters.AddWithValue("@to", toTextBox.Text); 
       cmd.Parameters.AddWithValue("@status", statusComboBox.Text); 
       cmd.Parameters.AddWithValue("@description", descriptionTextBox.Text); 
       cmd.Parameters.AddWithValue("@fixer", fixerComboBox.Text); 
       cmd.Parameters.AddWithValue("@timeestimate", time_EstimateTextBox.Text); 
       cmd.Parameters.AddWithValue("@actualstart", actual_StartTextBox.Text); 
       cmd.Parameters.AddWithValue("@actualfinish", actual_FinishTextBox.Text); 
       cmd.Parameters.AddWithValue("@actualtime", actual_TimeTextBox.Text); 
       cmd.Parameters.AddWithValue("@programsforms", programs_FormsTextBox.Text); 
       cmd.Parameters.AddWithValue("@comments", commentsTextBox.Text); 
       cmd.Parameters.AddWithValue("@requestdate", retest_DateTextBox.Text); 
       cmd.Parameters.AddWithValue("@tester", testerComboBox.Text); 
       cmd.Parameters.AddWithValue("@codein", code_In_EnvironmentComboBox.Text); 
       cmd.Parameters.AddWithValue("@servreq", serviceRequestNumberTextBox.Text); 
       try 
       { 
        cmd.ExecuteNonQuery(); 
        MessageBox.Show("Form Updated Successfully"); 
        conn.Close(); 
       } 
       catch (OleDbException ex) 
       { 
        MessageBox.Show(ex.Message); 
        conn.Close(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Connection Failed"); 
      } 
     } 
    } 

Это функция сохранения новых записей.

private void updateButton_Click(object sender, EventArgs e) 
    { 
     { 
      OleDbConnection conn = new OleDbConnection(); 
      AppDomain.CurrentDomain.SetData("DataDirectory", @"\\prod\ServiceRequests"); 
      conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\servicereq1.mdb"; 

      String servreq = serviceRequestNumberTextBox.Text; 
      String datelogged = dateLoggedTextBox.Text; 
      String loggedby = loggedByComboBox.Text; 
      String problemfoundin = problem_In_EnvironmentComboBox.Text; 
      String function = functionTextBox.Text; 
      String summary = other_ImpactsTextBox.Text; 
      String earningsaccount = accountTextBox.Text; 
      String from = fromTextBox.Text; 
      String to = toTextBox.Text; 
      String status = statusComboBox.Text; 
      String description = descriptionTextBox.Text; 
      String fixer = fixerComboBox.Text; 
      String codein = code_In_EnvironmentComboBox.Text; 
      String programsforms = programs_FormsTextBox.Text; 
      String timeestimate = time_EstimateTextBox.Text; 
      String actualstart = actual_StartTextBox.Text; 
      String actualfinish = actual_FinishTextBox.Text; 
      String actualtime = actual_TimeTextBox.Text; 
      String retestdate = retest_DateTextBox.Text; 
      String tester = testerComboBox.Text; 
      String comments = commentsTextBox.Text; 


      OleDbCommand cmd = new OleDbCommand("INSERT into servicereq ([ServiceRequestNumber], DateLogged, LoggedBy, [Problem In Environment], Function, [Other Impacts], Account, [From], [To], Status, Description, Fixer, [Code In Environment], [Programs/Forms], [Time Estimate], [Actual Start], [Actual Finish], [Actual Time], [Retest Date], Tester, Comments) Values(@servreq, @datelogged, @loggedby, @problemfoundin, @function, @summary, @earningsaccount, @from, @to, @status, @description, @fixer, @codein, @programsforms, @timeestimate, @actualstart, @actualfinish, @actualtime, @requestdate, @tester, @comments)"); 
      cmd.Connection = conn; 

      conn.Open(); 

      if (conn.State == ConnectionState.Open) 
      { 
       cmd.Parameters.Add("@servreq", OleDbType.VarChar).Value = servreq; 
       cmd.Parameters.Add("@datelogged", OleDbType.VarChar).Value = datelogged; 
       cmd.Parameters.Add("@loggedby", OleDbType.VarChar).Value = loggedby; 
       cmd.Parameters.Add("@problemfoundin", OleDbType.VarChar).Value = problemfoundin; 
       cmd.Parameters.Add("@function", OleDbType.VarChar).Value = function; 
       cmd.Parameters.Add("@summary", OleDbType.VarChar).Value = summary; 
       cmd.Parameters.Add("@earningsaccount", OleDbType.VarChar).Value = earningsaccount; 
       cmd.Parameters.Add("@from", OleDbType.VarChar).Value = from; 
       cmd.Parameters.Add("@to", OleDbType.VarChar).Value = to; 
       cmd.Parameters.Add("@status", OleDbType.VarChar).Value = status; 
       cmd.Parameters.Add("@description", OleDbType.VarChar).Value = description; 
       cmd.Parameters.Add("@fixer", OleDbType.VarChar).Value = fixer; 
       cmd.Parameters.Add("@codein", OleDbType.VarChar).Value = codein; 
       cmd.Parameters.Add("@programsforms", OleDbType.VarChar).Value = programsforms; 
       cmd.Parameters.Add("@timeestimate", OleDbType.VarChar).Value = timeestimate; 
       cmd.Parameters.Add("@actualstart", OleDbType.VarChar).Value = actualstart; 
       cmd.Parameters.Add("@actualfinish", OleDbType.VarChar).Value = actualfinish; 
       cmd.Parameters.Add("@actualtime", OleDbType.VarChar).Value = actualtime; 
       cmd.Parameters.Add("@requestdate", OleDbType.VarChar).Value = retestdate; 
       cmd.Parameters.Add("@tester", OleDbType.VarChar).Value = tester; 
       cmd.Parameters.Add("@comments", OleDbType.VarChar).Value = comments; 

       try 
       { 
        cmd.ExecuteNonQuery(); 
        MessageBox.Show("Form Submitted Successfully"); 
        servicereqBindingSource.ResetBindings(true); 
        conn.Close(); 
       } 
       catch (OleDbException ex) 
       { 
        MessageBox.Show(ex.Message); 
        conn.Close(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Connection Failed"); 
      } 
      this.servicereqTableAdapter1.Load(servicereq1DataSet2.servicereq, serviceRequestNumberTextBox.Text); 
     } 
    } 
+0

Это запрос UPDATE, вы уже знаете значение 'serviceRequestNumberTextBox', потому что вы передаете его в предложение WHERE вашего текста sql. Вы имеете в виду запрос INSERT? – Steve

+0

Я знаю значение любой текущей записи в БД, однако, когда я создаю новую запись, все текстовые поля пусты. Я хотел бы, чтобы serviceRequestNumberTextbox обновлялся последним индексом db + 1, когда пользователь создает новую запись. – AndrewD

+0

Это звучит как работа значения Autonumber для первичного ключа вашей таблицы. Я также заметил, что вы храните базу данных в сетевом расположении. Есть и другие пользователи, которые одновременно вставляют новые записи? – Steve

ответ

4

Правильный подход в многопользовательском сценарии, подобный этому, заключается в том, чтобы изменить поле ServiceRequestNumber как поле AUTONUMBER. Таким образом, механизм базы данных вычисляет новый номер, и вы не рискуете ситуацией, когда один и тот же номер присваивается другому пользователю, работающему в той же базе данных, но с двух разных ПК.

Конечно, вам не нужно передавать что-либо в запросе INSERT для этого поля, поэтому удалите ServerRequestNumber и его местозаполнитель параметров из текста запроса INSERT.

если вы хотите знать, что такое Autonumber назначен вашей записи вы могли бы написать этот SQL

using(OleDbConnection conn = new OleDbConnection(......)) 
using(OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY", conn)) 
{ 
     conn.Open(); 
     int newServiceRequestNumber = Convert.ToInt32(cmd.ExecuteScalar()); 
     .... 
} 

Обратите внимание, что вы должны держать соединение и другие одноразовые предметы внутри с помощью блока, чтобы убедиться, что они удалено и закрыто

2

Как сказал Стив в комментариях самый простой способ сделать это было бы установить, что colunm как AutoNumber в базе данных и просто удалить текстовое поле для идентификатора в форме, которая добавляет новые записи. В вашей команде INSERT не указывайте значения для id, и база данных автоматически сгенерирует новый номер (последний id + 1) для этой новой записи.

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