2016-03-15 194 views
-1

我試圖從Access數據庫中插入一些值到SQL Server中,但是因爲名爲colz的datetime列失敗。在SQL Server中,我有一個日期時間列(colz),並且在訪問時它也是日期時間(row [「c」])。插入失敗訪問sql

數據類型和連接沒有錯誤。像1.mm.yyyy這樣的日期沒有問題。問題在於像10到31.mm.yyyy這樣的日期。異常說

將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。

當我與操作#例外嘗試說

轉換失敗時從字符串

我的代碼轉換日期和/或時間#就像「#」 .. .....「#'

int i, k = dt.Rows.Count; 
for (i = 0; i < k; i++) { 
    insertToSql = insertToSql + "insert into myTable(colx,coly,colz) values('" 
     + dt.Rows[i]["a"].ToString().Trim() + "','" 
     + dt.Rows[i]["b"].ToString().Trim() + "','" 
     + dt.Rows[i]["c"].ToString().Trim() + "')"; 
} 
+0

也許在運行之前將'insertToSql'字符串寫入某個日誌文件中,以便您可以查看錯誤。 –

+0

這就是您使用參數的原因。 – LarsTech

+0

你有沒有去掉#號。你需要它在訪問 – logixologist

回答

4

你有bad habits to kick : choosing the wrong data type

你應該從未存儲區DateTime值作爲一個字符串。如果您的dt.Rows[i]["c"]已經 a DateTime,您應該明確地將它們轉換爲DateTime,並使用parameterized queriesOleDbType.Date參數類型完全發送它們。

using(var connection = new OleDbConnection(conString)) 
using(var cmd = connection.CreateCommand()) 
{ 
    cmd.CommandText = "insert into myTable(colx,coly,colz) values(?, ?, ?)"; 
    cmd.Parameters.Add("?", OleDbType.VarWChar).Value = dt.Rows[i]["a"].ToString().Trim(); 
    cmd.Parameters.Add("?", OleDbType.VarWChar).Value = dt.Rows[i]["b"].ToString().Trim(); 
    cmd.Parameters.Add("?", OleDbType.Date).Value = (DateTime)dt.Rows[i]["c"]; 

    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
+0

我不把datetime存儲爲一個字符串。在select查詢中,我使用了斷點,並看到它來自datetime.but在命令中它失敗了10-31天。 – aRRoyo

+0

它工作successfull.Thanks Soner.In迭代我寫你喜歡的代碼和沒有問題的參數。只改變「OleDbType」爲「SqlDbType」,它是平等的 – aRRoyo

1

您需要在YYYY-MM-DD中格式化日期字段以保持一致性。日期解析器在月份編號爲10或更高時會混淆月份和日期值。

10-12-2016可能會出錯,而2016-10-12不會。

+0

在我的SQL列它已經格式化如2016-10-12 00:00:00.000您的意思是訪問列? – aRRoyo