C# 使用SqlDataReader

C# 使用SqlDataReader,c#,sql-server,C#,Sql Server,我见过一些人使用SqlDataReader从数据库中获取数据 reader["Test"].ToString(); ... 以及其他 reader.GetString(0); ... 有什么不同吗?还是归结为个人偏好 很明显: 当您知道返回的数据的列名时,应该使用第一个。对我来说,最好是第二列,因为列顺序可以更改。在这种情况下,您也可以稍后转换返回对象的数据类型 当您不知道这些名称(或者甚至列也没有名称)但可以确保访问的列的确切数据类型时,第二种方法更可取。若列数据类型不匹配,则会出现异常

我见过一些人使用
SqlDataReader
从数据库中获取数据

reader["Test"].ToString();
...
以及其他

reader.GetString(0);
...
有什么不同吗?还是归结为个人偏好

很明显:

  • 当您知道返回的数据的列名时,应该使用第一个。对我来说,最好是第二列,因为列顺序可以更改。在这种情况下,您也可以稍后转换返回对象的数据类型
  • 当您不知道这些名称(或者甚至列也没有名称)但可以确保访问的列的确切数据类型时,第二种方法更可取。若列数据类型不匹配,则会出现异常。因此,如果您不能按名称访问colmn,并且不能确定确切的数据类型,那么最好使用
    GetValue
    而不是
    GetString
    和其他类型化方法。对我来说,只有当您的查询类似于“从sometable中选择x,sum(y)”-即第二列没有名称,因此您无法按名称访问它时,这种访问数据的方法才真正有用
考虑到性能-按名称访问需要稍长的时间,因为在内部按索引访问是必要的

public override object this[int i]
{
    get
    {
        return this.GetValue(i);
    }
}
而通过名称访问则是

public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}
因此,通过名称访问首先调用
GetOrdinal

但在实际应用中,这种差异是完全可以忽略的。

非常明显:

  • 当您知道返回的数据的列名时,应该使用第一个。对我来说,最好是第二列,因为列顺序可以更改。在这种情况下,您也可以稍后转换返回对象的数据类型
  • 当您不知道这些名称(或者甚至列也没有名称)但可以确保访问的列的确切数据类型时,第二种方法更可取。若列数据类型不匹配,则会出现异常。因此,如果您不能按名称访问colmn,并且不能确定确切的数据类型,那么最好使用
    GetValue
    而不是
    GetString
    和其他类型化方法。对我来说,只有当您的查询类似于“从sometable中选择x,sum(y)”-即第二列没有名称,因此您无法按名称访问它时,这种访问数据的方法才真正有用
考虑到性能-按名称访问需要稍长的时间,因为在内部按索引访问是必要的

public override object this[int i]
{
    get
    {
        return this.GetValue(i);
    }
}
而通过名称访问则是

public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}
因此,通过名称访问首先调用
GetOrdinal

但在实际应用中,这种差异是完全可以忽略的。

非常明显:

  • 当您知道返回的数据的列名时,应该使用第一个。对我来说,最好是第二列,因为列顺序可以更改。在这种情况下,您也可以稍后转换返回对象的数据类型
  • 当您不知道这些名称(或者甚至列也没有名称)但可以确保访问的列的确切数据类型时,第二种方法更可取。若列数据类型不匹配,则会出现异常。因此,如果您不能按名称访问colmn,并且不能确定确切的数据类型,那么最好使用
    GetValue
    而不是
    GetString
    和其他类型化方法。对我来说,只有当您的查询类似于“从sometable中选择x,sum(y)”-即第二列没有名称,因此您无法按名称访问它时,这种访问数据的方法才真正有用
考虑到性能-按名称访问需要稍长的时间,因为在内部按索引访问是必要的

public override object this[int i]
{
    get
    {
        return this.GetValue(i);
    }
}
而通过名称访问则是

public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}
因此,通过名称访问首先调用
GetOrdinal

但在实际应用中,这种差异是完全可以忽略的。

非常明显:

  • 当您知道返回的数据的列名时,应该使用第一个。对我来说,最好是第二列,因为列顺序可以更改。在这种情况下,您也可以稍后转换返回对象的数据类型
  • 当您不知道这些名称(或者甚至列也没有名称)但可以确保访问的列的确切数据类型时,第二种方法更可取。若列数据类型不匹配,则会出现异常。因此,如果您不能按名称访问colmn,并且不能确定确切的数据类型,那么最好使用
    GetValue
    而不是
    GetString
    和其他类型化方法。对我来说,只有当您的查询类似于“从sometable中选择x,sum(y)”-即第二列没有名称,因此您无法按名称访问它时,这种访问数据的方法才真正有用
考虑到性能-按名称访问需要稍长的时间,因为在内部按索引访问是必要的

public override object this[int i]
{
    get
    {
        return this.GetValue(i);
    }
}
而通过名称访问则是

public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}
因此,通过名称访问首先调用
GetOrdinal


但是在real应用程序中,这种差异是完全可以忽略的。

使用字段名而不是索引总是有意义的,因为如果SQL语句中字段的顺序发生变化,您可能会遇到一些麻烦


我更喜欢使用这种方式:

使用字段名而不是索引总是有意义的,因为如果SQL语句中字段的顺序发生变化,您可能会遇到一些问题


我更喜欢使用这种方式:

使用字段名而不是索引总是有意义的,因为如果SQL语句中字段的顺序发生变化,您可能会遇到一些问题


我更喜欢使用这种方式:

使用字段名而不是索引总是有意义的,因为如果SQL语句中字段的顺序发生变化,您可能会遇到一些问题


我更喜欢使用这种方式:

这样做时最好使用第一个示例。如果列顺序发生更改,则很有可能出错。通常最好避免在任何时候使用硬编码索引。这样做时最好使用第一个示例。如果列顺序发生更改,则很有可能出错。通常最好避免在任何时候使用硬编码索引。当然