У меня есть следующий тип кода на моем уровне данных, который можно вызывать из консольного приложения, приложения Windows и т. д., при этом правильная строка подключения считывается из соответствующего файла App.Config вызывающей стороны:
public static udsDataset GetDataset(int datasetID)
{
string connectionString =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string sql = @"select * from Dataset WHERE DatasetID=@datasetID";
using (SqlConnection conn = new SqlConnection(connectionString))
{
// Dapper query:
return conn.Query<udsDataset>(sql, new {datasetID } ).First();
}
}
Теперь я хочу вызвать этот же код из хранимой процедуры SQLCLR (в базе данных, где существуют эти таблицы), где обычно используется контекстное подключение:
using(SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
// etc etc etc
}
Самый очевидный подход, который приходит на ум, — перегрузить функцию:
public static udsDataset GetDataset(int datasetID)
{
string connectionString =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connectionString))
{
return GetDataset(datasetID, conn);
}
}
public static udsDataset GetDataset(int datasetID, SqlConnection conn)
{
// caller is responsible for closing and disposing connection
string sql = @"select * from Dataset WHERE DatasetID=@datasetID";
return conn.Query<udsDataset>(sql, new {datasetID } ).First();
}
Таким образом, приложения с App.Config могут вызывать версию без подключения, а SQLCLR может вызывать версию, требующую SqlConnection.
Это «кажется нормальным», но необходимость писать один и тот же стиль перегрузки для каждой похожей функции заставляет чувствовать себя неправильно.