ama*_*eur 32 sql sql-server service sqlexception
我有一个从C#windows服务运行的以下内联SQL:
UPDATE table_name SET
status_cd = '2',
sdate = CAST('03/28/2011 18:03:40' AS DATETIME),
bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255',
cnt = 1,
attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME)
WHERE id = '1855'
Run Code Online (Sandbox Code Playgroud)
当我从应用程序内对SQL Server数据库运行时,我收到以下错误:
System.Data.SqlClient.SqlException:将varchar数据类型转换为datetime数据类型会导致超出范围的值.该语句已终止.
但是,如果我从SQL Management Studio中获取SQL并运行它,它将运行没有问题.
可能导致此问题的任何想法?
Mar*_*ith 64
根据登录语言解释不明确的日期格式.这有效
set dateformat mdy
select CAST('03/28/2011 18:03:40' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
事实并非如此
set dateformat dmy
select CAST('03/28/2011 18:03:40' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
如果使用具有正确数据类型的参数化查询,则可以避免这些问题.您还可以使用明确的 "未分离"格式yyyyMMdd hh:mm:ss
Ric*_*iwi 13
但是,如果我从sql管理工作室获取sql并运行它,它将运行没有问题.
如果您可以自由,请将服务帐户更改为您自己的登录名,这将继承您的语言/区域权限.
这个问题的真正症结在于:
我使用以下转换 - > date.Value.ToString("MM/dd/yyyy HH:mm:ss")
请开始使用参数化查询,以便将来不会遇到这些问题.它也更强大,可预测和最佳实践.
我认为在C#和SQL之间使用日期的最佳方法当然是使用参数化查询,并且始终使用C#上的DateTime对象和它提供的ToString()格式化选项.
您最好在SQL Server上使用日期之前执行set datetime <format>(这里有MSDN上的set dateformat说明),这样您就不会遇到麻烦,例如set datetime ymd.您只需要为每个连接执行一次,因为它在打开时保留了格式,因此一个好的做法是在打开与数据库的连接后立即执行此操作.
然后,您可以随时使用'yyyy-MM-dd HH:mm:ss:ffff'格式.
要将DateTime对象传递给参数化查询,可以使用DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff').
要在C#上解析奇怪的格式化日期,您可以使用DateTime.ParseExact()方法,您可以选择准确指定输入格式:DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture).在这里,你有MSDN上的DateTime.ParseExact()解释)
| 归档时间: |
|
| 查看次数: |
202313 次 |
| 最近记录: |