Пример #1
0
        public void Connect()
        {
            System.Net.IPEndPoint endPoint;
            if (System.Net.IPAddress.TryParse(_paramaters.ServerAddress, out var ipadr))
            {
                endPoint = new System.Net.IPEndPoint(ipadr, _paramaters.ServerPort);
            }
            else
            {
                var ip = System.Net.Dns.GetHostEntryAsync(_paramaters.ServerAddress).GetAwaiter().GetResult();
                endPoint = new System.Net.IPEndPoint(
                    ip.AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First(),
                    _paramaters.ServerPort);
            }

            _logger?.LogDebug($"Connecting to {_paramaters.ServerAddress} -> {endPoint}");
            _socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.IP);
            _socket.Connect(endPoint);

            _req = new TdsRequestStream(_socket, this, _loggerFactory?.CreateLogger <TdsRequestStream>());
            _res = new TdsResponseStream(_socket, this, _loggerFactory?.CreateLogger <TdsResponseStream>());
        }
Пример #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
        }