private static string TryProcessParameterAsString( object value, KnownProvider provider, StringBuilder sb, ValuesInjectionMethodInternal injectMethod) { // null is just 'NULL' if (value == null) { return("NULL"); } switch (injectMethod) { case ValuesInjectionMethodInternal.ViaParameters: return(null); case ValuesInjectionMethodInternal.Auto: // Postgres has a huge limit for parameters, whereas MSSQL is just ... 2100 :( if (provider == KnownProvider.PostgreSql) { return(null); } break; } // Try to inject parameters as text sb.Length = 0; switch (value) { case string strValue: sb.Append("'").Append(strValue.Replace("'", "''")).Append("'"); break; case float _: case double _: case decimal _: sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture)); break; case int _: case long _: switch (provider) { case KnownProvider.Mssql: if (value is int) { sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture)); } else { sb.Append("CAST(") .Append(Convert.ToString(value, CultureInfo.InvariantCulture)) .Append("AS BIGINT)"); } break; default: sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture)); break; } break; case DateTime dateValue: switch (provider) { case KnownProvider.Mssql: sb.Append("CAST ('") .Append(dateValue.ToString("yyyy-MM-ddTHH:mm:ss.fff")) .Append("' AS DATETIME)"); break; case KnownProvider.PostgreSql: sb.Append("'") .Append(dateValue.ToString("yyyy-MM-ddTHH:mm:ss.fff")) .Append("'::date"); break; default: return(null); } break; default: return(null); } return(sb.ToString()); }
private static void AppendRowsAsValues(StringBuilder sb, InterceptionOptions options, DbCommand command, IList parameters, KnownProvider providerType) { #if EFCore string paramPattern = EntityFrameworkCore.MemoryJoin.MemoryJoiner.ParametersPrefix; #else string paramPattern = EntityFramework.MemoryJoin.MemoryJoiner.ParametersPrefix; #endif Interlocked.Increment(ref parametersSequence); paramPattern = paramPattern + parametersSequence + "_"; var innerSb = new StringBuilder(20); var i = 0; var id = 1; sb.Append("( VALUES "); foreach (var el in options.Data) { sb.Append("("); // Let's append Id anyways, as per Issue #1 sb.Append(id).Append(", "); foreach (var columnName in options.ColumnNames) { var value = el[columnName]; var stringValue = TryProcessParameterAsString(value, providerType, innerSb, options.ValuesInjectMethod); if (stringValue != null) { sb.Append(stringValue); } else { var paramName = $"{paramPattern}{i}"; var param = command.CreateParameter(); param.ParameterName = paramName; param.Value = value; parameters.Add(param); sb.Append(paramName); i++; } sb.Append(", "); } sb.Length -= ", ".Length; sb.Append("), "); id++; } sb.Length -= ", ".Length; sb.Append(")"); }
public static extern int EnumSystemFirmwareTables(KnownProvider firmwareTableProviderSignature, IntPtr firmwareTableBuffer, int bufferSize);
public static extern int GetSystemFirmwareTable(KnownProvider firmwareTableProviderSignature, int firmwareTableId, IntPtr firmwareTableBuffer, int bufferSize);
private static void AppendRowsAsValues(StringBuilder sb, InterceptionOptions options, DbCommand command, IList parameters, KnownProvider providerType) { const string paramPattern = "@__gen_q_p"; var innerSb = new StringBuilder(20); var i = 0; var id = 1; sb.Append("( VALUES "); foreach (var el in options.Data) { sb.Append("("); // Let's append Id anyways, as per Issue #1 sb.Append(id).Append(", "); foreach (var columnName in options.ColumnNames) { var value = el[columnName]; var stringValue = TryProcessParameterAsString(value, providerType, innerSb, options.ValuesInjectMethod); if (stringValue != null) { sb.Append(stringValue); } else { var paramName = $"{paramPattern}{i}"; var param = command.CreateParameter(); param.ParameterName = paramName; param.Value = value; parameters.Add(param); sb.Append(paramName); i++; } sb.Append(", "); } sb.Length -= ", ".Length; sb.Append("), "); id++; } sb.Length -= ", ".Length; sb.Append(")"); }