ASP.NET Calendar控件返回Date类型,但我需要Datetime插入SQL Server 2005

时间:2010-03-31 14:54:03

标签: .net asp.net sql-server sql-server-2005 calendar

我正在使用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>

4 个答案:

答案 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。