从 C# 中的字符串 SQL 转换日期和/或时间时转换失败
Posted
技术标签:
【中文标题】从 C# 中的字符串 SQL 转换日期和/或时间时转换失败【英文标题】:Conversion failed when converting date and/or time from character string SQL in c# 【发布时间】:2016-06-16 05:41:16 【问题描述】:当我比较日期时出现此错误。
sql查询命令:
Select * from processTBL WHERE is=2016144 and date between '10/06/2016' and '15/06/2016'
该命令有效,但是当将数据填充到 DateTabe
时出现转换错误。
这是我的 c# 方法;
public DataGridView hesapOzeti(string command)
DataGridView gdview = new DataGridView();
if (connection.State == ConnectionState.Closed)
connection.Open();
SqlCommand komut = new SqlCommand(command, connection);
SqlDataAdapter da = new SqlDataAdapter(komut);
DataTable dt = new DataTable();
da.Fill(dt);
connection.Close();
gdview.DataSource = dt;
return gdview;
错误:
【问题讨论】:
***.com/questions/21253566/… 【参考方案1】:快速解决方法是以明确的格式发送日期,以便正确解释您的格式:
Select * from processTBL WHERE is=2016144 and date between '20160601' and '20160616'
错误来自于 15 被认为是一个月,因此日期无法解析。
正确的做法是使用参数化查询:
command.Parameters.AddWithValue("@is", 2016144);
command.Parameters.AddWithValue("@FromDate", new DateTime(2016, 06, 10));
command.Parameters.AddWithValue("@ToDate", new DateTime(2016, 06, 15));
您的查询变为:
Select * from processTBL WHERE is = @is and date between @FromDate and @ToDate
一般来说,您应该始终尝试使用参数化查询来避免此类错误并防止 SQL 注入。
【讨论】:
一路参数化is
。另外,请阅读Can we stop using AddWithValue() already?
谢谢兄弟这是工作我改变这个command.Parameters.AddWithValue("@FromDate", DateTime.Parse(fromDate))
【参考方案2】:
文字的日期格式取决于语言环境(特别是DATEFORMAT
)。日期时间的 BOL 页面列出了区域设置和非区域设置特定格式
https://msdn.microsoft.com/en-AU/library/ms187819.aspx
理想情况下,您应该使用 ISO 8601 格式 - YYYY-MM-DDThh:mm:ss[.mmm]
或
YYYYMMDD[ hh:mm:ss[.mmm]]
在您的代码中,尝试date between '20160610' and '20160615'
【讨论】:
以上是关于从 C# 中的字符串 SQL 转换日期和/或时间时转换失败的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中将十六进制值从 SQL Server 转换为日期时间
转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV