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