2016-02-26 43 views
-2

當我現在有一個webconfig即有如下鍵和值<add key="AuthRoles" value="test1;test2;test3;test4" />「必須聲明變量」。我目前有以下代碼。運行時,我收到以下錯誤Must declare the scalar variable "@roleId".我正在運行我的C#代碼來查詢SQL數據庫

CODE

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".

+1

怎麼樣'IN'語句來代替? –

+1

@Adam你不能真正使用'IN'參數。 – CodeCaster

+0

@CodeCaster - 好點。 –

回答

1

這裏有幾個問題:

  1. 首先你正在使用cmdTxt產生命令你做之前的所有附加你的需要。在「new SqlCommand(cmdTxt.ToString(),con);」之後修改cmdTxt毫無意義。因爲命令文本已經在石
  2. 您應該使用roleId1,roleId2等,您不能重新使用相同的名稱設置。嘗試cmd.Parameters.AddWithValue(「@ roleId」+ x.ToString(),authGroup [x]);
  3. 你有一個錯字:roleIdr VS角色ID
+0

好點鐸感謝 – EasyE

1

創建命令中需要到什麼地方之前添加添加一行權利。我在這裏展示了一種方式...如果你想要一個循環,你可以做一個循環。第一行僅用於上下文。

cmdTxt.Append(" WHERE EmployeeID = @EmployeeId AND RoleId = @roleId"); 
cmdTxt.Append(" AND RoleID IN ('"+authorizedGroup.Replace(";","','")+"')"); 
+0

這就是做藏漢一個好辦法 – EasyE

+0

和角色ID = @roleId和角色ID在(......)沒有任何意義.... –

+0

@TudorCarean - 你是正確的 - OP必須弄清楚自己想要什麼 - 我想'和角色ID = @ roleId'是神器,應該是取出來,但我不能從quesiton – Hogan

0
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) 
相關問題