在c#中使用函数按字段名称返回数据库值索引

问题描述:

我想用一个函数从表中返回值,我不能决定什么是最好的方法。使用SqlDataReader,字典,字符串数组? 当调用函数时,我需要引用字段名字符串的数据。在c#中使用函数按字段名称返回数据库值索引

public SqlDataReader staffInfo(string field, string Username) 
    { 
     string chk_PR = this.Is_PR_Staff(Username) == true ? BW_Config.default_postroom_staff : ""; 

     string strDBConn = db.getDBstring(Globals.booDebug); 
     SqlConnection conn = new SqlConnection(strDBConn); 

     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = "SELECT " + field + " FROM BW_GetStaffInfo('" + Username + "', '" + chk_PR + "')"; 
      cmd.Connection = conn; 
      conn.Open(); 

      SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

      if (reader.Read()) 
      { 
       return reader; 
      } 
      else 
      { 
       return null; 
      } 
     } 
    } 

使用功能:

SqlDataReader userInfo = User.staffInfo("StaffCode, GroupIDs, Perms", User.getUsername()); 

string staffCode = userInfo["StaffCode"].ToString()); 

它的工作原理,但奇怪的问题,它会永远循环下去,有时.. 我想类似的方法,其中它在做同样的事情,但此时它可以处理空值和如果可能,使用替代字典或字符串数​​组这样做的有效方法?

谢谢

+0

也对'SqlDataReader'使用'using'语句,然后返回'SqlDataReader'对象。或者如果你愿意,你也可以返回一个'DataTable'对象。 –

+0

请使用参数化查询来避免[SQL注入](https://www.owasp.org/index.php/SQL_Injection)黑客入侵。你的方法公开地邀请潜在的攻击者传入类似“无”的东西; - 注释掉原始查询的其余部分。 – ryanyuyu

这怎么回事?我从我的vb代码调整它,我不知道是否有语法错误,但你应该知道它的要点。 ;)

public Dictionary<String, Object> staffInfo(string field, string Username) 
{ 
    string chk_PR = this.Is_PR_Staff(Username) == true ? BW_Config.default_postroom_staff : ""; 

    string strDBConn = db.getDBstring(Globals.booDebug); 
    SqlConnection conn = new SqlConnection(strDBConn); 

    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.CommandText = "SELECT " + field + " FROM BW_GetStaffInfo('" + Username + "', '" + chk_PR + "')"; 
     cmd.Connection = conn; 
     conn.Open(); 

     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     if (reader.Read()) 
     { 
      Dictionary<String, Object> row = new Dictionary<String, Object>; 
      Object obj = nothing; 
      for (i = 0; i < reader.FieldCount; i++){ 
       obj = reader.GetValue(i); 
       if (IsDBNull(obj)){ 
        obj = ""; 
       } 
       row.add(reader.GetName(i), obj); 
      } 
      return row; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

而不是SqlDataReader,数组或字典 - 我会选择Dapper。 Dapper是miro ORM。 Stackexchange构建它并使用它。简单地说,它可以让你:

执行查询,结果

简单的例子映射到一个强类型列表假设一个Employee类/表。

public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Designation { get; set; } 
    } 

    using (IDbConnection db = new SqlConnection("SOME CONNECTION STRING") 
    { 
     var employees = db.Query<Employee>("SELECT * FROM EMPLOYEE").ToList(); 
    }