2016-01-28 188 views
1

從我的程序到SQL中的存儲過程的日期有問題。從VB.NET將Nvarchar數據類型轉換爲datetime時出錯

我的程序從Excel電子表格需要一個日期並分析它是這樣:

  tempDate = Date.FromOADate(exWS.Cells(exRow, myMatchedColumns(2)).value) 
      Dim format() = {"dd/MM/yyyy", "dd-MM-yyyy", "yyyy-MM-dd"} 
      dueDate = Date.ParseExact(tempDate, format, 
      System.Globalization.DateTimeFormatInfo.InvariantInfo, 
      Globalization.DateTimeStyles.None) 

的dueDate爲「DATE」變量,因此我假設在這一點上「的dueDate」是一個普遍的Date對象。我認爲這是分析英語區域日期和波蘭語日期的最佳方式,因爲這將在波蘭機器上使用。

然而,發送值時我的存儲過程:

 mySQLString = "EXEC bsp.PartPrice_sp " & _ 
      "'" & dueDate & "', " & _ 
      "'" & myPartID & "', " & _ 
      "'" & currency & "'" 

英語發送EXEC bsp.PartPrice_sp '01/09/2015', 'L555', 'USD'返回的價格。

波蘭發送EXEC bsp.PartPrice_sp '2015-09-01', 'L555', 'USD'這將產生錯誤:

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

我理解錯誤,但存儲過程的下一次執行,波蘭機發送2015-09-10其返回的價格罰款。我猜測自2015-10-09仍然在範圍內,但有趣的是,它返回了2015年9月10日的正確價格。

儘管如此,我仍在努力尋找以英語和波蘭語執行存儲過程的通用方式。任何幫助你正確地解析日期,這也使SQL開心會很棒。

謝謝。

用VB.NET編寫的程序。

P.S如果我更改了存儲過程中@duedate從nvarchar的爲datetime,我得到一個:

Error converting data type varchar to datetime.

錯誤,我猜是從英文格式。非常感謝。

+0

嘗試'交貨期= duedate.ToString( 「d」,System.Globalization.CultureInfo.CreateSpecificCulture( 「EN-US」))' –

+0

感謝您的評論,它看起來不錯,除了ToString函數需要一個整數字符串,不接受第二個參數?我得到一個太多的參數錯誤。謝謝。 – MikeS

+0

我沒有得到你.. !!(_ToString函數接受一個不是字符串的整數並且不接受第二個參數?_澄清這一點),並且該方法在沒有任何錯誤的情況下工作,參見[this](https://dotnetfiddle.net/QMakBO)並嘗試這個'duedate =格式(duedate,「dd/MM/yyyy」)' –

回答

0

內聯非參數化查詢中的日期格式是那些可以驅動我的經驗的事情之一。

所以 -

  1. 如果在所有可能的問題與SqlParameters的集合,你添加實際日期類型的變量的.Net成一個SqlCommand。更安全。
  2. 如果您確實必須保留內聯SQL,從不以區域化日期格式傳遞。他們因爲奇怪的原因可靠地休息理想情況下,發送服務器YYYY-MM-DD hh:mm:ss.ms,但要安全地通過集中式功能運行 - 部分比確保在所有位置正確調用正確的.ToString()格式更容易。部分我過去偶爾有服務器抱怨即使在這種格式。
相關問題