DBConcurrencyException в приложении winforms из-за временной части поля datetime - PullRequest
0 голосов
/ 02 июня 2010

У меня есть приложение winforms .net 2.0, которое работает на сервере MS SQL 2008. Я загружаю DataSet с этого сервера, открываю набор этого набора данных через связанные элементы управления winform, а затем отправляю обновления через SqlDataAdapters.

Один такой адаптер прикреплен к таблице с двумя ключевыми полями RecruitID и StatusDate. StatusDate - это поле DateTime на сервере, а System.DateTime в наборе данных.

В последнее время я получаю DBConcurrencyExceptions, я думаю, что b / c форматирования информации о дате. Если я перехватываю SQL, генерируемый адаптером, я вижу ГДЕ условия, такие как:

WHERE (RecruitID = 236) AND (StatusDate = '2010-05-27 04:45:34.053')

Когда они должны быть:

WHERE (RecruitID = 236) AND (StatusDate = '2010-05-27 16:45:34.053')

Итак, часы должны быть в военное время - вот что показывает, запрашиваю ли я соответствующую запись из БД в студии управления mssql. Я не уверен, где происходит перевод с военного времени на стиль am / pm, поэтому я не знаю, где его можно остановить.

Эта дата отображается в DataGrid. Соответствующий экземпляр DataGridColumnStyle имеет свойство .Format = 'g', которое преобразует указанную выше дату в «27.05.2010 16:45» для отображения. Если я удалю это свойство формата 'g', это не будет иметь никакого значения.

Кто-нибудь может подсказать мне здесь?

Большое спасибо заранее!

-Roy

1 Ответ

0 голосов
/ 03 июня 2010

Ack - неудобно. Форматирование даты / времени в SQL было отключено только из-за того, как я его записывал. В частности, я звонил .ToString и передавал в произвольном формате, который (я думаю) делал преобразование времени. Фактический материал, отправляемый в БД, имел верные значения, я считаю.

Я завершил удаление некоторых полей, заполненных триггерами, из SQL-кода sqladapters CommandText, и это, похоже, исправление. (Хотя я все еще не уверен, почему я получал исключение DBConcurrencyException.) Время покажет, возможно.

Спасибо, что подумали об этом!

-Roy

Private Sub RecordSQL(ByVal sender As Object, ByVal e As SqlClient.SqlRowUpdatingEventArgs) Handles sdaRecruitStatuses.RowUpdating
    Dim pvalue As String
    m_strLastSQL = e.Command.CommandText
    For Each prm As SqlClient.SqlParameter In e.Command.Parameters
        If TypeOf prm.Value Is DateTime Then
            pvalue = "'" & CType(prm.Value, DateTime).ToString("yyyy-MM-dd hh:mm:ss.fff") & "'"
        Else
            pvalue = prm.Value.ToString()
            If pvalue.Length = 0 Then pvalue = "NULL"
        End If
        m_strLastSQL = Replace(m_strLastSQL, prm.ParameterName, pvalue)
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...