Skip to content

Instantly share code, notes, and snippets.

@dcolthorp
Created January 9, 2013 00:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dcolthorp/4489424 to your computer and use it in GitHub Desktop.
Save dcolthorp/4489424 to your computer and use it in GitHub Desktop.
var myDictionary = new Dictionary<string,object> {{"bar", 1}};
var cmd = connection.CreateCommandWithNamedParameters("select * from table where foo = ?bar", myDictionary);
var reader = cmd.ExecuteReader();
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using System.Text.RegularExpressions;
namespace Codes
{
internal static class OdbcConnectionExtensions {
static readonly Regex NamedParameterPattern = new Regex(@"\?(\w+)");
public static OdbcCommand CreateCommandWithNamedParameters(this OdbcConnection connection, string sql, IDictionary<string, object> parameters)
{
var cmd = connection.CreateCommand();
var parameterIndex = 0;
cmd.CommandText = NamedParameterPattern.Replace(sql, (m) => {
var key = m.Groups[1].Value;
var value = parameters[key];
var parameterName = string.Format("{0}_{1}", key, parameterIndex++);
if ((value as string) != null || (value as IEnumerable) == null) {
cmd.Parameters.AddWithValue(parameterName, value ?? DBNull.Value);
return "?";
} else {
var enumerable = ((IEnumerable)value).Cast<object>();
var i = 0;
foreach (var el in enumerable) {
var elementName = string.Format("{0}_{1}", parameterName, i++);
cmd.Parameters.AddWithValue(elementName, el ?? DBNull.Value);
}
return string.Join(",", enumerable.Select(_ => "?"));
}
});
return cmd;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment