我正在使用ASP日历控件将日期时间值插入到字段中,以作为SQL Server 2005数据库表插入的一部分。
当我将表单提交到服务器并尝试插入表中时出现以下错误:
ArgumentException:正在使用的SQL Server版本不支持数据类型“date”。
似乎Calendar控件返回Date类型值。我如何使Calendar控件返回DateTime值?
我现在知道SQL Server 2005不支持日期类型字段。
这是我的客户端代码,我在FormView中有我的Calendar控件:
<tr>
<td class="style4">
Date</td>
<td>
<asp:Calendar ID="Calendar1" runat="server" BackColor="White"
BorderColor="#3366CC" BorderWidth="1px" CellPadding="1"
DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
ForeColor="#003399" Height="200px" SelectedDate='<%# Bind("EventDate") %>'
Width="220px">
<SelectedDayStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
<SelectorStyle BackColor="#99CCCC" ForeColor="#336666" />
<WeekendDayStyle BackColor="#CCCCFF" />
<TodayDayStyle BackColor="#99CCCC" ForeColor="White" />
<OtherMonthDayStyle ForeColor="#999999" />
<NextPrevStyle Font-Size="8pt" ForeColor="#CCCCFF" />
<DayHeaderStyle BackColor="#99CCCC" ForeColor="#336666" Height="1px" />
<TitleStyle BackColor="#003399" BorderColor="#3366CC" BorderWidth="1px"
Font-Bold="True" Font-Size="10pt" ForeColor="#CCCCFF" Height="25px" />
</asp:Calendar>
</td>
</tr>
答案 0 :(得分:0)
不确定你为什么会这样?你在说ASP.NET 2.0或更高版本吗?默认情况下,它使用DateTime对象;你可以通过这样做来确保这一点:
DateTime evalDate = new DateTime(cal1.SelectedDate.Year, cal1.SelectedDate.Month, cal1.SelectedDate.Day, 0, 0, 0);
并使用此传递给DB ......
这也可能是因为插入过程有一个日期而不是日期时间变量吗?
编辑:未提供时,DateTime评估为1/1/0001,这是SQL Server的问题;你必须确保它不低于17/1/15。这是一个痛苦......如果你可以使该字段为null并使用DateTime?或Nullable,这是一种变通方法,或始终确保最小日期。
答案 1 :(得分:0)
据我所知,您尝试创建一个类型为DATE
的列的表。实际上,只有SQL Server 2008支持它,2005年 - 不要。
即使Calendar.SelectedDate
返回System.DateTime
,您也会尝试将其插入DATETIME
类型的列中(在SQL Server 2005上),它将成功插入。
如果列的类型为DATE
(在SQL Server 2008上),则日期将被截断并成功插入
答案 2 :(得分:0)
这是我的代码:
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:revi_rafaDbConnectionString %>"
DeleteCommand="DELETE FROM [Event] WHERE [EventID] = @EventID"
InsertCommand="INSERT INTO [Event] ([[HostLogin], [EventDate], [EventTime], [EventLocation], [EventDescription]) VALUES (@LoginID, @EventDate, @EventTime, @EventLocation, @EventDescription)"
SelectCommand="SELECT * FROM [Event]"
UpdateCommand="UPDATE [Event] SET [HostLogin] = @HostLogin, [EventDate] = @EventDate, [EventTime] = @EventTime, [EventLocation] = @EventLocation, [EventDescription] = @EventDescription WHERE [EventID] = @EventID">
<DeleteParameters>
<asp:Parameter Name="EventID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="HostLogin" Type="String" />
<asp:Parameter DbType="Datetime" Name="EventDate" />
<asp:Parameter Name="EventTime" Type="String" />
<asp:Parameter Name="EventLocation" Type="String" />
<asp:Parameter Name="EventDescription" Type="String" />
<asp:Parameter Name="EventID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="LoginID" />
<asp:Parameter DbType="Datetime" Name="EventDate" />
<asp:Parameter Name="EventTime" Type="String" />
<asp:Parameter Name="EventLocation" Type="String" />
<asp:Parameter Name="EventDescription" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
我现在已经超过了datetime问题的日期。我将EventDate的DbType设置为Datetime。但是,我现在得到:
[SqlTypeException:SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。]
答案 3 :(得分:0)
我相信它不会返回正确的格式,因为它会在数月和数年内切换。日历返回,日期时间和日期时间2之间存在差异。您可能希望执行datetime2,因为它包含.net可以返回的任何可能的值,但您需要在此处执行您的功课。
有许多解决方案可以从日历中获取您的日期,但我更喜欢的是以下内容:
string calClause = " START_TS > '";
calClause += Calendar1.SelectedDate.ToString("yyyy/MM/dd") + "' ";
此代码段应生成如下所示的内容:
START_TS > '2013-09-04'
然后你必须添加where
WHERE START_TS > '2013-09-04'
然后在where子句之后将其添加到命令文本中。 (就像我的应用程序,您可能希望在表中包含空值和空值)
SELECT * From YourTableName WHERE START_TS > '2013-09-04 ' AND START_TS != '' AND START_TS is not null
我使用一种方法生成SQL命令,该命令通常基于各种页面项目(如复选框和日历)编写为cmdText。