从字符串转换日期时间时转换失败
Posted
技术标签:
【中文标题】从字符串转换日期时间时转换失败【英文标题】:Conversion failed when converting datetime from character string 【发布时间】:2013-03-13 04:29:39 【问题描述】:我正在尝试将参数从 Windows 应用程序传递到存储过程。 有两个参数 '@dt' 和 '@dt2' 从 datetimepickers 中获取值。 每当我执行存储过程时,都会出现错误提示“。”
执行查询后,我想在 datagridview 中显示它。
我无法找出问题所在.. 这是我的程序和代码
存储过程
ALTER proc [dbo].[deepak_proc]
(@dt 日期时间,@dt2 日期时间)
作为
将@cols 声明为 NVARCHAR(MAX)
将@query 声明为 NVARCHAR(MAX)
选择@cols =
STUFF((SELECT ',' + QUOTENAME(date +'_'+Logname) from ( select K_date, convert(char(10),K_date, 101) date, LogName from kq_report_analyze cross apply ( select 'In' LogName union all select 'Out' ) l ) s group by convert(char(10), K_date, 112), date, Logname order by convert(char(10), K_date, 112) FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
设置@查询
= 'SELECT empid, name, status, '+@cols+' FROM (SELECT empid, name, status, doortime, date + "_" + col AS col_names FROM (SELECT k_userid AS [empid], K_Name AS name, k_description1 as [status], K_WorktimeUp1 AS [IN], K_WorktimeDown1 AS OUT, CONVERT(char(10), K_Date, 101) AS date FROM dbo.kq_report_analyze WHERE (K_Date BETWEEN '+@dt+' AND '+@dt2+') GROUP BY K_UserID, K_Name, k_description1, K_Date, K_WorktimeUp1, K_WorktimeDown1) src UNPIVOT (doortime FOR col IN ([IN], [OUT])) unpiv) p PIVOT (max(doortime) FOR col_names IN ('+@cols+')) piv;'
执行(@query)
下面的代码在按钮点击
SqlConnection con = new SqlConnection(); con.ConnectionString = @"数据源=.\SQLEXPRESS;初始目录=test_db;用户ID=用户;密码=密码";
con.Open(); SqlCommand cmd = new SqlCommand("deepak_proc", con); cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dt", SqlDbType.DateTime).Value = dateTimePicker1.Value.ToString("MM/dd/yyyy");
cmd.Parameters.Add("@dt2", SqlDbType.DateTime).Value = dateTimePicker2.Value.ToString("MM/dd/yyyy");
DataTable dt = new DataTable();
cmd.ExecuteNonQuery();
sda.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();
【问题讨论】:
【参考方案1】:使用sp_executesql系统存储过程并将你的变量作为参数
SET @query
= 'SELECT empid, name, status, ' + @cols + '
FROM (SELECT empid, name, status, doortime, date + ''_'' + col AS col_names
FROM (SELECT k_userid AS [empid], K_Name AS name,
k_description1 as [status], K_WorktimeUp1 AS [IN],
ktimeDown1 AS OUT, CONVERT(char(10), K_Date, 101) AS date
FROM dbo.kq_report_analyze
WHERE (K_Date BETWEEN @dt AND @dt2)
GROUP BY K_UserID, K_Name, k_description1, K_Date, K_WorktimeUp1,
K_WorktimeDown1) src
UNPIVOT (doortime FOR col IN ([IN], [OUT])) unpiv) p
PIVOT (max(doortime) FOR col_names IN (' + @cols + ')) piv;'
EXEC sp_executesql @query, N'@dt datetime, @dt2 datetime', @dt, @dt2
【讨论】:
@alexander...dint 有所不同...错误仍然相同.. :/ @alexander...好吧至少参数通过了.. :) 但结果与预期不符...所以在这件事上会工作更长时间.. :/ 谢谢你的帮助... :)【参考方案2】:尝试将日期时间传递为标准的 yyyy-MM-dd 格式。
【讨论】:
@Haedrian... 我一直在应用程序和 sqlserver 端使用 mm/dd/yyyy 格式。如果我将两端的日期格式都更改一下,会有什么不同吗? 你不需要在SQL端改变格式。但是 yyyy-MM-dd 是一种标准的独立于文化的格式,因此无论日期/时间文化设置如何,它都可以工作。我只是假设它在解析 MM/dd/yyyy 时存在一些模棱两可的问题。 这里说的是内部使用。如果您将其格式化为 MM/dd/yyyy 以便您的用户可以看到它。 你能调试它看看你到底传递了什么字符串吗?还是日期或日期时间 SQL 端? @haedrian...它的日期时间在双方..但我将其转换为日期,正如您在查询中看到的那样..错误是在执行查询..但我如何检查我传递的确切字符串..【参考方案3】:听起来好像您从客户端中的 DateTimepicker 获取日期的字符串表示形式。当您从 DateTimepicker 获取值时,将其转换为真正的 CLR Date 对象客户端。如果存在映射到 SQL 类型的 CLR 类型,则不要将字符串传递到后端。在构建命令对象客户端时选择合适的参数类型。
一般情况下,将日期保留为日期,并仅在需要为人眼显示时将其转换为字符串。
编辑: 例如:
SqlClient.SqlParameter p0;
p0.ParameterName = "@startdate";
p0.SqlDbType = SqlDbType.DateTime;
p0.Value = < a datetime object, not a string>
p0.Direction = ParameterDirection.Input;
然后将参数添加到Parameters集合中。
【讨论】:
@tim...试过了,还是一样的错误... System.DateTime mydate = default(System.DateTime); mydate = dateTimePicker1.Value; System.DateTime mydate1 = 默认(System.DateTime); mydate1 = dateTimePicker2.Value;创建了这两个日期时间变量并分配给'@dt'和'@dt2'..仍然是同样的错误.. 可能是我在这里做错了什么...请指导我正确的方向..感谢您的帮助.. 您正在将字符串传递给 sp。你想通过日期时间。 @tim... 在最后一次编辑中,正如你所建议的那样,我确实直接传递了值而没有进行任何转换。我错过了什么,还是我做错了? 不,你没有。你在做 toString()【参考方案4】:DateTime myDateTime = Convert.ToDateTime(dateTimePicker1.Value);
cmd.Parameters.Add(new mysql.Data.MySqlClient.MySqlParameter
("@myDateTime", MySql.Data.MySqlClient.MySqlDbType.DateTime));
cmd.Parameters["@myDateTime"].Value = myDateTime;
【讨论】:
【参考方案5】:cmd.Parameters.Add("@dt", SqlDbType.DateTime).Value =DateTime.ParseExact(dateTimePicker1.Value.Tostring(),null);
cmd.Parameters.Add("@dt2", SqlDbType.DateTime).Value =DateTime.ParseExact(dateTimePicker2.Value.Tostring(),null);
【讨论】:
以上是关于从字符串转换日期时间时转换失败的主要内容,如果未能解决你的问题,请参考以下文章