Skip to content

Commit bbb6b15

Browse files
tannergoodingEric Erhardt
authored and
Eric Erhardt
committed
Changing the database cursor to return default for DBNull (#4070)
* Changing the database cursor to return default for DBNull * Fixing float/double to be NaN for null values in the database loader. * Fixing the DatabaseLoaderTests mock to return false for IsDBNull
1 parent a802127 commit bbb6b15

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

src/Microsoft.ML.Experimental/DataLoadSave/Database/DatabaseLoaderCursor.cs

+11-11
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ private Delegate CreateGetterDelegate<TValue>(int col)
236236
private ValueGetter<bool> CreateBooleanGetterDelegate(ColInfo colInfo)
237237
{
238238
int columnIndex = GetColumnIndex(colInfo);
239-
return (ref bool value) => value = DataReader.GetBoolean(columnIndex);
239+
return (ref bool value) => value = DataReader.IsDBNull(columnIndex) ? default : DataReader.GetBoolean(columnIndex);
240240
}
241241

242242
private ValueGetter<byte> CreateByteGetterDelegate(ColInfo colInfo)
@@ -254,61 +254,61 @@ private ValueGetter<DateTime> CreateDateTimeGetterDelegate(ColInfo colInfo)
254254
private ValueGetter<double> CreateDoubleGetterDelegate(ColInfo colInfo)
255255
{
256256
int columnIndex = GetColumnIndex(colInfo);
257-
return (ref double value) => value = DataReader.GetDouble(columnIndex);
257+
return (ref double value) => value = DataReader.IsDBNull(columnIndex) ? double.NaN : DataReader.GetDouble(columnIndex);
258258
}
259259

260260
private ValueGetter<short> CreateInt16GetterDelegate(ColInfo colInfo)
261261
{
262262
int columnIndex = GetColumnIndex(colInfo);
263-
return (ref short value) => value = DataReader.GetInt16(columnIndex);
263+
return (ref short value) => value = DataReader.IsDBNull(columnIndex) ? default : DataReader.GetInt16(columnIndex);
264264
}
265265

266266
private ValueGetter<int> CreateInt32GetterDelegate(ColInfo colInfo)
267267
{
268268
int columnIndex = GetColumnIndex(colInfo);
269-
return (ref int value) => value = DataReader.GetInt32(columnIndex);
269+
return (ref int value) => value = DataReader.IsDBNull(columnIndex) ? default : DataReader.GetInt32(columnIndex);
270270
}
271271

272272
private ValueGetter<long> CreateInt64GetterDelegate(ColInfo colInfo)
273273
{
274274
int columnIndex = GetColumnIndex(colInfo);
275-
return (ref long value) => value = DataReader.GetInt64(columnIndex);
275+
return (ref long value) => value = DataReader.IsDBNull(columnIndex) ? default : DataReader.GetInt64(columnIndex);
276276
}
277277

278278
private ValueGetter<sbyte> CreateSByteGetterDelegate(ColInfo colInfo)
279279
{
280280
int columnIndex = GetColumnIndex(colInfo);
281-
return (ref sbyte value) => value = (sbyte)DataReader.GetByte(columnIndex);
281+
return (ref sbyte value) => value = DataReader.IsDBNull(columnIndex) ? default : (sbyte)DataReader.GetByte(columnIndex);
282282
}
283283

284284
private ValueGetter<float> CreateSingleGetterDelegate(ColInfo colInfo)
285285
{
286286
int columnIndex = GetColumnIndex(colInfo);
287-
return (ref float value) => value = DataReader.GetFloat(columnIndex);
287+
return (ref float value) => value = DataReader.IsDBNull(columnIndex) ? float.NaN : DataReader.GetFloat(columnIndex);
288288
}
289289

290290
private ValueGetter<ReadOnlyMemory<char>> CreateStringGetterDelegate(ColInfo colInfo)
291291
{
292292
int columnIndex = GetColumnIndex(colInfo);
293-
return (ref ReadOnlyMemory<char> value) => value = DataReader.GetString(columnIndex).AsMemory();
293+
return (ref ReadOnlyMemory<char> value) => value = DataReader.IsDBNull(columnIndex) ? default : DataReader.GetString(columnIndex).AsMemory();
294294
}
295295

296296
private ValueGetter<ushort> CreateUInt16GetterDelegate(ColInfo colInfo)
297297
{
298298
int columnIndex = GetColumnIndex(colInfo);
299-
return (ref ushort value) => value = (ushort)DataReader.GetInt16(columnIndex);
299+
return (ref ushort value) => value = DataReader.IsDBNull(columnIndex) ? default : (ushort)DataReader.GetInt16(columnIndex);
300300
}
301301

302302
private ValueGetter<uint> CreateUInt32GetterDelegate(ColInfo colInfo)
303303
{
304304
int columnIndex = GetColumnIndex(colInfo);
305-
return (ref uint value) => value = (uint)DataReader.GetInt32(columnIndex);
305+
return (ref uint value) => value = DataReader.IsDBNull(columnIndex) ? default : (uint)DataReader.GetInt32(columnIndex);
306306
}
307307

308308
private ValueGetter<ulong> CreateUInt64GetterDelegate(ColInfo colInfo)
309309
{
310310
int columnIndex = GetColumnIndex(colInfo);
311-
return (ref ulong value) => value = (ulong)DataReader.GetInt64(columnIndex);
311+
return (ref ulong value) => value = DataReader.IsDBNull(columnIndex) ? default : (ulong)DataReader.GetInt64(columnIndex);
312312
}
313313

314314
private int GetColumnIndex(ColInfo colInfo)

test/Microsoft.ML.Tests/DatabaseLoaderTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ public override int GetOrdinal(string name)
379379

380380
public override int GetValues(object[] values) => throw new NotImplementedException();
381381

382-
public override bool IsDBNull(int ordinal) => throw new NotImplementedException();
382+
public override bool IsDBNull(int ordinal) => false;
383383

384384
public override bool NextResult() => throw new NotImplementedException();
385385

0 commit comments

Comments
 (0)