Ошибка преобразования при преобразовании даты и времени из символьной строки

Я пытаюсь передать параметры из приложения 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 = новый SqlConnection (); con.ConnectionString = @ "Источник данных =. \ SQLEXPRESS; Исходный каталог = test_db; ID пользователя = user; Пароль = пароль";

     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 ("ММ / дд / гггг");

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 ... dint имеет значение ... ошибка все та же ..: / - person humorousdragon; 23.03.2013
comment
@alexander ... ну, по крайней мере, параметры были переданы .. :) но результат не соответствует ожидаемому ... так что буду работать над этой штукой еще немного ..: / спасибо за помощь ... :) - person humorousdragon; 23.03.2013

Попробуйте передать дату и время в стандартном формате гггг-мм-дд.

person Haedrian    schedule 23.03.2013
comment
@Haedrian ... я использовал формат mm / dd / yyyy как на стороне приложения, так и на стороне sqlserver. Будет ли разница, если я изменю формат даты на обоих концах? - person humorousdragon; 23.03.2013
comment
Вам не нужно изменять формат на стороне SQL. Но yyyy-MM-dd - это стандартный формат, не зависящий от языка и региональных параметров, поэтому он будет работать независимо от настроек культуры даты / времени. Я просто предполагаю, что у него есть некоторые неоднозначные проблемы с синтаксическим анализом 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 ... Его дата и время с обеих сторон .. но я конвертирую его в дату, как вы можете видеть в запросе .. ошибка в выполнении запроса .. но как мне проверить точную строку, которую я передаю .. - person humorousdragon; 23.03.2013
comment
Установите точку останова прямо перед передачей параметра, затем используйте часы, чтобы увидеть значение. - person Haedrian; 23.03.2013
comment
@haedrian ... параметры передаются в формате yyyy / mm / dd .. Еще одна вещь. когда я выполняю только запрос в моем коде с параметрами '@dt' и '@ dt2', результаты будут такими, как ожидалось. но я не смог выяснить проблему с хранимой процедурой .. - person humorousdragon; 23.03.2013

Похоже, вы получаете строковое представление даты из DateTimepicker в клиенте. Получив значение от DateTimepicker, преобразуйте его в добросовестный объект Date CLR на стороне клиента. Не передавайте строки в серверную часть, если существует тип 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; создал эти две переменные datetime и присвоил им '@dt' и '@ dt2' .. все та же ошибка .. - person humorousdragon; 23.03.2013
comment
может быть я здесь что-то делаю не так ... пожалуйста, направьте меня в правильном направлении .. спасибо за помощь .. - person humorousdragon; 23.03.2013
comment
Вы передаете строки sp. Вы хотите передать datetime. - 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