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 TdsParameter[] CreateParameters(FormattableString fstring) { var count = fstring.ArgumentCount; var ps = new string[count]; for (var p = 0; p < count; p++) { ps[p] = "@p" + p; } var pars = new TdsParameter[fstring.ArgumentCount + 2]; pars[0] = new TdsParameter("", string.Format(fstring.Format, ps)); var i = 0; var sb = new StringBuilder(); foreach (var arg in fstring.GetArguments()) { TdsParameter?p; switch (arg) { case string s: p = new TdsParameter($"@p{i}", s); break; case decimal d: p = new TdsParameter($"@p{i}", d); break; case bool b: p = new TdsParameter($"@p{i}", b); break; case byte v: p = new TdsParameter($"@p{i}", v); break; case short v: p = new TdsParameter($"@p{i}", v); break; case int v: p = new TdsParameter($"@p{i}", v); break; case long v: p = new TdsParameter($"@p{i}", v); break; case float v: p = new TdsParameter($"@p{i}", v); break; case double v: p = new TdsParameter($"@p{i}", v); break; case DateTime d: p = new TdsParameter($"@p{i}", d); break; default: throw new Exception("Unknown type"); } sb.Append($"{(i > 0 ? "," : "")}@p{i} {p.SqlName}"); pars[i + 2] = p; i++; } pars[1] = new TdsParameter("", sb.ToString()); return(pars); }
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 }