使用存储过程替换SQL查询

时间:2017-02-08 05:32:34

标签: c# .net winforms sql-server-2016

public DataTable GetRandomQuestionByCateId(string id, int z)
{
    string sql = "SELECT * FROM tblQuestions where CategoryId=@a ORDER BY QId OFFSET @z ROWS  FETCH NEXT 1 ROWS ONLY";

    SqlParameter[] param = new SqlParameter[] 
            { 
                new SqlParameter("@a",id),
                new SqlParameter("@z",z),
            };

    return DAO.GetTable(sql, param);
}

我有这段代码,想要执行存储过程:

CREATE PROCEDURE GetRandomQuest
    (@a int,
     @b int)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM tblQuestions 
    WHERE CategoryId = @a
    ORDER BY QId
        OFFSET @b ROWS 
        FETCH NEXT 1 ROWS ONLY;
END

EXEC dbo.GetRandomQuest `@a=2`, `@b=1`

如何在上述情况下更换它?

3 个答案:

答案 0 :(得分:1)

实际上这个问题发生在DAO.GetTable()方法内部,但问题中没有提供,没问题,你可以修改GetRandomQuestionByCateId的签名来执行存储过程而不是sqlquery。更改将如下所示:

public DataTable GetRandomQuestionByCateId(string id, int z)
{
    DataTable resultData;
    String sqlProcedure = "GetRandomQuest";
    using (SqlConnection cn = new SqlConnection("Your connection string here")) 
    {
       using (SqlCommand cmd = new SqlCommand(sql, cn)) 
       {
          cmd.CommandType = CommandType.StoredProcedure;
          cmd.Parameters.Add("@a", SqlDbType.VarChar, 50).Value = a;
          cmd.Parameters.Add("@z", SqlDbType.int).Value = z;   
          SqlDataAdapter da = new SqlDataAdapter(cmd);
          da.Fill(resultData);          
       }
    }
    return resultData;
}

需要注意的要点是,使用cmd.CommandType = CommandType.StoredProcedure;指定要执行存储过程,在这种情况下,commandText将是过程的名称,您可以像命令一样向命令添加参数你现在在做什么。

答案 1 :(得分:0)

使用此代码:

public DataTable GetRandomQuestionByCateId(string id, int z)
{
    var conn = new SqlConnection(connectionString);
    var cmd = new SqlCommand("GetRandomQuest", conn) ;
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.Add("@a", SqlDbType.VarChar).Value = id;
    cmd.Parameters.Add("@b", SqlDbType.VarChar).Value = z;
    conn.Open();
    DataTable dt = new DataTable();
    dt.Load(cmd.ExecuteReader());
    return dt;
}

答案 2 :(得分:0)

  public DataTable GetRandomQuestion(int id, int z)
    {
        ArrayList sqlParameterArrayList = new ArrayList();

        SqlParameter sqpID = new SqlParameter("a", SqlDbType.Int);
        sqpID.Value = id;
        sqlParameterArrayList.Add(sqpID);

        SqlParameter sqpZ = new SqlParameter("b", SqlDbType.Int);
        sqpZ.Value = z;
        sqlParameterArrayList.Add(sqpZ);

        return DAO.GetTable("GetRandomQuest", sqlParameterArrayList);
    }

我将id的数据类型更改为int,因为这是您在存储过程中所期望的。只需根据需要进行更改。希望这会有所帮助。