直接从C#调用SQL函数

Sk9*_*k93 10 sql sql-server stored-procedures user-defined-functions

我要求对数据库运行查询,该数据库将返回零或一(检查特定条件的存在).我已经获得审查的技术规范声明我应该创建一个存储过程,它将返回一行,其中一个名为"result"的列将包含一个0或1的位值.但是,我我不确定存储过程是否是最好的方法,但我有点不确定所以以为我会问你的意见.我能想到的两个选择是:

1:创建一个SQL标量值函数,该函数执行查询并返回一个位.然后可以使用"TEXT"SqlCommand对象直接从.Net客户端应用程序中调用它,它将从"ExecuteScalar()"方法返回一个bool.

2:按照技术规范中的描述创建存储过程.然后以正常方式从.Net客户端应用程序调用此方法,并返回包含位值的单行和单列的DataTable.

对我来说,选项一似乎是最好的.然而,在我脑后的一些事情是说这不是一个好主意.

请您提出您的意见并帮助减轻我的疑虑?:)

干杯,伊恩

cod*_*ger 14

使用ExecuteScalar()方法执行存储过程.然后,您可以将此结果转换为布尔值.

例如

   SqlConnection con = new SqlConnection(connectionString);
    SqlCommand com = new SqlCommand("Execute dbo.usp_MyStoredProc", con);
    return (Boolean)com.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)


小智 9

这对我有用,并且基于这个答案/sf/answers/226278951/使用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;
Run Code Online (Sandbox Code Playgroud)


TcK*_*cKs 7

调用标量值函数是绝对正确的解决方案.