Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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# ASP.NETC-基于条件设置MySQL查询和参数_C#_Mysql_Asp.net_Parameters_Ado.net - Fatal编程技术网

C# ASP.NETC-基于条件设置MySQL查询和参数

C# ASP.NETC-基于条件设置MySQL查询和参数,c#,mysql,asp.net,parameters,ado.net,C#,Mysql,Asp.net,Parameters,Ado.net,如何根据条件设置MySQL查询和参数 我想要基于“questionSource”的不同查询,如下所示 但是,在我下面的代码中,“cmd”在当前上下文中不存在 或者,我可以为每个条件使用两个不同的函数,并根据需要调用必要的函数,但我认为一定有一种方法可以在连接中使用条件 //validation checks else { string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].Connec

如何根据条件设置MySQL查询和参数

我想要基于“questionSource”的不同查询,如下所示

但是,在我下面的代码中,“cmd”在当前上下文中不存在

或者,我可以为每个条件使用两个不同的函数,并根据需要调用必要的函数,但我认为一定有一种方法可以在连接中使用条件

//validation checks
else
{
    string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    MySqlConnection conn = new MySqlConnection(connStr);

    string questionSource = Session["QuestionSource"].ToString();
    string cmdText = "";

    if (questionSource.Equals("S"))
    {
        cmdText += @"SELECT COUNT(*) FROM questions Q
                    JOIN users U
                    ON Q.author_id=U.user_id
                    WHERE approved='Y'
                    AND role=1
                    AND module_id=@ModuleID";

        MySqlCommand cmd = new MySqlCommand(cmdText, conn);
        cmd.Parameters.Add("@ModuleID", MySqlDbType.Int32);
        cmd.Parameters["@ModuleID"].Value = Convert.ToInt32(Session["TestModuleID"]);
    }
    else if (questionSource.Equals("U"))
    {
        cmdText += "SELECT COUNT(*) FROM questions WHERE approved='Y' AND module_id=@ModuleID AND author_id=@AuthorID;";

        MySqlCommand cmd = new MySqlCommand(cmdText, conn);
        cmd.Parameters.Add("@ModuleID", MySqlDbType.Int32);
        cmd.Parameters["@ModuleID"].Value = Convert.ToInt32(Session["TestModuleID"]);
        cmd.Parameters.Add("@AuthorID", MySqlDbType.Int32);
        cmd.Parameters["@AuthorID"].Value = Convert.ToInt32(Session["UserID"]);
    }

    int noOfQuestionsAvailable = 0;
    int noOfQuestionsWanted = Convert.ToInt32(ddlNoOfQuestions.SelectedValue);

    try
    {
        conn.Open();

        noOfQuestionsAvailable = Convert.ToInt32(cmd.ExecuteScalar());

        if (noOfQuestionsAvailable < noOfQuestionsWanted)
        {
            lblError.Text = "There are not enough questions available to create a test.";
        }
        else
        {
            Session["TestName"] = txtName.Text;
            Session["NoOfQuestions"] = ddlNoOfQuestions.SelectedValue;
            Session["QuestionSource"] = rblQuestionSource.SelectedValue;
            Session["TestModuleID"] = ddlModules.SelectedValue;
            Response.Redirect("~/create_test_b.aspx");
        }
    }
    catch
    {
        lblError.Text = "Database connection error - failed to get module details.";
    }
    finally
    {
        conn.Close();
    }
}

您只需将cmd的声明移到if块之外:

//validation checks
else
{
    string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    MySqlConnection conn = new MySqlConnection(connStr);

    string questionSource = Session["QuestionSource"].ToString();
    string cmdText = "";

    MySqlCommand cmd; // <-- here
    if (questionSource.Equals("S"))
    {
        cmdText += @"SELECT COUNT(*) FROM questions Q
                    JOIN users U
                    ON Q.author_id=U.user_id
                    WHERE approved='Y'
                    AND role=1
                    AND module_id=@ModuleID";

        cmd = new MySqlCommand(cmdText, conn); // remove MySqlCommand  here
        cmd.Parameters.Add("@ModuleID", MySqlDbType.Int32);
        cmd.Parameters["@ModuleID"].Value = Convert.ToInt32(Session["TestModuleID"]);
    }
    else if (questionSource.Equals("U"))
    {
        cmdText += "SELECT COUNT(*) FROM questions WHERE approved='Y' AND module_id=@ModuleID AND author_id=@AuthorID;";

        cmd = new MySqlCommand(cmdText, conn); // remove MySqlCommand  here
        cmd.Parameters.Add("@ModuleID", MySqlDbType.Int32);
        cmd.Parameters["@ModuleID"].Value = Convert.ToInt32(Session["TestModuleID"]);
        cmd.Parameters.Add("@AuthorID", MySqlDbType.Int32);
        cmd.Parameters["@AuthorID"].Value = Convert.ToInt32(Session["UserID"]);
    }

    int noOfQuestionsAvailable = 0;
    int noOfQuestionsWanted = Convert.ToInt32(ddlNoOfQuestions.SelectedValue);

    try
    {
        conn.Open();

        noOfQuestionsAvailable = Convert.ToInt32(cmd.ExecuteScalar());

        if (noOfQuestionsAvailable < noOfQuestionsWanted)
        {
            lblError.Text = "There are not enough questions available to create a test.";
        }
        else
        {
            Session["TestName"] = txtName.Text;
            Session["NoOfQuestions"] = ddlNoOfQuestions.SelectedValue;
            Session["QuestionSource"] = rblQuestionSource.SelectedValue;
            Session["TestModuleID"] = ddlModules.SelectedValue;
            Response.Redirect("~/create_test_b.aspx");
        }
    }
    catch
    {
        lblError.Text = "Database connection error - failed to get module details.";
    }
    finally
    {
        conn.Close();
    }
}

只要将MySqlCommand的声明移到if/else块之外,就可以在执行命令的最后一次尝试中使用它

//validation checks
else
{
    string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    using(MySqlConnection conn = new MySqlConnection(connStr))
    using(MySqlCommand cmd = conn.CreateCommand())
    {
         // Don't need to associate the command to the connection
         // Already done by the CreateCommand above, just need to set
         // the parameters and the command text

         if (questionSource.Equals("S"))
         {
                cmdText = @"....."
                cmd.CommandText = cmdText;
                ....
         }
         else if (questionSource.Equals("U"))
         {
                cmdText = "........."
                cmd.CommandText = cmdText;
                ....
         } 
         try
         {
              conn.Open();
              noOfQuestionsAvailable = Convert.ToInt32(cmd.ExecuteScalar());
               ....
          }
    }
}
还请注意,您应该使用using语句来确保您的连接和命令已正确关闭和释放。

在if之前声明cmd

MySqlCommand cmd = new MySqlCommand("",connStr);
在if的每个部分

cmd.CommandText=cmdText;
其他建议:添加

cmd.Parameters.Add("@ModuleID", MySqlDbType.Int32);
cmd.Parameters["@ModuleID"].Value = Convert.ToInt32(Session["TestModuleID"]);

始终在if之前,因为它在if和else部分中以相同的方式使用

完成,尽管我在下面的行中得到了“使用未分配的局部变量”cmd-“noOfQuestionsAvailable=Convert.ToInt32cmd.ExecuteScalar;”您可以将其初始化为null,如MySqlCommand cmd=null;如果在else块之后cmd仍然为null,则提前中止。我在下面的行中得到“使用未分配的局部变量”cmd-“noofquestionsavable=Convert.ToInt32cmd.ExecuteScalar;”