コード例 #1
0
        private void ReadPrimitiveValue(DriverRowData rowData, int ordinal, BinaryReader reader, StringBuilder stringBuilder)
        {
            var indexInArray = rowData.FieldArrayIndexes[ordinal];

            switch (rowData.FieldTypes[ordinal])
            {
            //case DbType.VarNumeric:
            //    break;
            case DbType.AnsiString:
            case DbType.String:
            case DbType.AnsiStringFixedLength:
            case DbType.StringFixedLength:
            case DbType.Xml:
            {
                var len = RowData.Read7BitEncodedInt(reader);
                if (len > 0)
                {
                    stringBuilder.Clear();
                    stringBuilder.EnsureCapacity(len);
                    for (var i = 0; i < len; i++)
                    {
                        stringBuilder.Append((char)RowData.Read7BitEncodedInt(reader));
                    }
                    rowData.StringData[indexInArray] = stringBuilder.ToString();
                }
                else
                {
                    rowData.StringData[indexInArray] = string.Empty;
                }
            }
            break;

            case DbType.Binary:
            case DbType.Object:
            {
                var data = rowData.BinaryData[indexInArray];
                data.SetLength(RowData.Read7BitEncodedInt(reader));
                var bytesRead = 0;
                while (bytesRead < data.Length)
                {
                    var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead);
                    if (count == 0)
                    {
                        throw new DataException("Unexpected end of stream");
                    }
                    bytesRead += count;
                }
            }
            break;

            case DbType.SByte:
            case DbType.Byte:
                rowData.ValueData8Bytes[indexInArray].AsByte = reader.ReadByte();
                break;

            case DbType.Boolean:
                rowData.ValueData8Bytes[indexInArray].AsBoolean = reader.ReadBoolean();
                break;

            case DbType.Decimal:
            case DbType.Currency:
            case DbType.Guid:
            case DbType.DateTimeOffset:
                rowData.ValueData16Bytes[indexInArray].Lo = reader.ReadInt64();
                rowData.ValueData16Bytes[indexInArray].Hi = reader.ReadInt64();
                break;

            case DbType.Int16:
            case DbType.UInt16:
                rowData.ValueData8Bytes[indexInArray].AsInt16 = reader.ReadInt16();
                break;

            case DbType.Int32:
            case DbType.UInt32:
            case DbType.Single:
                rowData.ValueData8Bytes[indexInArray].AsInt32 = reader.ReadInt32();
                break;

            case DbType.Date:
            case DbType.DateTime:
            case DbType.DateTime2:
            case DbType.Time:
            case DbType.Int64:
            case DbType.UInt64:
            case DbType.Double:
                rowData.ValueData8Bytes[indexInArray].AsInt64 = reader.ReadInt64();
                break;

            default:
                throw new DataException("Invalid DbType: " + rowData.FieldTypes[ordinal]);
            }
        }
コード例 #2
0
        private object ReadCollection(DbType dbType, BinaryReader reader, StringBuilder stringBuilder)
        {
            var itemCount = RowData.Read7BitEncodedInt(reader);

            switch (dbType)
            {
            //case DbType.VarNumeric:
            //    break;
            case DbType.AnsiString:
            case DbType.String:
            case DbType.AnsiStringFixedLength:
            case DbType.StringFixedLength:
            case DbType.Xml:
            {
                var result = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

                for (var x = 0; x < itemCount; x++)
                {
                    var len = RowData.Read7BitEncodedInt(reader);
                    if (len > 0)
                    {
                        stringBuilder.Clear();
                        stringBuilder.EnsureCapacity(len);
                        for (var i = 0; i < len; i++)
                        {
                            stringBuilder.Append((char)RowData.Read7BitEncodedInt(reader));
                        }
                        result.Add(stringBuilder.ToString());
                    }
                    else if (len >= -1)
                    {
                        // client supplies -1 to indicate that collection element is null
                        // ignore ReSharper's warning about notnull, no exception here

                        // ReSharper disable AssignNullToNotNullAttribute
                        result.Add(len == 0 ? string.Empty : null);
                        // ReSharper restore AssignNullToNotNullAttribute
                    }
                    else
                    {
                        throw new Exception("Invalid length value: " + len);
                    }
                }
                return(result);
            }

            case DbType.Binary:
            case DbType.Object:
            {
                var result = new HashSet <SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance);

                for (var x = 0; x < itemCount; x++)
                {
                    var len = RowData.Read7BitEncodedInt(reader);
                    if (len >= 0)
                    {
                        var data = new SizableArrayOfByte();
                        data.SetLength(len);
                        var bytesRead = 0;
                        while (bytesRead < data.Length)
                        {
                            var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead);
                            if (count == 0)
                            {
                                throw new DataException("Unexpected end of stream");
                            }
                            bytesRead += count;
                        }

                        result.Add(data);
                    }
                    else if (len == -1)
                    {
                        // client supplies -1 to indicate that collection element is null
                        // ignore ReSharper's warning about notnull, no exception here

                        // ReSharper disable AssignNullToNotNullAttribute
                        result.Add(null);
                        // ReSharper restore AssignNullToNotNullAttribute
                    }
                    else
                    {
                        throw new Exception("Invalid length value: " + len);
                    }
                }
                return(result);
            }

            case DbType.SByte:
            {
                var result = new HashSet <SByte>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add((sbyte)reader.ReadByte());
                }
                return(result);
            }

            case DbType.Byte:
            {
                var result = new HashSet <Byte>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadByte());
                }
                return(result);
            }

            case DbType.Boolean:
            {
                var result = new HashSet <bool>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadBoolean());
                }
                return(result);
            }

            case DbType.Decimal:
            case DbType.Currency:
            {
                var result = new HashSet <Decimal>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadDecimal());
                }
                return(result);
            }

            case DbType.Guid:
            {
                var result = new HashSet <Guid>();
                for (var x = 0; x < itemCount; x++)
                {
                    var buf = new DriverRowData.ValueHolder16Bytes {
                        Lo = reader.ReadInt64(), Hi = reader.ReadInt64()
                    };
                    result.Add(buf.AsGuid);
                }
                return(result);
            }

            case DbType.DateTimeOffset:
            {
                var result = new HashSet <DateTimeOffset>();
                for (var x = 0; x < itemCount; x++)
                {
                    var buf = new DriverRowData.ValueHolder16Bytes {
                        Lo = reader.ReadInt64(), Hi = reader.ReadInt64()
                    };
                    result.Add(buf.AsDateTimeOffset);
                }
                return(result);
            }

            case DbType.Int16:
            {
                var result = new HashSet <Int16>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt16());
                }
                return(result);
            }

            case DbType.UInt16:
            {
                var result = new HashSet <UInt16>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt16());
                }
                return(result);
            }

            case DbType.Int32:
            {
                var result = new HashSet <Int32>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt32());
                }
                return(result);
            }

            case DbType.UInt32:
            {
                var result = new HashSet <UInt32>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt32());
                }
                return(result);
            }

            case DbType.Single:
            {
                var result = new HashSet <Single>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadSingle());
                }
                return(result);
            }

            case DbType.Date:
            case DbType.DateTime:
            case DbType.DateTime2:
            {
                var result = new HashSet <DateTime>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(DateTime.FromBinary(reader.ReadInt64()));
                }
                return(result);
            }

            case DbType.Time:
            {
                var result = new HashSet <TimeSpan>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(new TimeSpan(reader.ReadInt64()));
                }
                return(result);
            }

            case DbType.Int64:
            {
                var result = new HashSet <Int64>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt64());
                }
                return(result);
            }

            case DbType.UInt64:
            {
                var result = new HashSet <UInt64>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt64());
                }
                return(result);
            }

            case DbType.Double:
            {
                var result = new HashSet <Double>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadDouble());
                }
                return(result);
            }

            default:
                throw new DataException("Invalid DbType: " + dbType);
            }
        }