Страница 1 из 1

Истоник данных DataTable и nullable поля

Добавлено: 04 фев 2016, 11:26
rvaider
Добрый день.

В качестве источника данных имеется datatable, в котором могут быть null значения. Соответственно в отчете хочется их видеть как пустые.

Пример для воспроизведения:

Код: Выделить всё

            
var d = new DataTable("test");
var dc = new DataColumn("x", typeof (decimal));
dc.AllowDBNull = true;
d.Columns.Add(dc);
d.Rows.Add(1);
d.Rows.Add(DBNull.Value);

var report = new StiReport();
report.RegData(d);
report.Design();
При добавлении поля в отчет второе значение будет 0, а не пустое.
При этом отчет определяет тип поля как decimal. Если сменить его в дизайнере на Nullable<decimal>, то все отображается как нужно.
Однако при повторном открытии дизайнера (либо после вызова report.Dictionary.Synchronize()) тип поля снова меняется на decimal.

Можно ли сделать чтобы автоматически выставлялся тип поля Nullable<> для колонок datatable с установленным свойством AllowDbNull?

Re: Истоник данных DataTable и nullable поля

Добавлено: 08 фев 2016, 15:15
Aleksey
Здравствуйте,

Извините за задержку с ответом.
Необходимо дополнительное время для анализа проблемы.

Спасибо.

Re: Истоник данных DataTable и nullable поля

Добавлено: 08 фев 2016, 15:47
HighAley
Здравствуйте, Дмитрий.

На данный момент используется datacolumn.AllowDBNull, но из-за проблем с дата-адаптерами и провайдерами пока только для DateTime.
Вы можете делать проверку на null следующим образом:

Код: Выделить всё

MyDataSource["MyField"] == DBNull.Value 
Пока только так.

Спасибо.

Re: Истоник данных DataTable и nullable поля

Добавлено: 16 фев 2016, 11:32
Леонид
Добрый день!

Внесу свои два цента. Stimul здесь вообще не причём, Null и DBValue.Null это две разные вещи, подробнее можете почитать об этом, например, здесь http://stackoverflow.com/questions/4958 ... null-value.

В своих отчётах мы используем такую конструкцию для Nullable DateTime:

Код: Выделить всё

string facturaDate = (qrMain.FACTURA_DATE != null ? qrMain.FACTURA_DATE.Value.ToShortDateString() : string.Empty);
Замечу, что свойство .Value есть только у DateTime (Nullable) полей, у обычных (Not null) его нет. Это весьма удобное свойство, а определить конкретно для вашей таблицы или stored procedure является ли поле nullable или нет нельзя, т.к. выборка может возвращать что угодно, в зависимости от логики процедуры (или select'а).