Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Есть некая процедура, которая принимает в качестве параметров даты, которые могут быть равны null. Дата передается через asp.net приложение в формате '2011-05-04 00:00:00' (4 мая 2011).

При выполнении этой процедуры через management studio в окне sql запроса данные возращаются корректно. При выполнении через asp.net данные не возращаются. Причем, sql процедура и параметры одни и теже: когда выполнялось asp.net приложение я скопировал тот запрос (вернее, процедуру с параметрами), что был в профайлере и получил данные.

Таким образом, при выполнении одной и той же процедуры через asp.net и management studio возращаются данные: в первом случае их нет, во втором они есть и они корректные.

В чем причина? Может виновата локализация: в самой management studio и контексте asp.net разные локали, что приводит к тому, что дата интерпретируюется по-разному.


sql server 2008 r2
13 май 11, 10:20    [10645495]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/faq/faq_topic.aspx?fid=109
13 май 11, 10:24    [10645520]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Darooma,
более чем уверен , что в процедуру параметры даты вы передаёте как строку. Запустите профайлер и вы всё увидите. Ну и код вызова хп тоже покажите.
13 май 11, 10:26    [10645536]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Ken@t
Darooma,
более чем уверен , что в процедуру параметры даты вы передаёте как строку. Запустите профайлер и вы всё увидите. Ну и код вызова хп тоже покажите.

как datetime
13 май 11, 10:32    [10645596]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Ken@t
Darooma,
более чем уверен , что в процедуру параметры даты вы передаёте как строку. Запустите профайлер и вы всё увидите. Ну и код вызова хп тоже покажите.

профайлер я уже запускал.

как определить, какую локаль использует сама студия, а какую asp.net приложение?
13 май 11, 10:33    [10645606]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Darooma
как определить, какую локаль использует сама студия, а какую asp.net приложение?

вы удивитесь, но опять таки из профайлера. Код asp и вызов в профайлере увидим или нет ?
13 май 11, 10:38    [10645639]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Ken@t
Darooma
как определить, какую локаль использует сама студия, а какую asp.net приложение?

