Есть у меня программа, которой я могу подключаться к БД SQL, запускать процедуру на SQL сервере с параметрами, и получать ответ. Ответ это обычно список из одного столбца и нескольких строк.
string ConString = "Server=servname;Database=DB;Trusted_Connection=True;"; //строка подключения к БД с использованием Windows авторизации
using (SqlConnection connection = new SqlConnection(ConString))
{
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = string.Format(@"DECLARE @return_value int
EXEC @return_value = [dbo].[Match]
@FN_Client = N'{0}',
@LN_Client = N'{1}',
@MN_Сlient = N'{2}'
", fn, sn, mn);//текст запроса
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader[0].ToString());
}
return;
}
}
Хочу создать класс, и метод, чтобы не плодить много кода. Подскажите пожалуйста, как можно засунуть в метод мой код, чтобы на выходе получить список?
Не используйте String.Format для построения SQL-запросов, это небезопасно. Вместо этого, используйте параметры.
Для вызова хранимой процедуры не обязательно составлять запрос EXEC вручную, можно установить тип запроса CommandType.StoredProcedure, тогда достаточно написать имя процедуры
Метод для вызова процедуры, возвращающей список строковых значений, можно реализовать как-то так:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
public static IEnumerable<string> ExecuteProcedure(string sql, params SqlParameter[] args)
{
SqlConnection con = new SqlConnection(con_str);
con.Open();
using (con)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sql;
cmd.Connection = con;
for(int i=0;i<args.Length;i++)
{
cmd.Parameters.Add( args[i]);
}
SqlDataReader rd = cmd.ExecuteReader();
using (rd)
{
DataTable dt = new DataTable();
dt.Load(rd);
var results = from myRow in dt.AsEnumerable()
select myRow[0].ToString();
return results;
}
}
}
Использование:
var collection = ExecuteProcedure("dbo.[Match]",
new SqlParameter("FN_Client", fn),
new SqlParameter("LN_Client ", ln),
new SqlParameter("MN_Сlient ",mn));
foreach (var s in collection ) Console.WriteLine(s);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости