예제 #1
0
        public void ExecuteSql(string sql, IEnumerable <TdsParameter> parameters)
        {
            StartRequest();
            _logger?.LogInformation($"Sending language(sql) message with {parameters?.Count()} parameters: \"{sql}\"");

            _req.SetPacketType(PacketType.TDS_BUF_NORMAL);
            _req.Write((byte)TokenType.TDS_LANGUAGE);

            var sqlBytes = Encoder.GetBytes(sql);

            _req.WriteInt(sqlBytes.Length + 1);
            _req.Write(parameters != null && parameters.Any() ? (byte)1 : (byte)0);
            _req.Write(sqlBytes, 0, sql.Length);

            if (parameters != null && parameters.Any())
            {
                WriteParameters(parameters);
            }

            _req.EndMessage();
        }
예제 #2
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}");
            }
        }
예제 #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
        }