通用数据库字段的数据类型

本文关键字:数据类型 字段 数据库 | 更新日期: 2023-09-27 18:25:15

我正在尝试运行ExecuteReader()返回的行的所有字段,请参阅此处:

SqlCommand cmd = new SqlCommand(@"select * from People;", conn);
rdr = cmd.ExecuteReader();
while (rdr.Read()) 
{
    foreach (Object i in rdr) 
    {
        Console.WriteLine(i.ToString() + " ");
    }
}

此输出到控制台:

System.Data.Common.DataRecordInternal

我应该放什么而不是对象,因为有些字段是数值字段(可能是内部转换为int),有些字段是arevarchar字段(可能内部转换为字符串)。我确实尝试了string,但这在数值字段上引发了一个错误。同样,使用类型var也不会编译。

谢谢。

通用数据库字段的数据类型

迭代foreach (object i in rdr)时,迭代的是行,而不是列。有关数据读取器的GetEnumerator()方法,请参阅文档。这就是ToString重写返回System.Data.Common.DataRecordInternal的原因:您对整个数据记录调用ToString(),而不仅仅是它的一个值。

要迭代读卡器当前行的,请改为调用GetValues()方法;该返回与相对应的对象数组用当前行的值填充对象数组:

while (rdr.Read())  
{
    var items = new object[rdr.FieldCount];
    rdr.GetValues(items);
    foreach (object i in items)  
        Console.WriteLine(i.ToString() + " "); 
}

通常在执行查询时,您可以准确地知道列的数量、名称和类型。我可以看到这样一种情况:数字或列返回了更改,甚至返回了它们的名称,但没有返回类型。您可以添加一些这样的逻辑(使用这些有用的扩展):

   while (reader.Read())
    {
        var myObj = new MyType()
        {
            MyNumberValue = reader.GetInt32(0),
            MyStringValue = reader.GetString(1)
        };
        var optValue = default(string);
        reader.TryGetValue("optColName", out optValue);
        myObj.OptionalString = optValue;
    }

这将为每一行构建一个CCD_ 8的对象。

    private class MyType
    {
        public int MyNumberValue { get; set; }
        public string MyStringValue { get; set; }
        public string OptionalString { get; set; }
    }

让我们假设您的表中有3个字段

        Id     int,
        Name   nvarchar(64),
        Family nvarchar(64),
        Salary bigint

现在你必须阅读每个字段

        var rdr = cmd.ExecuteReader();
        while (rdr.Read()) {
            if (!(rdr["Id"] is DBNull))
            {
                Console.WriteLine(rdr["Id"] + " ");
            }
            if (!(rdr["Name"] is DBNull))
            {
                Console.WriteLine(rdr["Name"] + " ");
            }
            if (!(rdr["Family"] is DBNull))
            {
                Console.WriteLine(rdr["Family"] + " ");
            }
        }

希望得到帮助。

i.ToString()调用.ToString()方法(它是虚拟的),无论i在该迭代中恰好由哪个类实现。

如果i是一个值为5的整数,它应该打印"5"(因为Int32覆盖.ToString()以返回格式化为String的整数值)。

如果i是一个值为"New York"的字符串,它应该打印"New York"(因为String覆盖.ToString()以返回this

编辑:很抱歉,我错过了你迭代的行,而不是字段。试试这个:

rdr = cmd.ExecuteReader();
while (rdr.Read()) 
{
    for (var v = 0; v < rdr.FieldCount; v++)
        Console.WriteLine(rdr[v].ToString() + " ");
}

您也可以执行类似的操作,例如,假设您想要获得所有列名的列表,但不知道基于DataReaders返回的名称。。你可以创建一个列表

List-lstColumns=new List();

for (int intCounter = 0; intCounter < reader.FieldCount; intCounter++)
{
  lstColumns.Add(reader.GetName(intCounter));
  columns.Add(string.Join(",",reader.GetName(intCounter).ToArray().ToString().ToList()));
  Console.WriteLine(lstColumns[intCounter]);
}

处理完lstColumns后,也要处理掉它。

这将为FieldNames提供一个逗号分隔的列表,如果您想将基于相同构造的数据附加到列表中,请执行以下

如果你只想要字段名,这有意义吗。。?