在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());
它的工作原理,但奇怪的问题,它会永远循环下去,有时.. 我想类似的方法,其中它在做同样的事情,但此时它可以处理空值和如果可能,使用替代字典或字符串数组这样做的有效方法?
谢谢
答
这怎么回事?我从我的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();
}
也对'SqlDataReader'使用'using'语句,然后返回'SqlDataReader'对象。或者如果你愿意,你也可以返回一个'DataTable'对象。 –
请使用参数化查询来避免[SQL注入](https://www.owasp.org/index.php/SQL_Injection)黑客入侵。你的方法公开地邀请潜在的攻击者传入类似“无”的东西; - 注释掉原始查询的其余部分。 –
ryanyuyu