Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用存储过程替换SQL查询_C#_.net_Winforms_Sql Server 2016 - Fatal编程技术网

C# 用存储过程替换SQL查询

C# 用存储过程替换SQL查询,c#,.net,winforms,sql-server-2016,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 SqlParamete

我有这个代码段,希望执行一个存储过程,如下所示:

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`

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

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

  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);
    }

使用
cmd.CommandType=CommandType.StoredProcess需要注意的要点您指定要执行一个存储过程,在这种情况下,commandText将是该过程的名称,您可以像当前一样向命令添加参数。

要替换什么?您的问题不够清楚,也令人困惑。
I
想执行StoredProcess而不是sqlquery。@ParasMaharjan那么您想知道代码中要做哪些更改吗?是的,如果该帮助很容易通过谷歌搜索。
  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);
    }
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;
}