2010-03-31 66 views
0

我正在使用ASP日曆控件將日期時間值插入到字段中作爲插入到SQL Server 2005數據庫表的一部分。ASP.NET日曆控件返回日期類型,但我需要日期時間插入到SQL Server 2005中

我收到以下錯誤,當我的表單提交到服務器,並嘗試插入到表:

的ArgumentException:的SQL Server中使用不支持的數據類型「日期」的版本。

看起來像日曆控件返回日期類型值。我怎樣才能讓Calendar控件返回一個DateTime值呢?

我現在知道SQL Server 2005不支持日期類型字段。

這裏是我的客戶端代碼在那裏我有我的日曆控制在一個FormView:

<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> 
+2

我們可以看到一些代碼,看看如何構建插入到數據庫? – 2010-03-31 14:59:26

+2

你已經用asp和asp.net標記了你的問題,這是兩個不同的框架。這是什麼?如果日期 - >日期時間的轉換是基於代碼的,這將大大影響您的答案。 – 2010-03-31 15:05:46

+0

KP, 我正在使用ASP.NET 3.5 – Rafael 2010-03-31 15:56:24

回答

0

不知道爲什麼你得到這個?你在說ASP.NET 2.0或更高版本嗎?默認情況下,它使用DateTime對象;你總是可以確保這一點做:

DateTime evalDate = new DateTime(cal1.SelectedDate.Year, cal1.SelectedDate.Month, cal1.SelectedDate.Day, 0, 0, 0); 

並用它來傳遞給DB ...

難道這也是由於有一個日期,而不是日期時間變量太插入PROC?

編輯:當沒有提供DateTime時,計算結果爲1/1/0001,這是SQL Server的問題;你必須確保它不低於1753年1月1日。這是一個痛苦...如果你可以使字段爲空並使用DateTime?或Nullable,這是一種解決方法,或始終確保最低日期。

+0

手動截斷數據沒有任何意義。它將被SQL Server自動截斷。 – abatishchev 2010-03-31 15:22:45

+0

這不是我所建議的...... – 2010-03-31 18:04:39

0

據我所知,你試圖創建一個類型爲DATE的列表。事實上,只有SQL Server 2008支持它,2005年 - 不。

即使Calendar.SelectedDate返回System.DateTime並且您將嘗試將其插入DATETIME類型的列中(在SQL Server 2005上),它將被成功插入。

如果列將有類型DATE(SQL Server 2008上)的日期將被截斷,併成功地插入

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之間。]

+0

編輯我的帖子下面;默認日期是1/1/0001,當沒有提供日期時會導致此錯誤。 – 2010-03-31 18:04:15

0

我相信它不會返回正確的格式,因爲它會在幾個月和幾年之間切換。日曆返回,日期時間和日期時間2之間有區別。你可能想要做datetime2,因爲它包含.net可能返回的任何可能的值,但是你需要在這裏做你的功課。

有從我寧願壓延而是一個讓你的約會很多解決方案如下:

string calClause = " START_TS > '"; 

calClause += Calendar1.SelectedDate.ToString("yyyy/MM/dd") + "' "; 

這段代碼應該產生一些看起來像這樣:

START_TS > '2013-09-04' 

你然後必須添加的地方

WHERE START_TS > '2013-09-04' 

然後將其添加到您的命令文本af ter where條款。 (像我的應用程序,你可能要包括在表中的空白和空值)

SELECT * From YourTableName WHERE START_TS > '2013-09-04 ' AND START_TS != '' AND START_TS is not null 

我用的方法基於各種頁面上的項目,如複選框和壓延產生通常被寫成聲明cmdtext的SQL命令。