Метод для запроса информации из базы на C#

206
05 августа 2018, 20:20

Есть у меня программа, которой я могу подключаться к БД 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;
            }
        }

Хочу создать класс, и метод, чтобы не плодить много кода. Подскажите пожалуйста, как можно засунуть в метод мой код, чтобы на выходе получить список?

Answer 1
  • Не используйте 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);
READ ALSO
System.ValueType[*,*,*] to byte[*,*,*]

System.ValueType[*,*,*] to byte[*,*,*]

Изначально это был тип array<System::ValueType^, 3>, в массиве содержатся данные картинки(грабятся с камеры), этот плагин написан на с++при передаче...

163
Не могу понять в каком направлении двигаться дальше(PHP) [закрыт]

Не могу понять в каком направлении двигаться дальше(PHP) [закрыт]

Недавно написал простенький движок для сайта: https://githubcom/Trojan4ik/MyLinked-CMS , но не могу понять что на данный момент в моем коде не так, что стоит добавить...

186
Apache 2.4 + php7 + MySql

Apache 2.4 + php7 + MySql

Доброго всем времени суток

206