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); }
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); }
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(); }
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); } }