2014-09-23 2 views
0

У меня есть сценарий обновления данных Сотрудника в таблице Employee.Ограничение для столбца обновления в sql

Сотрудник

EmpId EmpName 
---------------  
    1 james 
    2 Anil 
    3 Nandy 

Multiple пользователь обновить EmpName с помощью EmpId

Если один пользователь обновляет Empname от Nandy к Peter

Сотрудник

EmpId EmpName 
----------------  
    1 james 
    2 Anil 
    3 Peter 

В этой ситуации я должен ограничить другого пользователя обновлением того же EmpName на 60 секунд.

Если пользователь обновляет EmpNamePeter к John то я должен показать предупредительное сообщение, как Обновите через 60 секунд. Я не знаю, как это сделать в моем приложении.

Обновлено

Private Function Getrecentaccountdatevalues() As DataTable 
      Dim dsMaxdates As New DataSet 
      Dim dtMaxdates As New DataTable 
      Dim daMaxdates As SqlDataAdapter 
      Try 
       Dim strConnection As SqlClient.SqlConnection = New SqlClient.SqlConnection(strConnect(Me)) 
       Dim ocmdAofA As SqlClient.SqlCommand = New SqlClient.SqlCommand 
       ocmdAofA.Connection = strConnection 
       ocmdAofA.CommandText = "usp_getMaxdatesAofA" 
       ocmdAofA.CommandType = CommandType.StoredProcedure 
       ocmdAofA.Parameters.Clear() 
       ocmdAofA.Parameters.Add("@acc_AccountId", SqlDbType.Int, 15).Value = Request.QueryString("acct_AccountID") 
       ocmdAofA.Parameters.Add("@client_ClientId", SqlDbType.Int, 15).Value = Request.QueryString("acct_ClientID") 
       strConnection.Open() 
       daMaxdates = New SqlDataAdapter(ocmdAofA) 
       daMaxdates.Fill(dtMaxdates) 
       strConnection.Close() 
       strConnection.Dispose() 
       ocmdAofA.Dispose() 
      Catch ex As Exception 
       Throw ex 
      End Try 
      Return dtMaxdates 
     End Function 

время Сопоставляя во время обновления результата.

Private Sub AofA_Update_Insert() 
       Try 

        Dim accountNumber As String = Request.QueryString("acct_AccountID") 
        datatablerecentaccountvalues = Getrecentaccountdatevalues() 
        Dim dr As DataRow = datatablerecentaccountvalues.Rows(0) 
        Dim MaxUpdatedPrepped As DateTime = dr.Item("MaxUpdatedPrepped").ToString() 
        Dim Universaldatetime As DateTime = Now.ToUniversalTime() 
        Dim result As Integer = DateDiff(DateInterval.Second, MaxUpdatedPrepped, Universaldatetime) 
        If (result < 5 And accountNumber = GetrecentAccountID()) Then 
         ASPNET_MsgBox("Due to handling multiple user updates on same account at same time.Please Reset the page.") 
         Exit Sub 
        End If 
End Try 
+3

Добавить столбец «LastUpdate» в качестве «DateTime», а затем сравнить обновление с «Now()», если это больше, чем 60 секунд выполнения обновления, в противном случае бросок и ошибка? – RemarkLima

+0

Okay @RemarkLima, но есть ли возможность ограничить операцию обновления без добавления столбцов –

+0

Не совсем, как еще вы узнаете, когда это было последнее обновление !? Вы могли бы сделать это с помощью нового стола? Или сделать это через объект 'application'? – RemarkLima

ответ

1

Почему вы не добавить TimeStamp Column, что-то вроде LastUpdate, и в вашем обновление проверки запроса, если новое обновление находится в пределах или нет?

[Обновлено]

IF (SELECT DATEDIFF(SECOND,LastUpdate,GETDATE()) 
FROM Table WHERE ID = @Id) >= 60 
BEGIN 
    UPDATE Table ... 
END 
+0

Я добавил одну колонку TimeStamp и поддерживаю дату даты обновленных данных .. У меня есть еще одна проблема .. Если в то же время два пользователя обновляют Empname, я должен ограничить второго пользователя и оповещения, как" Другой пользователь также обновляет один и тот же запрос EmpId до полного «... –

+0

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

+0

Я просто обновляю код выше. –

0

Ваш комментарий «но есть ли возможность ограничить операцию обновления без добавления каких-либо столбцов» Я могу только предположить, что вы не разрешается прикасаться к базе данных? Вы могли бы добавить совершенно новую таблицу tbl_LastUpdate с колонками ID, EmpId и LastUpdate и использовать это как таблицу ссылок для проверки?

Однако, если вы не можете изменить базу данных, в зависимости от нагрузки приложения вы можете использовать dictionary объект, хранящийся в application объекта:

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)  
     Application("lastUpdate") = new Dictionary(of int, DateTime) 
End Sub 

(простите мой VB, это немного ржавый Вы можете! нужно проверить)

Тогда при выполнении обновления:

Sub updateEmpName(EmpId as Integer, EmpName as String) 
    ' Get the Dictionary object 
    Dim d as Dictionary 
    d = Application("lastUpdate") 

    if d.containsKey(EmpId) Then 
     ' Check if the last update is greater than 60 seconds 
     Dim dt as DateTime = d.Item(EmpId) 
     if dt.AddSeconds(60) > DateTime.Now Then 
      ' Do the update as greater then 60 seconds 
      d.Item(EmpId) = DateTime.Now ' Set the datetime to now for this update 
     else 
      ' No update allowed 
     End If 
    else 
     ' Update allowed as no key present 
     d.Add(EmpId, DateTime.Now) ' Add the current ID and Timestamp to check 
    End If 

    ' Now loop through and clean up all old items in the dictionary to stop it getting to big 
    For Each pair in d 
     if pair.Value.AddSeconds(60) > DateTime.Now Then 
       d.Remove(pair.key) 
     End if 
    Next   


    Application("lastUpdate") = d 
End Sub 

Там хорошая ссылка на объект словаря здесь: http://www.dotnetperls.com/dictionary-vbnet

Как уже говорилось, мой VB действительно ржавый, поэтому код должен быть проверен трижды, но, надеюсь, этого достаточно, чтобы вы начали!

+0

Этот сценарий не работает @ RemarkLima –

+0

Эта идея не работала для моего сценария потому что, если оба пользователя попытаются обновить EmpName, тогда это не сработает ... потому что эта ситуация срабатывает только после обновления данных первого пользователя. У вас есть какая-либо другая идея, чтобы восстановить этот сценарий. –

+0

Но вы можете проверить только обновление ? Скажите, что первый пользователь отменяет обновление? Как работает ваш интерфейс? Есть ли экран редактирования? Тогда вам придется смотреть на блокировку записи, если это так – RemarkLima

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