:: Не фоксом единым
DBNull.Value
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Смотрю на фрагмент кода:

bool depEndDateError = !DateTime.TryParse(depEnd, out depEndDate);
if (depEndDateError)
{
com.Parameters.Add("DEP_END", DBNull.Value);
}
else
{
com.Parameters.Add("DEP_END", depEndDate);
}

и - как то нравится он мне. Если эе попробовать написать:

com.Parameters.Add("DEP_END", depEndDateError? DBNull.Value:depEndDate);

ругается


Цитата:
CS0173 Не удается определить тип условного выражения, так как неявного преобразования между "System.DBNull" и "System.DateTime" не существует.

Вопрос - можно как сделать покрасивее?
Ratings: 0 negative/0 positive
Re: DBNull.Value
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Дописать явный каст в требуемый тип Кто есть com - какого типа это объект? SqlParameterCollection, OracleParameterCollection или вообще чего-то другого?
В любом случае метод Add(string, object) помечен как устаревший...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: DBNull.Value
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Дописать явный каст в требуемый тип

com.Parameters.Add("DEP_END", depEndDateError ? DBNull.Value: (object)depEndDate);

Так?

Igor Korolyov
Кто есть com - какого типа это объект? SqlParameterCollection, OracleParameterCollection или вообще чего-то другого?

Да, именно так.

using (OracleCommand com=


Igor Korolyov
В любом случае метод Add(string, object) помечен как устаревший...

Вот те на - уже устарел... Как и я

Если устарел - что же тогда использовать? На EF переходить?



Исправлено 1 раз(а). Последнее : S-type, 21.04.17 13:28
Ratings: 0 negative/0 positive
Re: DBNull.Value
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
com.Parameters.Add("DEP_END", depEndDateError ? DBNull.Value: (object)depEndDate);
Так?
Да.
S-type
Вот те на - уже устарел... Как и я Если устарел - что же тогда использовать? На EF переходить?
Метод .AddWithValue()

Там косяк с перегрузками - есть .Add(string, enum) и ежели гнать парамтером напрямую int, то будет выбрана эта перегрузка, а вовсе не с object. Вот чтобы избежать такой потенциальной проблемы перегрузку .Add(string, object) пометили obsolete, и добавили метод .AddWithValue(string, object).

Впрочем, вполне возможно (этого нельзя утверждать по одному лишь мелкому фрагменту) что данный код вообще не должен оперировать "конкретными" типами OracleCommand, OracleParameterCollection... А должен работать с абстрактными DBCommand, DBParameter, DBParameterCollection или, ещё лучше, с интерфейсами IDbCommand, IDataParameterCollection, IDbDataParameter...
А там "параметры" создаются и добавляются совсем по другой схеме - более явной и многословной...
IDbCommand.CreateParameter(), IDbCommand.Parameters.Add(), IDbDataParameter.Value =
Но я ещё раз уточню - не видя всего проекта нельзя сказать правильно или неправильно в данном месте применять "конкретный" класс жёстко привязанный к конкретному типу провайдера. М.б. это единственный вариант, если нужно использовать "специфические" типы/методы... Хотя DateTime, конечно, таковым не является. Но кто ж знает что там ещё имеется


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: DBNull.Value
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
S-type
com.Parameters.Add("DEP_END", depEndDateError ? DBNull.Value: (object)depEndDate);
Так?
Да.
Изменил программу, перекомпилировал - всё отлично работает!

Igor Korolyov
S-type
Если устарел - что же тогда использовать? На EF переходить?
Метод .AddWithValue()

Сейчас код примерно такой:


using Oracle.DataAccess.Client;
using (OracleCommand com=new OracleCommand("Insert ..."))
{
com.Parameters.Add("REFPOST_ID", refpost_id);
...

Не поулчается сделать

com.Parameters.AddWithValue("REFPOST_ID", refpost_id);

ругается:

Цитата:
Ошибка CS1061 'OracleParameterCollection" не содержит определения для "AddWithValue" и не удалось найти метод расширения "AddWithValue", принимающий тип "OracleParameterCollection" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

Заменил на

using Oracle.ManagedDataAccess.Client;

результат тот же.
Ratings: 0 negative/0 positive
Re: DBNull.Value
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Информация про "устарела" взята с msdn.microsoft.com? Сдаётся мне, что System.Data.OracleClient из System.Data.OracleClient.dll, и Oracle.ManagedDataAccess.Client из Oracle.ManagedDataAccess.dll - это несколько разные миры. И, надо смотреть в docs.oracle.com . Потому, заменить Add на AddWithValue не получится.

Но, главное - выражение уже сократил, код стал красивее. Спасибо.



Исправлено 2 раз(а). Последнее : S-type, 21.04.17 15:51
Ratings: 0 negative/0 positive
Re: DBNull.Value
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Значит в ODAC-е оракловцы ещё не сделали. В MS провайдерах во всех прописали это

Вот пример простейшего провайдеро-независимого кода.

К сожалению с ораклом это так просто не пройдёт - у них и типы "свои" порой приходится явно указывать (авто-преобразования косячат), да и на кой-то чёрт сделали параметры IDisposable-типами... В других провайдерах этого нет, и сами базовые типы и интерфейсы не предусматривают такой реализации... Индусы кодили, одно слово


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика