Пример #1
0
        public static List <T> ExecuteParameterQuery <T>(this TdsConnection cnn, FormattableString text) where T : class, new()
        {
            var writer = cnn.TdsPackage.Writer;
            var reader = cnn.TdsPackage.Reader;
            var parser = cnn.StreamParser;

            writer.SendRpc(reader.CurrentSession.DefaultCollation, text, cnn.SqlTransactionId);
            parser.ParseInput();
            if (parser.Status == ParseStatus.Done)
            {
                return(null);
            }
            var r            = new List <T>();
            var rowReader    = GetRowReader <T>(reader, text.Format);
            var columnReader = new TdsColumnReader(reader);

            while (parser.Status != ParseStatus.Done)
            {
                var result = rowReader(columnReader);
                parser.ParseInput();
                r.Add(result);
            }

            return(r);
        }
Пример #2
0
        public static List <T> ExecuteQuery <T>(this TdsConnection cnn, string text) where T : class, new()
        {
            var writer = cnn.TdsPackage.Writer;
            var reader = cnn.TdsPackage.Reader;
            var parser = cnn.StreamParser;

            writer.SendExecuteBatch(text, cnn.SqlTransactionId);
            parser.ParseInput();
            if (parser.Status == ParseStatus.Done)
            {
                return(null);
            }
            var result       = new List <T>();
            var rowReader    = GetRowReader <T>(reader, text);
            var columnReader = new TdsColumnReader(cnn.TdsPackage.Reader);

            while (parser.Status != ParseStatus.Done)
            {
                var row = rowReader(columnReader);
                parser.ParseInput();
                result.Add(row);
            }

            return(result);
        }
Пример #3
0
        private static object ObjectReader(TdsColumnReader reader, object o)
        {
            switch (o)
            {
            case bool _: return(reader.ReadSqlBit(0));;

            case byte _: return(reader.ReadSqlByte(0));;

            case short _: return(reader.ReadSqlInt16(0));;

            case int _: return(reader.ReadSqlInt32(0));;

            case long _: return(reader.ReadSqlInt64(0));;

            case Money4 _: return(reader.ReadSqlMoney(0));;

            case Money _: return(reader.ReadSqlMoney(0));;

            case float _: return(reader.ReadSqlFloat(0));;

            case double _: return(reader.ReadSqlDouble(0));;

            case SqlDate _: return(reader.ReadSqlDate(0));;

            case TimeSpan _: return(reader.ReadSqlTime(0));;

            case SqlDateTime2 _: return(reader.ReadSqlDateTime2(0));;

            case DateTimeOffset _: return(reader.ReadSqlDateTimeOffset(0));;

            case SqlDateTime4 _: return(reader.ReadSqlDateTime(0));;

            case DateTime _: return(reader.ReadSqlDateTime(0));;

            case decimal _: return(reader.ReadDecimal(0));;

            case Guid _: return(reader.ReadSqlGuid(0));;

            case byte[] _: return(reader.ReadBinary(0));;

            case SqlImage _: return(reader.ReadBinary(0));;

            case string _: return(reader.ReadString(0));;

            case SqlUnicode _: return(reader.ReadUnicodeString(0));;

            case SqlXml _: return(reader.ReadUnicodeString(0));;

            case SqlVariant _: return(reader.ReadSqlVariant(0));;
                //case SqlUnicode _: return reader.Readsql(0); ;
            }

            throw new NotImplementedException();
        }
Пример #4
0
        private void TestIntN(object value, int tdsType, bool nulltest, byte precision = 0, byte scale = 0, bool isPlp = false)
        {
            var stream = new TestStream();
            var writer = new TdsPackageWriter(stream);
            var reader = new TdsPackageReader(stream);

            SetupColMetaData(reader, writer, tdsType, precision, scale, isPlp);
            var columwriter  = new TdsColumnWriter(writer);
            var columnReader = new TdsColumnReader(reader);

            object result;

            if (nulltest)
            {
                writer.NewPackage(TdsEnums.MT_RPC);
                ObjectWriter(columwriter, tdsType, value, nulltest);
                writer.SendLastMessage();
                result = ObjectReader(columnReader, value);
                Assert.Null(result);
            }

            writer.NewPackage(TdsEnums.MT_RPC);
            ObjectWriter(columwriter, tdsType, value, false);
            writer.SendLastMessage();
            result = ObjectReader(columnReader, value);
            switch (value)
            {
            case Money v:
                Assert.Equal((decimal)v, result);
                break;

            case Money4 v:
                Assert.Equal((decimal)v, result);
                break;

            case SqlDate v:
                Assert.Equal((DateTime)v, result);
                break;

            case SqlDateTime2 v:
                Assert.Equal((DateTime)v, result);
                break;

            case SqlDateTime4 v:
                Assert.Equal((DateTime)v, result);
                break;

            case SqlImage v:
                Assert.Equal((byte[])v, result);
                break;

            case SqlUnicode v:
                Assert.Equal((string)v, result);
                break;

            case SqlXml v:
                Assert.Equal((string)v, result);
                break;

            case SqlVariant v:
                switch (v.Value)
                {
                case bool b: Assert.Equal(b, result); break;

                case byte b: Assert.Equal(b, result); break;

                case short b: Assert.Equal(b, result); break;

                case int b: Assert.Equal(b, result); break;

                case long b: Assert.Equal(b, result); break;

                case float b: Assert.Equal(b, result); break;

                case double b: Assert.Equal(b, result); break;

                case DateTime b: Assert.Equal(b, result); break;

                case Guid b: Assert.Equal(b, result); break;

                case decimal b: Assert.Equal(b, result); break;

                case byte[] b: Assert.Equal(b, result); break;

                case string b: Assert.Equal(b, result); break;

                case TimeSpan b: Assert.Equal(b, result); break;

                case DateTimeOffset b: Assert.Equal(b, result); break;

                default:
                    Assert.False(true);
                    break;
                }

                break;

            default:
                Assert.Equal(value, result);
                break;
            }

            Assert.Equal(reader.GetReadEndPos(), reader.GetReadPos());
            if (!new[]
            {
                TdsEnums.SQLBIGBINARY,
                TdsEnums.SQLBIGVARBINARY,
                TdsEnums.SQLBIGVARCHAR,
                TdsEnums.SQLBIGCHAR,
                TdsEnums.SQLTEXT,
                TdsEnums.SQLNVARCHAR,
                TdsEnums.SQLNTEXT,
                TdsEnums.SQLNCHAR,
                TdsEnums.SQLXMLTYPE,
                TdsEnums.SQLIMAGE,
            }.Contains(tdsType) && !(value is SqlVariant v1 && (v1.Value is string s || v1.Value is byte[])))
            {
                Assert.InRange(reader.GetReadPos() - 8, 0, TdsEnums.MaxSizeSqlValue);
            }
        }