Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# SqlDataReader按列名获取值(不是序号)_C#_Sqldatareader - Fatal编程技术网

C# SqlDataReader按列名获取值(不是序号)

C# SqlDataReader按列名获取值(不是序号),c#,sqldatareader,C#,Sqldatareader,使用,我可以通过传入一列的序号来获取该列的值,例如传入read.GetValue(0)时第一列的值,或者传入read.GetValue(1)时第二列的值 在查看这些方法时,我没有看到通过传递列名称(如ColumnID)来获取列值的选项。在我虚构的例子中,我想传入read.GetValueofColumn(“ColumnID”)并读取列中的值(请注意,从方法列表中可以看出,GetValueofColumn方法不存在) 我是否缺少执行此操作的方法或方法?您可以使用GetOrdinal方法获取列的序号

使用,我可以通过传入一列的序号来获取该列的值,例如传入
read.GetValue(0)
时第一列的值,或者传入
read.GetValue(1)
时第二列的值

在查看这些方法时,我没有看到通过传递列名称(如ColumnID)来获取列值的选项。在我虚构的例子中,我想传入
read.GetValueofColumn(“ColumnID”)
并读取列中的值(请注意,从方法列表中可以看出,
GetValueofColumn
方法不存在)


我是否缺少执行此操作的方法或方法?

您可以使用
GetOrdinal
方法获取列的序号,因此您的调用可能是:

read.GetValue(read.GetOrdinal("ColumnID"));

Datareader
有数字(基于位置)方法和文本(基于字段名)方法。因此,使用字段名,可以得到如下值

object value = reader["some field name"];

(假设
reader
datareader

迟交的答案,但是。。。这对我来说一直很有效,我认为这更接近OP想要实现的目标:

using (SqlCommand cmd = new SqlCommand(cmdString, cn))
using (SqlDataReader rs = cmd.ExecuteReader()) {

    if (rs.HasRows) {

        while (rs.Read()) {

            Meeting_DiscussionItems_MX di = new Meeting_DiscussionItems_MX();

            di._Discussion_Item_MX_ID   = (int) rs["Discussion_Item_MX_ID"];
            di._Meeting_ID              = (int) rs["Meeting_ID"];
            di._Discussion_Item_Name    = (string) rs["Discussion_Item_Name"];
            di._Display_Order           = (string) rs["Display_Order"];
            di._Status                  = (string) rs["Status"];
            di._Discussion_Items        = (string) rs["Discussion_Items"];
            di._ETOPS_Items             = (string) rs["ETOPS_Items"];
            di._Followup                = (string) rs["Followup"];
            di._Pinned                  = (string) rs["Pinned"];
            di._Active                  = (string) rs["Active"];

            _Meeting_DiscussionItems_MX.Add(di);
        }

    }
}
您可以使用:

MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);
}
rdr.Close();

其中
id
time
是列名

为方便起见,您可以添加以下帮助程序:

public static string GetString(this SqlDataReader reader, string name) {
    return GetFieldValue<String>(reader, name, (string)null);
}

public static T GetFieldValue<T>(this SqlDataReader reader, string fieldName, T defaultvalue = default(T)) {
    try {
        var value = reader[fieldName];
        if (value == DBNull.Value || value == null)
            return defaultvalue;
        return (T)value;
    } catch (Exception e) {
        //SimpleLog.Error("Error reading databasefield " + fieldName + "| ", e);
    }
    return defaultvalue;
}
publicstaticstringgetstring(这个SqlDataReader读取器,字符串名){
返回GetFieldValue(读取器、名称、(字符串)null);
}
公共静态T GetFieldValue(此SqlDataReader读取器,字符串字段名,T defaultvalue=default(T)){
试一试{
变量值=读取器[字段名];
if(value==DBNull.value | | value==null)
返回默认值;
返回(T)值;
}捕获(例外e){
//SimpleLog.Error(“读取数据库字段“+fieldName+“|”,e)时出错);
}
返回默认值;
}

如您所见,读卡器允许使用字段名,但它返回一个需要转换为正确数据类型的对象。扩展同时处理这两个问题,并在字段为空时添加一个默认值。

尝试“read.GetValue[“ColumnName”]”我已经尝试过了,但不幸的是
GetValue
只接受
int
。为什么不直接获取
dataReader[“ColumnName”]
要查找的值呢?这并不是那么简单。。这里是一个很好的网站,保持在您的阿森纳作品美丽,谢谢;当我不能(8分钟内可以接受答案吗?)时将接受出于性能原因,Microsoft现在建议您在读取循环外调用GetOrdinal,只在循环内调用GetValue(int)。不过,请使用
read.GetFieldValue(read.GetOrdinal(“ColumnID”)
将为您节省此游戏的掷骰时间。只想补充一点,如果select list列使用AS子句来命名具有相同名称的列,则应小心。在这种情况下,外部GetValue()调用最终可能会得到一个可能不同的列的值。True,但是读卡器的其他帮助函数只接受int,因此如果要使用它们,必须调用GetOrdinal(最好在读循环之外)来获得索引,然后可以调用任何函数(包括读卡器)[index]),问题是“通过传递列的名称来获取列的值的选项”,我想我的答案是最简单的。