diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamReader.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamReader.cs index de22f564c7..0c1bc0406e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamReader.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamReader.cs @@ -76,7 +76,7 @@ public ServiceBufferFileStreamReader(Stream stream, QueryExecutionSettings setti {typeof(bool), (o, id, col) => ReadBoolean(o, id)}, {typeof(double), (o, id, col) => ReadDouble(o, id)}, {typeof(float), (o, id, col) => ReadSingle(o, id)}, - {typeof(decimal), (o, id, col) => ReadDecimal(o, id)}, + {typeof(decimal), (o, id, col) => ReadSqlDecimal(o, id)}, {typeof(DateTime), ReadDateTime}, {typeof(DateTimeOffset), (o, id, col) => ReadDateTimeOffset(o, id)}, {typeof(TimeSpan), (o, id, col) => ReadTimeSpan(o, id)}, diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamWriter.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamWriter.cs index 522bdd5548..3267b6c90d 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamWriter.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/ServiceBufferFileStreamWriter.cs @@ -92,19 +92,19 @@ public ServiceBufferFileStreamWriter(Stream stream, QueryExecutionSettings setti {typeof(byte[]), val => WriteBytes((byte[]) val)}, {typeof(Guid), val => WriteGuid((Guid) val)}, - {typeof(SqlString), val => WriteNullable((SqlString) val, obj => WriteString((string) obj))}, - {typeof(SqlInt16), val => WriteNullable((SqlInt16) val, obj => WriteInt16((short) obj))}, - {typeof(SqlInt32), val => WriteNullable((SqlInt32) val, obj => WriteInt32((int) obj))}, - {typeof(SqlInt64), val => WriteNullable((SqlInt64) val, obj => WriteInt64((long) obj)) }, - {typeof(SqlByte), val => WriteNullable((SqlByte) val, obj => WriteByte((byte) obj)) }, - {typeof(SqlBoolean), val => WriteNullable((SqlBoolean) val, obj => WriteBoolean((bool) obj)) }, - {typeof(SqlDouble), val => WriteNullable((SqlDouble) val, obj => WriteDouble((double) obj)) }, - {typeof(SqlSingle), val => WriteNullable((SqlSingle) val, obj => WriteSingle((float) obj)) }, + {typeof(SqlString), val => WriteNullable((SqlString) val, obj => WriteString(((SqlString) obj).Value))}, + {typeof(SqlInt16), val => WriteNullable((SqlInt16) val, obj => WriteInt16(((SqlInt16) obj).Value))}, + {typeof(SqlInt32), val => WriteNullable((SqlInt32) val, obj => WriteInt32(((SqlInt32)obj).Value))}, + {typeof(SqlInt64), val => WriteNullable((SqlInt64) val, obj => WriteInt64(((SqlInt64) obj).Value)) }, + {typeof(SqlByte), val => WriteNullable((SqlByte) val, obj => WriteByte(((SqlByte) obj).Value)) }, + {typeof(SqlBoolean), val => WriteNullable((SqlBoolean) val, obj => WriteBoolean(((SqlBoolean) obj).Value)) }, + {typeof(SqlDouble), val => WriteNullable((SqlDouble) val, obj => WriteDouble(((SqlDouble) obj).Value)) }, + {typeof(SqlSingle), val => WriteNullable((SqlSingle) val, obj => WriteSingle(((SqlSingle) obj).Value)) }, {typeof(SqlDecimal), val => WriteNullable((SqlDecimal) val, obj => WriteSqlDecimal((SqlDecimal) obj)) }, - {typeof(SqlDateTime), val => WriteNullable((SqlDateTime) val, obj => WriteDateTime((DateTime) obj)) }, - {typeof(SqlBytes), val => WriteNullable((SqlBytes) val, obj => WriteBytes((byte[]) obj)) }, - {typeof(SqlBinary), val => WriteNullable((SqlBinary) val, obj => WriteBytes((byte[]) obj)) }, - {typeof(SqlGuid), val => WriteNullable((SqlGuid) val, obj => WriteGuid((Guid) obj)) }, + {typeof(SqlDateTime), val => WriteNullable((SqlDateTime) val, obj => WriteDateTime(((SqlDateTime) obj).Value)) }, + {typeof(SqlBytes), val => WriteNullable((SqlBytes) val, obj => WriteBytes(((SqlBytes) obj).Value)) }, + {typeof(SqlBinary), val => WriteNullable((SqlBinary) val, obj => WriteBytes(((SqlBinary) obj).Value)) }, + {typeof(SqlGuid), val => WriteNullable((SqlGuid) val, obj => WriteGuid(((SqlGuid) obj).Value)) }, {typeof(SqlMoney), val => WriteNullable((SqlMoney) val, obj => WriteMoney((SqlMoney) obj)) } }; } @@ -299,7 +299,7 @@ internal int WriteChar(char val) internal int WriteBoolean(bool val) { byteBuffer[0] = 0x01; // length - byteBuffer[1] = (byte) (val ? 0x01 : 0x00); + byteBuffer[1] = (byte)(val ? 0x01 : 0x00); return FileUtilities.WriteWithLength(fileStream, byteBuffer, 2); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/StorageDataReader.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/StorageDataReader.cs index 68742616b0..560e3209b7 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/StorageDataReader.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/DataStorage/StorageDataReader.cs @@ -98,7 +98,7 @@ public Task ReadAsync(CancellationToken cancellationToken) /// The value of the given column public object GetValue(int i) { - return sqlDataReader == null ? DbDataReader.GetValue(i) : sqlDataReader.GetValue(i); + return sqlDataReader == null ? DbDataReader.GetValue(i) : sqlDataReader.GetSqlValue(i); } /// @@ -113,7 +113,7 @@ public void GetValues(object[] values) } else { - sqlDataReader.GetValues(values); + sqlDataReader.GetSqlValues(values); } } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/QueryExecution/DataStorage/StorageDataReaderTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/QueryExecution/DataStorage/StorageDataReaderTests.cs index f5b3546205..e65fa5e7f7 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/QueryExecution/DataStorage/StorageDataReaderTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/QueryExecution/DataStorage/StorageDataReaderTests.cs @@ -44,6 +44,20 @@ public void GetBytesWithMaxCapacityTest() Assert.NotNull(bytes); } + /// + /// Validate GetBytesWithMaxCapacity + /// + [Test] + public void GetLongDecimalTest() + { + // SQL Server support up to 38 digits of decimal + var storageReader = GetTestStorageDataReader( + "SELECT 99999999999999999999999999999999999999"); + storageReader.DbDataReader.Read(); + var value = storageReader.GetValue(0); + Assert.AreEqual("99999999999999999999999999999999999999", value.ToString()); + } + /// /// Validate GetCharsWithMaxCapacity /// @@ -63,7 +77,7 @@ public void GetCharsWithMaxCapacityTest() Assert.True(shortName.Length == 2); Assert.Throws(() => storageReader.GetBytesWithMaxCapacity(0, 0)); - Assert.Throws(() => storageReader.GetCharsWithMaxCapacity(0, 0)); + Assert.Throws(() => storageReader.GetCharsWithMaxCapacity(0, 0)); } /// @@ -94,10 +108,10 @@ public void StringWriterWithMaxCapacityTest() writer.Write(output); Assert.True(writer.ToString().Equals(output)); writer.Write('.'); - Assert.True(writer.ToString().Equals(output + '.')); + Assert.True(writer.ToString().Equals(output + '.')); writer.Write(output); writer.Write('.'); Assert.True(writer.ToString().Equals(output + '.')); - } + } } } \ No newline at end of file