代码之家  ›  专栏  ›  技术社区  ›  Sk93

直接从C调用SQL函数#

  •  9
  • Sk93  · 技术社区  · 14 年前

    我需要对将返回零或一的数据库运行查询 (检查是否存在特定标准)。 我得到的技术规格说明是,我应该创建一个存储过程,它将返回一行,其中一个列名为“result”,它将包含0或1的位值。 不过,我不确定存储过程是否是最好的方法,但我有点不确定,所以我想征求您的意见。 我能想到的两个选择是:

    1:创建一个执行查询并返回位的SQL标量值函数。 然后可以使用“text”sqlcommand对象直接从.NET客户端应用程序内部调用它,它将从“executescalar()”方法返回bool。

    2:按照技术规范中的描述创建存储过程。 然后,将以正常方式从.NET客户端应用程序调用此函数,并返回一个包含位值的数据表,其中包含一行和一列。

    对我来说,选择一似乎是最好的。不过,我后脑勺有句话说这不是个好主意。

    请你提出你的意见,帮助我减轻忧虑好吗?:)

    干杯, 伊恩

    6 回复  |  直到 7 年前
        1
  •  7
  •   TcKs    14 年前

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

        2
  •  14
  •   codingbadger    14 年前

    使用执行存储过程 Excel() 方法。然后可以将结果强制转换为布尔值。

    例如

       SqlConnection con = new SqlConnection(connectionString);
        SqlCommand com = new SqlCommand("Execute dbo.usp_MyStoredProc", con);
        return (Boolean)com.ExecuteScalar();
    
        3
  •  8
  •   Community chadoh    7 年前

    这对我有效,基于这个答案 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;
    
        4
  •  1
  •   deostroll    14 年前

    我想这取决于相应的db函数(sp/udf)必须执行的逻辑。

    例如,如果我们对特定DB函数执行的次数感兴趣,我们肯定需要对各种表进行一些数据操作和更新。因此,我们必须在这里寻找存储的过程。如果是一个简单的检索,一个UDF就可以了。

        5
  •  0
  •   kamahl    14 年前

    从长远来看,用存储过程解决问题更好,因为它更灵活和适应性更强

        6
  •  0
  •   Sk93    7 年前

    我使用这个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
    

    这是我的密码

    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代码跳过了函数