2012-08-02 124 views
1

我有被存放在之前的日期從填充壓延這種格式29/07/2012將字符串轉換成datetime VB.net

我想這個轉換爲datetime數據類型的字符串變量這種格式的SQL數據庫2012-07-29 00:00:00:000

The error message i'm getting at the minute is: 
"The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value." 

下面是一些代碼:

Dim strDate As String = "" 

Dim cmd2 As New SqlCommand("sp_Return6MonthTotal") 
       Dim strTotalHours6Month As Integer = 0 
       cmd2.Connection = con1 
       cmd2.CommandType = Data.CommandType.StoredProcedure 
       cmd2.Parameters.Add(New SqlParameter("@ServiceNumber", Data.SqlDbType.Char, 11)) 
       cmd2.Parameters.Add(New SqlParameter("@OvertimeDate2", Data.SqlDbType.DateTime)) 
       cmd2.Parameters("@ServiceNumber").Value = strServiceNumber 
       cmd2.Parameters("@OvertimeDate2").Value = strDate 

       If cmd2.ExecuteScalar() Is DBNull.Value Then 
        Label17.Text = "0" 
        Label21.Text = "0" 
       Else 
        strTotalHours6Month = cmd2.ExecuteScalar() 
        Label17.Text = strTotalHours6Month 
        Label21.Text = Math.Round(strTotalHours6Month/6) 
       End If 


       Dim cmd3 As New SqlCommand("sp_ReturnMonthTotal") 
       Dim strTotalHours As Integer = 0 
       cmd3.Connection = con1 
       cmd3.CommandType = Data.CommandType.StoredProcedure 
       cmd3.Parameters.Add(New SqlParameter("@ServiceNumber", Data.SqlDbType.Char, 11)) 
       cmd3.Parameters.Add(New SqlParameter("@OvertimeDate2", Data.SqlDbType.DateTime)) 
       cmd3.Parameters("@ServiceNumber").Value = strServiceNumber 
       cmd3.Parameters("@OvertimeDate2").Value = strDate 

Stored procedures: 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_ReturnMonthTotal] 
    @ServiceNumber varchar(100), 
    @OvertimeDate2 datetime 
AS 

SELECT sum(hoursworked) from overtime where servicenumber = @ServiceNumber and month(CONVERT(datetime, OvertimeDate2, 103)) = month(CONVERT(datetime, @OvertimeDate2, 103)) and year(CONVERT(datetime, OvertimeDate2, 103)) = year(CONVERT(datetime, @OvertimeDate2, 103)) 

------------- 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_Return6MonthTotal] 
    @ServiceNumber varchar(100), 
    @OvertimeDate2 datetime 
AS 

SELECT sum(hoursworked) from overtime where servicenumber = @ServiceNumber and overtimedate2 >= DATEADD(month, -6, CONVERT(datetime, @OvertimeDate2, 103)) 

對不起我的編程知識不是很大,我沒有這個代碼所以希望這樣做對某人感覺。

+0

你可以提供有問題的一些代碼? – 2012-08-02 10:49:40

+0

[你試過什麼](http://whathaveyoutried.com)?什麼代碼給你那個錯誤? – Oded 2012-08-02 10:50:14

+0

不要忘記標記爲接受,如果它適合你... – 2012-08-02 11:06:07

回答

0

您將不得不使用DateTime.TryParseExact將其存儲在DateTime對象中,然後將其作爲參數存儲在您的SqlCommand中。

2

嘗試只是唱類似的代碼如下轉換日期和比它發送到數據庫到

vb.net

Dim strDate As String = "21/07/2006" 
Dim dtfi As New DateTimeFormatInfo() 
dtfi.ShortDatePattern = "dd/MM/yyyy" 
dtfi.DateSeparator = "/" 
Dim objDate As DateTime = Convert.ToDateTime(strDate, dtfi) 

C#的店值(Ref)

string strDate = "21/07/2006"; 
DateTimeFormatInfo dtfi = new DateTimeFormatInfo(); 
dtfi.ShortDatePattern = "dd/MM/yyyy"; 
dtfi.DateSeparator = "/"; 
DateTime objDate = Convert.ToDateTime(strDate, dtfi); 
1

DateTime.Parse("29/07/2012")將毫無問題地解析爲DateTime類型。如果字符串不明確,這可能會失敗(「08/07/2012」可能是8月7日的,這取決於文化),因此使用ParseExactTryParseExact以及確切格式字符串(和文化)可能是更強大的解決方案

這可以使用任何常見方式(ADO.NET,ORM,如nHibernate或EF)直接輸入SQL Server。

在問題中存在一個誤解,即DATETIME以SQL Server格式存儲 - 它們不是。它們具有不可見的內部表示 - 您看到的是SSMS將數值格式化爲您所看到的值。

0
Dim dt As DateTime 
dt = Convert.ToDateTime(TextBox1.Text) 

,但我認爲你應該使用日期格式爲MM/DD/YYYY(的2012年7月29日,而不是29/07/2012)