2017-04-25 64 views
-1

將nvarchar數據類型轉換爲日期時間數據類型 會導致超出範圍的值。SQL中的例外日期時間

我的代碼:

string sqlthem = "INSERT INTO Infosp1 VALUES (@khach,@sp,@sl,@gia,@tg)"; 
     string sqlconvert = "select CONVERT(varchar(20),[Tg], 103) from Infosp1"; 
     SqlCommand cmd = new SqlCommand(sqlthem, con); 
     cmd.Parameters.AddWithValue("Khach", cbbtenkh.Text); 
     cmd.Parameters.AddWithValue("Sp", cbbmahang.Text); 
     cmd.Parameters.AddWithValue("Sl", cbbsl.Text); 
     cmd.Parameters.AddWithValue("Gia", cbbgia.Text); 
     cmd.Parameters.AddWithValue("Tg", datetg.Text);   
     cmd.ExecuteNonQuery(); 

它出現在.ExecuteNonQuery()

PLS

+1

使用正確的類型爲您的段米,請在參數實例中指定類型並添加正確類型的值。另請參見[最佳實踐 - 執行SQL語句](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)。 – Igor

+2

您確實應該確保參數的類型與數據庫中列的類型相匹配,並且應該首先在代碼中將字符串值解析爲DateTime。另請考慮[不使用'AddWithValue'](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) – juharr

+0

您能否顯示傳遞的示例值在'datetg'變量中? – nocodename

回答

0

如果你有你需要的參數轉換爲datetime日期時間字段。如果你想它進行轉換,因爲你沒有執行這個查詢,它不會工作:

string sqlconvert = "select CONVERT(varchar(20),[Tg], 103) from Infosp1"; 

您嘗試將沒有轉化的字符串,從而可能有不正確的格式。

cmd.Parameters.AddWithValue("Tg", datetg.Text); 

嘗試創建定義,像這樣它的數據類型的SQL參數:

cmd.Parameters.Add("Tg", SqlDbType.DateTime).Value = Convert.ToDateTime(datetg.Text); 

理想情況下,你應該有CultureInfo的地方來解析,而不是

...或致電轉化的sql腳本,像這樣:

string sqlthem = @"declare @dt datetime 
    select @dt = CONVERT(varchar(20), @tg, 103) 
    INSERT INTO Infosp1 VALUES (@khach,@sp,@sl,@gia,@dt)"; 
+0

感謝您的詳細解釋。我試過了,它出現這個異常:'附加信息:將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。' –

+0

嘗試使用 DateTime tg; TryParse(datetg.Text,tg out); cmd.Parameters.Add(「Tg」,SqlDbType.DateTime).Value = tg; – barzozwierz

+0

不錯。有效。非常感謝 !!! –