вы удивитесь, но опять таки из профайлера. Код asp и вызов в профайлере увидим или нет ?


 public static List<BEInvoice> Get(int pageIndex, int pageSize, Guid customerId, Guid? contractB2CId,
            bool isArchive, string invoiceName, string complectionReportName,
            DateTime? invoiceDateFrom, DateTime? invoiceDateTo, out int rowsCount) {

            rowsCount = 0;
            SqlParameter outputParameter = CreateParameter("RowsCount", rowsCount, false, true);
            var command = BuildCommand("[dbo].[PrInvoicesForB2CGet]"

                                       , CreateParameter("PageIndex", pageIndex, false)
                                       , CreateParameter("PageSize", pageSize, false)
                                       , CreateParameter("ContractB2CId", contractB2CId, true)
                                       , CreateParameter("CustomerId", customerId, false)
                                       , CreateParameter("IsArchive", isArchive, false)


                                       , CreateParameter("InvoceName", invoiceName, true)
                                       , CreateParameter("CompletionReportName", complectionReportName, true)
                                       , CreateParameter("InvoiceDateFrom", invoiceDateFrom, true)
                                       , CreateParameter("InvoiceDateTo", invoiceDateTo, true)
                                       , outputParameter
                    );
//....................................................

профайлер
declare @p8 int
set @p8=0
exec [dbo].[PrInvoicesForB2CGet] @PageIndex=1,@PageSize=10,@ContractB2CId='6369AF61-3191-4D0B-A6FE-73CA4848896E',@CustomerId='52479C96-0485-413A-AB7B-1C1A226D7D19',@IsArchive=0,@InvoiceDateFrom='2011-05-04 00:00:00',@InvoiceDateTo='2011-05-05 00:00:00',@RowsCount=@p8 output
select @p8
13 май 11, 10:45    [10645706]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Darooma,

Зачёт не сдан.
13 май 11, 10:47    [10645732]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Ken@t
Darooma,

Зачёт не сдан.

это не зачет
13 май 11, 10:53    [10645788]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
tpg
https://www.sql.ru/faq/faq_topic.aspx?fid=109

автор
Задавайте дату в виде строки 'YYYYMMDD' (без разделителей) или дату-время 'YYYYMMDD HH:MM:SS'. Фича в том, что в указанном формате SQL-сервер всегда однозначно интерпретирует дату, независимо от региональных и прочих настроек. Например, " ... WHERE SomeDateField<'20010302' ... ". Эта дата при любом раскладе будет интерпретирована сервером как 2 марта 2001 года.


А вот это интересно. Параметр sql процедуры должен быть в этом случае nvarchar или datetime?
13 май 11, 11:11    [10645942]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Darooma,

ну если поля detetime.... то и параметр надо делать datetime
13 май 11, 11:15    [10645983]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Darooma
Ken@t
Darooma,

Зачёт не сдан.

это не зачет

Стесняюсь спросить тогда, что это.

При создании параметра - указать тип данных, для начала, обработки исключений нет и так далее.
13 май 11, 11:20    [10646040]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Maxx,
Я имею ввиду, что если проца принимает параметр datetime, а ей передать эту дату в формате 'YYYYMMDD' (без разделителей) или дату-время 'YYYYMMDD HH:MM:SS', то будет ли верно интепретирована? То есть именно как дата (тип datetime) в таком формате, а не как nvarchar, которая содержит дату?
13 май 11, 11:20    [10646057]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
..... мда... даже и не знаю что ответить.. вы дату которую передаете - где вообще берете то ????
13 май 11, 11:32    [10646167]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Darooma
Maxx,
Я имею ввиду, что если проца принимает параметр datetime, а ей передать эту дату в формате 'YYYYMMDD' (без разделителей) или дату-время 'YYYYMMDD HH:MM:SS', то будет ли верно интепретирована? То есть именно как дата (тип datetime) в таком формате, а не как nvarchar, которая содержит дату?
Если параметр процедуры datetime, и переменная тоже в формате datetime, то всё должно быть правильно.
Только у вас неспецифицирован тип параметра при вызове CreateParameter, дело видимо в этом - происходит двойное преобразование datetime-строка-datetime

Напишите, какой метод CreateParameter вы использовали (полное имя).
13 май 11, 11:51    [10646358]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
alexeyvg
Darooma
Maxx,
Я имею ввиду, что если проца принимает параметр datetime, а ей передать эту дату в формате 'YYYYMMDD' (без разделителей) или дату-время 'YYYYMMDD HH:MM:SS', то будет ли верно интепретирована? То есть именно как дата (тип datetime) в таком формате, а не как nvarchar, которая содержит дату?
Если параметр процедуры datetime, и переменная тоже в формате datetime, то всё должно быть правильно.
Только у вас неспецифицирован тип параметра при вызове CreateParameter, дело видимо в этом - происходит двойное преобразование datetime-строка-datetime

Напишите, какой метод CreateParameter вы использовали (полное имя).


 SqlParameter CreateParameter(string name, object value, bool skipEmpty, bool isOutput =false)
        {
            i 
 
            var param = new SqlParameter
                            {
                                ParameterName = string.Format("@{0}", name),
                                Direction = isOutput == false ? ParameterDirection.Input : ParameterDirection.Output,
                                Value = value ?? DBNull.Value,
                                SourceColumn = name
                            };

            if (param.DbType == DbType.DateTime)
            {
                DateTime date = DateTime.Parse(param.Value.ToString());
                param.Value = date.ToString("yyyyMMdd");
            }
            return param;
        }
После этого параметр param.DbType == string или nvarchar. Хотя к ошибке это не приводит.
13 май 11, 13:20    [10647117]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
и зачем ? передавайте прямо datetime...зачем к стрингу приводить то ?
13 май 11, 13:28    [10647205]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Darooma
alexeyvg
Если параметр процедуры datetime, и переменная тоже в формате datetime, то всё должно быть правильно.
Только у вас неспецифицирован тип параметра при вызове CreateParameter, дело видимо в этом - происходит двойное преобразование datetime-строка-datetime

Напишите, какой метод CreateParameter вы использовали (полное имя).


 SqlParameter CreateParameter(string name, object value, bool skipEmpty, bool isOutput =false)
        {
            var param = new SqlParameter
                            {
                                ParameterName = string.Format("@{0}", name),
                                Direction = isOutput == false ? ParameterDirection.Input : ParameterDirection.Output,
                                Value = value ?? DBNull.Value,
                                SourceColumn = name
                            };

            if (param.DbType == DbType.DateTime)
            {
                DateTime date = DateTime.Parse(param.Value.ToString());
                param.Value = date.ToString("yyyyMMdd");
            }
            return param;
        }
После этого параметр param.DbType == string или nvarchar. Хотя к ошибке это не приводит.
Ну вот, а писали:
Darooma
Ken@t
Darooma,
более чем уверен , что в процедуру параметры даты вы передаёте как строку.
как datetime
13 май 11, 14:13    [10647705]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Maxx
и зачем ? передавайте прямо datetime...зачем к стрингу приводить то ?

мне нужно привести к виду yyyyMMdd.
13 май 11, 16:33    [10649238]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Darooma,

еее..да зачем..
еще раз у вас дата откуда береться,если с какго нить контрола ,то и настройте его что там была дата в нужном формате и пердавайте ее как тип датавремя.....что вы заниматетесь постройкой велосипедов - ну честное слово
13 май 11, 16:39    [10649304]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62908
Darooma
Maxx
и зачем ? передавайте прямо datetime...зачем к стрингу приводить то ?

мне нужно привести к виду yyyyMMdd.

Не надо, надо передавать как дату
13 май 11, 16:56    [10649468]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Anatoly Podgoretsky
Darooma
пропущено...

мне нужно привести к виду yyyyMMdd.

Не надо, надо передавать как дату

мне нужно привести к виду yyyyMMdd
13 май 11, 17:01    [10649501]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Darooma,

да с какого суахили ????
13 май 11, 17:10    [10649560]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Darooma
Member

Откуда:
Сообщений: 758
Maxx,

Надо.
13 май 11, 17:11    [10649568]     Ответить | Цитировать Сообщить модератору
 Re: Локализация что-ли?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну..... удачи
13 май 11, 17:13    [10649579]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить