Неуспешно преобразуване при преобразуване на дата и час от символен низ

Опитвам се да предам параметри от Windows приложение към съхранена процедура. има два параметъра '@dt' & '@dt2', които получават стойност от datetimepickers. всеки път, когато изпълня съхранената процедура, тя излиза с грешката, казваща "Преобразуването е неуспешно при преобразуване на дата и час от символен низ."

След като изпълня заявката, искам да я покажа в datagridview.

не мога да разбера проблема... ето моята процедура и код

Съхранена процедура

ALTER proc [dbo].[deepak_proc]

( @dt дата и час, @dt2 дата и час )

AS

декларирайте @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,'')

задайте @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 = нов SqlConnection(); con.ConnectionString = @"Източник на данни=.\SQLEXPRESS;Първоначален каталог=test_db;Потребителски идентификатор=потребител;Парола=парола";

     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 = нова DataTable();

cmd.ExecuteNonQuery();

sda.Fill(dt);

dataGridView1.DataSource = dt;

con.Close();


person humorousdragon    schedule 23.03.2013    source източник


Отговори (4)


Използвайте 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
person Aleksandr Fedorenko    schedule 23.03.2013
comment
@alexander...няма никаква разлика...грешката е все същата.. :/ - person humorousdragon; 23.03.2013
comment
@alexander...добре поне параметрите бяха преминати.. :) но резултатът не е според очакванията...така че ще работим още малко по това нещо.. :/ благодаря за помощта... :) - person humorousdragon; 23.03.2013

Опитайте се да предадете датата и часа във формат yyyy-MM-dd, който е стандартен.

person Haedrian    schedule 23.03.2013
comment
@Haedrian... използвах формата mm/dd/yyyy както в приложението, така и в края на sqlserver. Ще има ли разлика, ако сменя формата на датата и в двата края? - person humorousdragon; 23.03.2013
comment
Не е необходимо да променяте формата в края на SQL. Но гггг-ММ-дд е стандартен формат, независим от културата, така че ще работи независимо от настройките за култура за дата/час. Просто предполагам, че има някои двусмислени проблеми при анализирането на MM/dd/yyyy. - person Haedrian; 23.03.2013
comment
Тук говоря за вътрешна употреба. Ако го форматирате в MM/dd/yyyy, за да видят потребителите ви, всичко е наред. - person Haedrian; 23.03.2013
comment
Можете ли да го дебъгвате, за да видите какъв низ ТОЧНО му подавате? Също така това е дата или дата и SQL страна? - person Haedrian; 23.03.2013
comment
@haedrian...Неговият datetime от двете страни..но го конвертирам в date, както можете да видите в заявката.. грешката е при изпълнение на заявката..но как да проверя точния низ, който предавам.. - person humorousdragon; 23.03.2013
comment
Поставете точка на прекъсване точно преди да предадете параметъра, след което използвайте watch, за да видите стойността. - person Haedrian; 23.03.2013
comment
@haedrian... предадените параметри са във формат гггг/мм/дд.. Още нещо. когато изпълня само заявката в моя код с параметрите '@dt' & '@dt2', тогава резултатите са според очакванията. но не можах да разбера проблема със съхранената процедура.. - person humorousdragon; 23.03.2013

Звучи така, сякаш получавате низово представяне на дата от DateTimepicker в клиента. Когато получите стойността от DateTimepicker, преобразувайте я в добросъвестен CLR Date обект от страна на клиента. Не предавайте низове към задния край, ако има тип CLR, който съответства на типа SQL. Изберете подходящия тип параметър, когато изграждате командния обект от страна на клиента.

По принцип запазете датите като дати и ги преобразувайте в низове само когато трябва да ги покажете за човешки очи.

Редактиране: Например:

        SqlClient.SqlParameter  p0;

        p0.ParameterName = "@startdate";
        p0.SqlDbType = SqlDbType.DateTime;
        p0.Value =  < a datetime object, not a string>  
        p0.Direction = ParameterDirection.Input;

След това добавете параметъра към колекцията Parameters.

person Tim    schedule 23.03.2013
comment
@tim...пробвано и пак същата грешка... System.DateTime mydate = default(System.DateTime); mydate = dateTimePicker1.Value; System.DateTime mydate1 = подразбиране (System.DateTime); mydate1 = dateTimePicker2.Value; създаде тези две променливи за дата и час и ги присвои на '@dt' & '@dt2'.. все същата грешка.. - person humorousdragon; 23.03.2013
comment
може да правя нещо нередно тук...моля, насочете ме в правилната посока..благодаря за помощта.. - person humorousdragon; 23.03.2013
comment
Вие предавате низове към sp. Искате да преминете дата и час. - person Tim; 23.03.2013
comment
@tim... в последната редакция, както ти предложи, предадох стойностите директно без никакво преобразуване.. пропуснах ли нещо или правя грешка? - person humorousdragon; 23.03.2013
comment
Не, не си. Вие правите toString() - person Tim; 23.03.2013

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

person user2202158    schedule 23.03.2013