Вызов функций SQL непосредственно из C#

У меня есть требование выполнить запрос к базе данных, которая вернет либо ноль, либо единицу (Проверка на наличие конкретных критериев). Технические спецификации, которые мне дали для обзора, утверждают, что я должен создавать хранимую процедуру, которая вернет одну строку с одним столбцом под названием "результат", который будет содержать битовое значение 0 или 1. Однако я не уверен, что хранимая процедура будет лучшим подходом, но я немного не уверен, поэтому подумал, что спрошу у вас мнения. Пара варианты, которые я могу придумать:

1: Создайте скалярную функцию SQL, которая выполняет запрос и возвращает бит. Затем это может быть вызвано непосредственно из клиентского приложения .Net с помощью объекта SqlCommand "TEXT", и он вернет bool из метода" ExecuteScalar ()".

2: Создайте хранимую процедуру, как описано в технических спецификациях. Затем это будет вызвано из клиентского приложения .Net обычным способом и вернет DataTable с одной строкой и один столбец, который содержит значение бита.

для меня вариант один кажется лучшим. Однако, что-то в моей голове говорит, что это не такая хорошая идея.

пожалуйста, не могли бы вы дать Ваше мнение и помочь облегчить мои заботы? :)

Ура, Иан

6 ответов


вызывающая скалярно-значная функция является абсолютно правильным решением.


выполнить хранимую процедуру с помощью executescalar так() метод. Затем вы можете привести результат этого к логическому значению.

Эл.г

   SqlConnection con = new SqlConnection(connectionString);
    SqlCommand com = new SqlCommand("Execute dbo.usp_MyStoredProc", con);
    return (Boolean)com.ExecuteScalar();

это работает для меня и основано на этом ответе https://stackoverflow.com/a/3232556/1591831 Использование SqlDataAdapter (обратите внимание, что вам не нужно его использовать) и ExecuteScalar (можно использовать ExecuteNonQuery, как показано здесь):

bool res = false;
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
    using (SqlCommand comm = new SqlCommand("dbo.MyFunction", conn))
    {
        comm.CommandType = CommandType.StoredProcedure;

        SqlParameter p1 = new SqlParameter("@MyParam", SqlDbType.Int);
        // You can call the return value parameter anything, .e.g. "@Result".
        SqlParameter p2 = new SqlParameter("@Result", SqlDbType.Bit);

        p1.Direction = ParameterDirection.Input;
        p2.Direction = ParameterDirection.ReturnValue;

        p1.Value = myParamVal;

        comm.Parameters.Add(p1);
        comm.Parameters.Add(p2);

        conn.Open();
        comm.ExecuteNonQuery();

        if (p2.Value != DBNull.Value)
            res = (bool)p2.Value;
    }
}
return res;

Я полагаю, это зависит от логики, которую должна выполнить соответствующая функция db (sp/udf).

Если, например, нас интересует количество выполненных функций конкретной БД, нам определенно нужно будет выполнить некоторые манипуляции с данными и обновления в различных таблицах. Следовательно, мы должны были бы пойти на хранение procs здесь. Если его простой поиск udf будет делать.


решение его с помощью хранимой процедуры лучше в долгосрочной перспективе, потому что его более гибкий и адаптируемый


Я использую эту скалярную функцию sql

CREATE FUNCTION DAYSADDNOWK(@addDate AS DATE, @numDays AS INT)
RETURNS DATETIME
AS
BEGIN
    SET @addDate = DATEADD(d, @numDays, @addDate)
    IF DATENAME(DW, @addDate) = 'sunday'   SET @addDate = DATEADD(d, 1, @addDate)
    IF DATENAME(DW, @addDate) = 'saturday' SET @addDate = DATEADD(d, 2, @addDate)

    RETURN CAST(@addDate AS DATETIME)
END
GO

тогда это мой код C#

using (SqlCommand cmd3 = new SqlCommand("SELECT dbo.DAYSADDNOWK", ClassV.con))
                    ClassV.con.Open();
                    SqlCommand brecord = ClassV.con.CreateCommand();
                    brecord.CommandText = "INSERT INTO TblBorrowRecords VALUES ('" + DGStudents.CurrentRow.Cells[1].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[2].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[4].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[3].Value.ToString() + "','" + DG.CurrentRow.Cells[4].Value.ToString() + "','" + DG.CurrentRow.Cells[5].Value.ToString() + "','" + DG.CurrentRow.Cells[6].Value.ToString() + "','" +System.DateTime.Now.Date.ToShortDateString() + "' , dbo.DAYSADDNOWK(GETDATE(),5) ,null , '" + ClassV.lname.ToString() + ", " + ClassV.fname.ToString() + " " + ClassV.mname.ToString() + "', null, 'Good',null)";
                    var DAYSADDNOWK = brecord.ExecuteScalar();

мой код C#, пропускает функции