从DataReaderI 返回数据时,通常会使用序号引用DataReader来获取相关列:
if (dr.HasRows)
Console.WriteLine(dr[0].ToString());
Run Code Online (Sandbox Code Playgroud)
要么
if (dr.HasRows)
Console.WriteLine(dr.GetString(0));
Run Code Online (Sandbox Code Playgroud)
要么
if (dr.HasRows)
Console.WriteLine((string)dr[0]);
Run Code Online (Sandbox Code Playgroud)
我一直这样做是因为我在早期阶段被告知使用dr["ColumnName"]或更优雅的索引方式会导致性能下降.
然而,尽管对数据实体的所有引用都变得越来越强烈,但我对此感到更加不安.我也知道上面没有检查DBNull.
从数据库中返回数据最有效的方法是DataReader什么?
我似乎在我的代码中写了这么多:
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
result = new User((int)reader["UserId"], reader["UserName"].ToString());
}
if (reader.Read())
{
throw new DataException("multiple rows returned from query");
}
}
Run Code Online (Sandbox Code Playgroud)
有一些内置的方法可以做到这一点我不知道吗?
如何处理多个ResultSet,每个ResultSet有多个行?NextResult()打破while循环的调用.
我的一些SP返回多个ResultSet.我正在处理这些,NextResult()但是当我这样做并且我的SP只有一个ResultSet时,我看到带有Read()的while循环完成后只剩下第一行.
没有调用NextResult()我得到第一个ResultSet的所有行,但当然第二个和后续的ResultSet不会被处理?
using (IDataReader reader = storedProcedure.ExecuteReader(
CommandBehavior.CloseConnection, parameterNames as string[], arguments))
{
while (reader.Read())
{
ArrayList row = new ArrayList();
for (int j = 0; j < reader.FieldCount; ++j)
{
object rowValue = reader.GetValue(j);
row.Add(rowValue);
}
reader.NextResult();//next resultset, breaks out of the while
}
}
Run Code Online (Sandbox Code Playgroud) 在我的数据库表布局中,有一个列类型为hierarchyid(列索引= 4).在尝试设置新环境(从XEN服务器创建的虚拟Web服务器),然后运行该站点时,我遇到了这个问题:
异常消息:DataReader.GetFieldType(4)返回null.异常数据:System.Collections.ListDictionaryInternal
我做了一些搜索,发现已经有一些话题了(比如在MSDN上).
但即使我添加了C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll库,似乎结构SqlHierarchyId中的db类型也无法识别.
"DataReader.GetFieldType(4)返回null的异常"仍然被抛出.
注意:如果我将VS2010中的C#软件包安装到环境(Windows Server 2008 RC2)上,问题将得到解决,但我的老板不接受,因为这纯粹是一个简单的Web服务器.
我有以下能够映射Reader到简单对象的代码.麻烦在于对象是复合的,它无法映射.如果它是一个类本身,我无法通过检查属性来执行递归
prop.PropertyType.IsClass
as Type需要调用DataReaderMapper().有关如何实现这一点或其他方法的任何想法?此外,目前我不想使用任何ORM.
public static class MapperHelper
{
/// <summary>
/// extension Method for Reader :Maps reader to type defined
/// </summary>
/// <typeparam name="T">Generic type:Model Class Type</typeparam>
/// <param name="dataReader">this :current Reader</param>
/// <returns>List of Objects</returns>
public static IEnumerable<T> DataReaderMapper<T>(this IDataReader dataReader)where T : class, new()
{
T obj = default(T);
//optimized taken out of both foreach and while loop
PropertyInfo[] PropertyInfo;
var temp = typeof(T);
PropertyInfo = temp.GetProperties();
while (dataReader.Read())
{
obj = …Run Code Online (Sandbox Code Playgroud) 我试图在我的Windows 8商店应用程序中读取文件.这是我用来实现此目的的代码片段:
if(file != null)
{
var stream = await file.OpenAsync(FileAccessMode.Read);
var size = stream.Size;
using(var inputStream = stream.GetInputStreamAt(0))
{
DataReader dataReader = new DataReader(inputStream);
uint numbytes = await dataReader.LoadAsync((uint)size);
string text = dataReader.ReadString(numbytes);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在行中抛出一个例外:
string text = dataReader.ReadString(numbytes);
Run Code Online (Sandbox Code Playgroud)
执行消息:
No mapping for the Unicode character exists in the target multi-byte code page.
Run Code Online (Sandbox Code Playgroud)
我怎么得到这个?
是
dataReader[i]
Run Code Online (Sandbox Code Playgroud)
在逻辑上相当于
dataReader.GetValue(i)
Run Code Online (Sandbox Code Playgroud)
它们是一样的吗?他们不一样吗?是否存在一种适合另一种情况的情况?
有不同的记录:
- 获取位于指定索引处的列
- 返回指定字段的值.
但是当我使用它们时,它们都会返回该字段的值."获得专栏"是什么意思?"归还一个领域的价值"是什么意思?
奖金Chatter:
我打电话的时候:
reader[i];
reader.GetValue(i);
reader.GetString(i);
Run Code Online (Sandbox Code Playgroud)
我String每次都得到一个
为什么在将0转换为整数时SqlDataReader会抛出异常?
?dataReader(3)
0 {Short}
Short: 0
?dataReader.GetInt16(3)
0
?dataReader.GetInt32(3)
{"Specified cast is not valid."}
_HResult: -2147467262
_message: "Specified cast is not valid."
Data: {System.Collections.ListDictionaryInternal}
HelpLink: Nothing
HResult: -2147467262
InnerException: Nothing
IsTransient: False
Message: "Specified cast is not valid."
Source: "System.Data"
StackTrace: " at System.Data.SqlClient.SqlBuffer.get_Int32()
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)"
TargetSite: {Int32 get_Int32()}
Run Code Online (Sandbox Code Playgroud) 我正在研究我的第一个ASP.Net应用程序,并且似乎遇到了很多障碍(主要是在WinForms背景下,最近有一个MVC5项目).
我正在使用OracleCommand并执行我的查询成功建立数据库连接,但是当我尝试读取行时,我Column contains NULL value在第二行获取了一个odr.GetDecimal(1).任何人都知道在阅读OracleDataReader时如何处理空值?
以下是我的代码:
List<YearsOfService> yearsOfService = new List<YearsOfService>();
string SQL = "SELECT SCHOOL_YEAR as YEAR, " +
"TOTAL_SERVICE_CREDIT as ServiceCredited, " +
"RETIREMENT_SALARY as Salary, " +
"SOURCE_VALUE as CoveredEmployer " +
"FROM " + Schema + ".RANDOM_ORACLE_TABLE a " +
"WHERE MEMBER_ACCOUNT_ID = :memberAccountId";
DbConnection dbc = new DbConnection();
OracleCommand cmd = dbc.GetCommand(SQL);
cmd.Parameters.Add(new OracleParameter("memberAccountId", memberAccountId));
OracleDataReader odr = cmd.ExecuteReader();
int counter = 0;
if (odr.HasRows)
{
while (odr.Read())
{ …Run Code Online (Sandbox Code Playgroud) 当使用DataReader对象通过存储过程从数据库(例如SQL Server)访问数据时,在执行之前添加到Command对象的任何输出参数在读取后都不会被填充.我可以很好地读取行数据,以及所有输入参数,但不能读取输出参数.
datareader ×10
.net ×5
c# ×5
ado.net ×3
asp.net ×1
file-io ×1
null ×1
oracle ×1
parameters ×1
sql ×1
sql-server ×1
windows-8 ×1