我有一个VB6应用程序,它与SQL Server中的日期时间值一起使用(显然将日期存储为mm/dd/yyyy).
我需要以dd/mm/yyyy的形式向用户表示这些日期,以dd/mm/yyyy读取它们,然后将它们作为标准mm/dd/yyyy存储回数据库.
这是我当前的代码片段,其中拉动+插入日期,但是我已经阅读了许多处理转换的冲突方法,我想知道是否有人知道这种情况的明确解决方案.
"SELECT * FROM List WHERE DateIn LIKE '%" & txtDateIn.Text & "%'" "UPDATE [Progress] SET [Date] = '" & txtDate.Text & "'" txtDate.Text = "" & RecordSet.Fields("Date").Value
有什么想法吗?提前致谢.
**更新
实际上我只是注意到我的日期时间字段中存储的日期格式为16/08/2009 00:00:00,即dd/mm/yyyy.所以也许我误解了这个问题.但是当我尝试更新日期时间值时,我一直在'将char数据类型转换为日期时间数据类型导致超出范围的datetime值.'.
我认为这是因为日期格式不匹配(导致月份值超出范围的问题)但是我确实已经在日期时间字段中以日/月/年的格式存在日期值.提交到数据库的日期肯定是dd/mm/yyyy.
****更新2**
好吧,我造成了一些混乱.我道歉.
我将日期作为日期时间存储在SQL数据库中
文本是VB6应用程序中的TextBox控件
我正在运行SQL SELECT语句来从数据库中读取日期并将值放在TextBox中
然后我有一个'commit'命令按钮,然后执行UPDATE SQL语句将TextBox的值放入SQL数据库的datetime字段
这在1个特定场合下完美无缺.
在这种情况下,我有一个日期时间值(SQL Server 2005显示为16/08/2009 00:00:00),该值从数据库中读取并使用值16/08/2009填充TextBox.现在,当我尝试运行UPDATE语句而不修改TextBox文本时,我收到错误'将char数据类型转换为日期时间数据类型导致超出范围的datetime值.'
其他记录(例如日期为04/08/2009的记录)不会发生这种情况,因此我可以看到的唯一问题可能是值中的日期和月份的位置,因为如果数据库预计月份首先显然是16/08/2009将超出范围.但是,数据库中的值已经是16/08/2009,没有任何问题.
SQL Server"显然"不会将日期存储为mm/dd/yyyy.据我所知,它根本不以文本格式存储它们.
我不知道VB6对参数化查询的支持是什么,但这就是你想要的:基本上你想把参数作为日期而不是文本传递给查询.基本上你应该将用户输入解析为日期(无论VB6做什么),然后在参数化查询中传递它.
编辑:我试图找出VB6如何处理参数化查询,并没有太大的运气 - 希望任何关于VB6的好书都能涵盖它.(当然,有很多VB.NET的例子......)有一个Wrox帖子给出了一个例子; 这可能足以让你前进.
编辑:正如对此答案的评论和编辑此问题编辑所表明的那样,对于您的数据类型究竟是什么有一些混淆.请不要使用基于字符的字段来存储日期:没有好处可以.使用正确的日期/日期时间/任何字段,然后确保使用参数化查询来访问数据库,以便驱动程序可以进行任何必要的转换.完全依赖文本格式是个坏主意.
在查询中使用日期或时间戳的ODBC规范形式.这样可以避免在存储日期时因本地化而产生的任何误解.时间戳格式为{ts'yyyy-mm-dd hh:mm:ss [.fff]'}日期格式为{d'yyyy-mm-dd'}以下是我用于此的函数.
现在,在VB6中进入和显示.理想情况下,您将使用datetimepicker控件而不是文本框,因为它返回一个日期,并且在使用它时,您选择的日期没有任何误解.但是如果你可以假设它总是DD/MM/YYYY(这是一个很大的if),你可以使用Format(datevalue,"DD/MM/YYYY")来显示它.要将其读入日期变量,您不能只使用CDate.你需要使用解析和类似DateSerial的东西把它放在一起:DateSerial(右(strDate,4),Mid(strDate,4,2),Mid(strDate,1,2)).
' ------------------------------------------------------------------------------ ' DateLiteral ' ' Description : ' given a vb date, it returns a string with the odbc canonical date format. ' ' History ' 2008-02-04 - WSR : added to this project ' Public Function DateLiteral(ByRef dtSource As Date) As String DateLiteral = _ "{d '" & LeftPadDigits(Year(dtSource), 4) & "-" & _ LeftPadDigits(Month(dtSource), 2) & "-" & _ LeftPadDigits(Day(dtSource), 2) & "'}" End Function ' ------------------------------------------------------------------------------ ' ------------------------------------------------------------------------------ ' TimeStampLiteral ' ' Description : ' given a vb date, it returns a string with the odbc canonical timestamp format. ' ' History ' 2008-02-04 - WSR : added to this project ' Public Function TimeStampLiteral(ByRef dtSource As Date) As String TimeStampLiteral = _ "{ts '" & LeftPadDigits(Year(dtSource), 4) & "-" & _ LeftPadDigits(Month(dtSource), 2) & "-" & _ LeftPadDigits(Day(dtSource), 2) & " " & _ LeftPadDigits(Hour(dtSource), 2) & ":" & _ LeftPadDigits(Minute(dtSource), 2) & ":" & _ LeftPadDigits(Second(dtSource), 2) & "'}" End Function ' ------------------------------------------------------------------------------ ' ------------------------------------------------------------------------------ ' LeftPadDigits ' ' Description : pads the given string to the left with zeroes if it is under ' the given length so that it is at least as long as the given length. ' ' History ' 2008-02-04 - WSR : added to this project ' Public Function LeftPadDigits(ByVal strSource As String, ByVal lngLength As Long) As String If Len(strSource) < lngLength Then LeftPadDigits = String$(lngLength - Len(strSource), "0") & strSource Else LeftPadDigits = strSource End If End Function ' ------------------------------------------------------------------------------
还应该注意,是的第一选择是使用ADO和参数化查询.在我的情况下,我通过第三方库访问数据库,不能使用参数化查询.因此日期文字处理.以下是ADO参数化查询的示例.代码可能会有所不同,具体取决于您使用的ADO连接类型:OLEDB,ODBC或SQLNative.有时它不只是一个?用于参数标记.这个例子是OLEDB.
Set cmdVerifyUser = New ADODB.Command cmdVerifyUser.CommandType = adCmdText cmdVerifyUser.CommandTimeout = 30 cmdVerifyUser.CommandText = "SELECT username FROM users WHERE userid = ?" cmdVerifyUser.Parameters.Append cmdVerifyUser.CreateParameter("userid", adVarChar, adParamInput, Len(m_strUserName), m_strUserName) cmdVerifyUser.ActiveConnection = m_conDatabase Set rstResults = cmdVerifyUser.Execute() If Not rstResults.EOF Then