【问题标题】:Load data from datareader从数据读取器加载数据
【发布时间】:2012-05-10 08:16:22
【问题描述】:

我想从我的响应数据读取器对象中读取列名和类型,因为我需要它来实例化一些对象。我想出了这个:

using (db.sqlConnection) {
    db.sqlConnection.Open();
    using (var cmd = new SqlCommand("areaGetStreetTypes", db.sqlConnection)) {
        cmd.CommandType = CommandType.StoredProcedure;
        using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.KeyInfo)) {
            DataTable dt = dr.GetSchemaTable();
            foreach (DataRow myField in dt.Rows) {
                foreach (DataColumn coloana in dt.Columns) {
                    string c1 = coloana.ColumnName;  //column name ???
                    string c2 = coloana.GetType().ToString(); //column type ??
                    Console.WriteLine(c1 + "  " + c2);
                }
            }
        }
    }
}

但不工作。对于每一列返回我想打印(对于初学者)类似:

id_someID int32    
name string    
surname string     
ssn string

我的代码有什么问题?

【问题讨论】:

  • 什么是“不工作”
  • 从文档中可以看到msdn.microsoft.com/en-us/library/…GetSchemaTable 返回一个数据集,其中每行包含列数据。您正在列出该架构数据集的列,而不是行的内容
  • 如何在一个查询中接收数据和架构信息?我如何访问它们中的每一个?
  • 真正的问题是,当我不知道它返回的架构时,如何调用存储过程并显示结果?
  • 是的,我想这是我的问题。

标签: c# .net ado.net database-schema


【解决方案1】:

无需调用 GetSchemaTable 来获取每列的数据类型,因为 Reader 已经拥有所有这些详细信息

SqlCommand cmd = new SqlCommand(strSql, sqlConn);
SqlDataReader sdr;
sdr = cmd.ExecuteReader();
for (int i = 0; i < sdr.FieldCount; i++)
{
    string dataTypeName = sdr.GetDataTypeName(i); // Gets the type of the specified column in SQL Server data type format
    string FullName = sdr.GetFieldType(i).FullName; // Gets the type of the specified column in .NET data type format
    string specificfullname = sdr.GetProviderSpecificFieldType(i).FullName; //Gets the type of the specified column in provider-specific format
    //Now print the values
}   

【讨论】:

  • 模式表是一个基于 0 的数组?如何访问列名?
  • @rhose87 sdr.GetName(i) 会给你列的名称。
  • +1 获取信息。但是为什么要丢弃 for 循环中的最后一列?
【解决方案2】:

我认为你实际上想要类似的东西

DataTable dt = dr.GetSchemaTable();
foreach (DataRow myField in dt.Rows) 
{
    var name = myField["ColumnName"];
    var type = myField["DataTypeName"];
    Console.WriteLine("{0} {1}", name, type);
}                     

【讨论】:

  • 是的。这就是我一直在寻找的答案,现在我必须将 varchar“转换”为字符串。
  • @rhose87 架构集中还有很多其他列,请查看我评论中的链接。有一个叫"DataType",它包含一个.Net 类型映射
  • type = {Name = "String" FullName = "System.String"} @Jodrell 我怎样才能只得到“string”?
  • @rhose87 "{Name = "String" FullName = "System.String"}"Type.ToString() 为 .Net 字符串类型的实例返回的内容。
【解决方案3】:

使用DataColumn.DataType 属性和CommandBehavior.SchemaOnly 枚举成员。

【讨论】:

  • 但我也想接收数据。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多