Ejemplo n.º 1
0
        public static void WriteData(TdsParameter p, TdsRequestStream stream, Encoding encoder)
        {
            switch (p.TdsType)
            {
            case TdsType.TDS_VARCHAR:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else
                {
                    var s      = (string)p.Value;
                    var bytes  = encoder.GetBytes(s);
                    int strLen = Math.Max(VAR_MAX, bytes.Length);
                    stream.Write((byte)strLen);
                    stream.Write(bytes, 0, strLen);
                }
                break;

            case TdsType.TDS_VARBINARY:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else
                {
                    var bytes    = (byte[])p.Value;
                    int bytesLen = Math.Max(VAR_MAX, bytes.Length);
                    stream.Write((byte)bytesLen);
                    stream.Write(bytes, 0, bytesLen);
                }
                break;

            case TdsType.TDS_INTN:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else if (p.Value.GetType() == typeof(long))
                {
                    stream.Write((byte)8);
                    stream.WriteLong((long)p.Value);
                }
                else     // convert all smaller ints to int32
                {
                    stream.Write((byte)4);
                    stream.WriteInt((int)p.Value);
                }
                break;

            case TdsType.TDS_FLTN:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else if (p.Value.GetType() == typeof(float))
                {
                    stream.Write((byte)4);
                    stream.WriteInt(BitConverter.SingleToInt32Bits((float)p.Value));
                }
                else     // double
                {
                    stream.Write((byte)8);
                    stream.WriteLong(BitConverter.DoubleToInt64Bits((double)p.Value));
                }
                break;

            case TdsType.TDS_DATETIMEN:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else
                {
                    stream.Write((byte)8);
                    var dt = new System.Data.SqlTypes.SqlDateTime((DateTime)p.Value);
                    stream.WriteInt(dt.DayTicks);
                    stream.WriteInt(dt.TimeTicks);
                }
                break;

            case TdsType.TDS_DECN:
                if (p.Value == null)
                {
                    stream.Write((byte)0);
                }
                else
                {
                    var sqlDec = new System.Data.SqlTypes.SqlDecimal((decimal)p.Value);
                    stream.Write((byte)17);
                    stream.Write(sqlDec.IsPositive ? (byte)0 : (byte)1);
                    stream.Write(sqlDec.BinData.Reverse().ToArray());
                }
                break;

            case TdsType.TDS_MONEYN:
                //if (value == null)
                //{
                stream.Write((byte)0);
                //}
                //else
                //{
                //}
                break;

            case TdsType.TDS_BIT:
                stream.Write((bool)p.Value ? (byte)1 : (byte)0);
                break;

            default:
                throw new NotImplementedException($"Unsupported type {p.TdsType}");
            }
        }
Ejemplo n.º 2
0
        public static TdsParameter[] CreateParameters(FormattableString fstring)
        {
            var count = fstring.ArgumentCount;
            var ps    = new string[count];

            for (var p = 0; p < count; p++)
            {
                ps[p] = "@p" + p;
            }
            var pars = new TdsParameter[fstring.ArgumentCount + 2];

            pars[0] = new TdsParameter("", string.Format(fstring.Format, ps));
            var i  = 0;
            var sb = new StringBuilder();

            foreach (var arg in fstring.GetArguments())
            {
                TdsParameter?p;
                switch (arg)
                {
                case string s:
                    p = new TdsParameter($"@p{i}", s);
                    break;

                case decimal d:
                    p = new TdsParameter($"@p{i}", d);
                    break;

                case bool b:
                    p = new TdsParameter($"@p{i}", b);
                    break;

                case byte v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case short v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case int v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case long v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case float v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case double v:
                    p = new TdsParameter($"@p{i}", v);
                    break;

                case DateTime d:
                    p = new TdsParameter($"@p{i}", d);
                    break;

                default: throw new Exception("Unknown type");
                }

                sb.Append($"{(i > 0 ? "," : "")}@p{i} {p.SqlName}");
                pars[i + 2] = p;
                i++;
            }

            pars[1] = new TdsParameter("", sb.ToString());

            return(pars);
        }
Ejemplo n.º 3
0
        public static void WriteFormat(TdsParameter p, TdsRequestStream stream, Encoding encoder)
        {
            if (p.ParameterName != null)
            {
                var nameBytes = encoder.GetBytes(p.ParameterName);
                stream.Write((byte)nameBytes.Length);
                stream.Write(nameBytes);
            }
            else
            {
                stream.Write(0);
            }

            stream.Write((byte)(p.IsOutput ? 1 : 0));
            stream.WriteInt(0); // user type
            stream.Write((byte)p.TdsType);

            switch (p.TdsType)
            {
            case TdsType.TDS_VARBINARY:
            case TdsType.TDS_VARCHAR:
                stream.Write((byte)VAR_MAX);
                break;

            case TdsType.TDS_INTN:
                if (p.DbType == System.Data.DbType.Int64)
                {
                    stream.Write((byte)8);
                }
                else
                {
                    stream.Write((byte)4);
                }
                break;

            case TdsType.TDS_FLTN:
                if (p.DbType == System.Data.DbType.Single)
                {
                    stream.Write((byte)4);
                }
                else
                {
                    stream.Write((byte)8);
                }
                break;

            case TdsType.TDS_DATETIMEN:
                stream.Write((byte)8);
                break;

            case TdsType.TDS_DECN:
                if (p.Value == null)
                {
                    stream.Write((byte)17);
                    stream.Write((byte)38);
                    stream.Write((byte)0);
                }
                else
                {
                    var sqlDec = new System.Data.SqlTypes.SqlDecimal((decimal)p.Value);
                    stream.Write((byte)17);
                    stream.Write(sqlDec.Precision);
                    stream.Write(sqlDec.Scale);
                }
                break;

            case TdsType.TDS_BIT:
                break;

            case TdsType.TDS_MONEYN:
            default:
                throw new NotImplementedException($"Unsupported type {p.TdsType}");
            }

            stream.Write((byte)0); // Locale information
        }