2016-01-28 155 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()格式更容易。部分我过去偶尔有服务器抱怨即使在这种格式。
相关问题