由于datetime字段的munged time部分,winforms app中的DBConcurrencyException

时间:2010-06-01 21:08:25

标签: .net winforms sql-server-2008

我有一个winforms .net 2.0应用程序正在点击MS SQL 2008服务器。我从该服务器加载一个DataSet,通过绑定的winform控件和放大器公开一堆数据集。然后通过SqlDataAdapters推送更新。

一个这样的适配器附加到具有两个关键字段RecruitID和StatusDate的表。 StatusDate是服务器上的DateTime字段,DataSet中的System.DateTime。

我最近得到了DBConcurrencyExceptions我认为日期信息格式的b / c。如果我捕获适配器正在生成的SQL,我会看到WHERE条件如下:

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管理工作室中查询数据库中的正确记录,那就是显示的。我不确定从军队到上午/下午时间的翻译时间在哪里,所以我不知道在哪里尝试阻止它。

此日期显示在DataGrid中。相关的DataGridColumnStyle实例具有.Format属性='g',它将上述日期转换为“5/27/2010 4:45 PM”进行显示。如果我删除'g'格式的属性,它没有任何区别。

有人能告诉我一个线索吗?

非常感谢提前!

-Roy

1 个答案:

答案 0 :(得分:0)

确认 - 尴尬。 SQL中的日期/时间格式关闭只是因为我捕获它的方式。具体来说,我正在打电话.ToString&传递一种自定义格式(我认为)正在进行时间转换。发送到数据库的实际内容我认为具有正确的值。

我最终从sqladapters CommandText SQL中删除了一些触发器填充的字段,这似乎是一个修复。 (虽然我仍然不确定为什么我会得到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