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