通用数据库字段的数据类型
本文关键字:数据类型 字段 数据库 | 更新日期: 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提供一个逗号分隔的列表,如果您想将基于相同构造的数据附加到列表中,请执行以下
如果你只想要字段名,这有意义吗。。?