Вызов функций 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#, пропускает функции