从字符串转换datetime时转换失败

时间:2013-03-23 09:30:33

标签: c# sql stored-procedures dynamic-sql windows-applications

我正在尝试将参数从Windows应用程序传递到存储过程。 有两个参数'@dt'& '@ dt2'从datetimepickers获取价值。 每当我执行存储过程时,它会出现错误,指出“从字符串转换日期时转换失败。”

执行查询后,我想在datagridview中显示它。

我无法弄清楚问题.. 这是我的程序和代码

存储过程

  

ALTER proc [dbo]。[deepak_proc]

     

(@ dt datetime,@ dt2 datetime)

     

AS

     

声明@cols AS NVARCHAR(MAX)

     

声明@query AS 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,'')
     

设置@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], 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 = @“Data Source =。\ SQLEXPRESS; Initial Catalog = test_db; User ID = user; Password = password”;

     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();

5 个答案:

答案 0 :(得分:0)

尝试将日期时间传递给标准的yyyy-MM-dd格式。

答案 1 :(得分:0)

听起来好像是从客户端的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集合中。

答案 2 :(得分:0)

使用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

答案 3 :(得分:0)

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;

答案 4 :(得分:0)

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);