В настоящее время у меня есть webconfig со следующими ключом и значением <add key="AuthRoles" value="test1;test2;test3;test4" />. В настоящее время у меня есть следующий код. При запуске я получаю следующую ошибку Must declare the scalar variable "@roleId".

КОД

  public bool IsUserAuthorized(string UserID)
    {
        bool isAuthed = false;
        try
        {
            string _constring = System.Configuration.ConfigurationManager.ConnectionStrings["connectionDD"].ConnectionString;

            string authorizedGroup = System.Configuration.ConfigurationManager.AppSettings["AuthRoles"].ToString();

            string[] authGroup = authorizedGroup.Split(';');

            using (SqlConnection con = new SqlConnection(_constring))
            {
                try
                {
                    StringBuilder cmdTxt = new StringBuilder();
                    cmdTxt.Append("SELECT EmployeeID, RoleID, RoleDescription");
                    cmdTxt.Append(" FROM vstaffInfo");
                    cmdTxt.Append(" WHERE EmployeeID = @EmployeeId AND RoleId = @roleId");
                    SqlCommand cmd = new SqlCommand(cmdTxt.ToString(), con);

                    cmd.Parameters.AddWithValue("@EmployeeId", UserID);

                    for (int x = 0; x < authGroup.Length; x++)
                    {
                        cmd.Parameters.AddWithValue("@roleIdr", authGroup[x]);

                        if (authGroup.Length != x - 1)
                        {
                            cmdTxt.Append(" OR RoleId = ");
                        }
                    }

                    con.Open();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    rdr.Close();
                    con.Close();
                }

Оператор SQL будет выглядеть так

SELECT EmployeeID, RoleID, RoleDescription
FROM vEmployeeRoleInfo
WHERE EmployeeID = @EmployeeId
AND RoleId = test1
Or RoleId = test2
Or RoleId = test3
Or RoleId = test4

Ошибка

Must declare the scalar variable "@roleId".

-2
EasyE 26 Фев 2016 в 18:37

3 ответа

Лучший ответ

Здесь есть несколько проблем:

  1. Прежде всего, вы используете cmdTxt для создания команды до того, как сделаете все необходимое для добавления. Нет смысла изменять cmdTxt после "new SqlCommand (cmdTxt.ToString (), con);" потому что текст команды уже высечен в камне
  2. Вы должны использовать roleId1, roleId2 и т. Д. Вы не можете повторно использовать одно и то же имя. Попробуйте cmd.Parameters.AddWithValue ("@ roleId" + x.ToString (), authGroup [x]);
  3. у вас есть опечатка: roleIdr vs roleId
1
Tudor Carean 26 Фев 2016 в 15:53

Добавьте строку прямо перед созданием команды, чтобы добавить то, что необходимо, в место. Я показал здесь один способ ... если вы предпочитаете цикл, вы можете сделать цикл. Первая строка предназначена только для контекста.

cmdTxt.Append(" WHERE EmployeeID = @EmployeeId AND RoleId = @roleId");
cmdTxt.Append("  AND RoleID IN ('"+authorizedGroup.Replace(";","','")+"')");
1
Hogan 26 Фев 2016 в 15:47
StringBuilder cmdTxt = new StringBuilder();
            cmdTxt.Append("SELECT EmployeeID, RoleID, RoleDescription");
            cmdTxt.Append(" FROM vstaffInfo");
            cmdTxt.Append(" WHERE EmployeeID = @EmployeeId ");
            SqlCommand cmd = new SqlCommand(cmdTxt.ToString(), con);

            cmd.Parameters.AddWithValue("@EmployeeId", UserID);

            if (authGroup.Length == 1)
            {
                cmdTxt.Append(" AND RoleId = @roleId");
                cmd.Parameters.AddWithValue("@roleId", authGroup[0]);
            }
            else if (authGroup.Length > 1)
            {
                cmdTxt.Append(" AND ( RoleId = @roleId");
                cmd.Parameters.AddWithValue("@roleId", authGroup[0]);
                for (int x = 1; x < authGroup.Length; x++)
                {
                    cmd.Parameters.AddWithValue("@roleId" + x, authGroup[x]);
                    cmdTxt.Append(" OR RoleId = @roleId" + x);
                }
                cmdTxt.Append(")");
            }

            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            rdr.Close();
            con.Close();

Текст команды будет выглядеть ниже

SELECT EmployeeID, RoleID, RoleDescription FROM vstaffInfo WHERE EmployeeID = @EmployeeId AND ( RoleId = @roleId OR RoleId = @roleId1 OR RoleId = @roleId2 OR RoleId = @roleId3)
0
Vinit 26 Фев 2016 в 16:22