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