예제 #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}");
            }
        }
예제 #2
0
        public void SendLogin()
        {
            StartRequest();
            _logger?.LogDebug("Sending login message");

            _req.SetPacketType(PacketType.TDS_BUF_LOGIN);
            _req.WriteLoginString(_paramaters.ClientHostname, 30); // client hostname
            _req.WriteLoginString(_paramaters.Username, 30);       // client username
            _req.WriteLoginString(_paramaters.Password, 30);       // client password
            _req.WriteLoginString(_paramaters.ProcessId, 30);      // client process name

            _req.Write((byte)3);                                   // type of int2
            _req.Write((byte)1);                                   // type of int4
            _req.Write((byte)6);                                   // type of char
            _req.Write((byte)10);                                  // type of flt
            _req.Write((byte)9);                                   // type of date
            _req.Write((byte)1);                                   // notify of use db
            _req.Write((byte)1);                                   // disallow dump/load and bulk insert
            _req.Write((byte)0);                                   // sql interface type
            _req.Write((byte)0);                                   // type of network connection

            _req.Write(null, 0, 7);

            _req.WriteLoginString(_paramaters.AppliactionName, 30); // client application name
            _req.WriteLoginString(_paramaters.ServerName, 30);      // server name
            _req.Write((byte)0);                                    // remote passwords
            _req.Write((byte)_paramaters.Password.Length);
            byte[] tmpPassword = Encoder.GetBytes(_paramaters.Password);
            _req.Write(tmpPassword, 0, 253);
            _req.Write((byte)(tmpPassword.Length + 2));

            _req.Write((byte)5);  // tds version
            _req.Write((byte)0);

            _req.Write((byte)0);
            _req.Write((byte)0);
            _req.WriteLoginString("TdsClient", 10); // client library

            _req.Write((byte)5);                    // prog version
            _req.Write((byte)0);
            _req.Write((byte)0);
            _req.Write((byte)0);

            _req.Write((byte)0);                             // auto convert short
            _req.Write((byte)0x0D);                          // type of flt4
            _req.Write((byte)0x11);                          // type of date4

            _req.WriteLoginString(_paramaters.Language, 30); // language

            _req.Write((byte)1);                             // notify on lang change
            _req.Write((byte)0);                             // security label hierachy 1
            _req.Write((byte)0);                             // security label hierachy 2
            _req.Write((byte)0);                             // security encrypted
            _req.Write(null, 0, 8);                          // security components
            _req.Write((byte)0);                             // security spare 1
            _req.Write((byte)0);                             // security spare 2

            _req.WriteLoginString(_paramaters.Charset, 30);  // Character set

            _req.Write((byte)1);                             // notify on charset change

            _req.WriteLoginString(PacketSize.ToString(), 6);
            _req.Write(null, 0, 4);

            // send capability token?

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