我正在尝试从我的数据库返回一个数据对象,以便我可以访问(例如)我的ASP.NET网站中的客户ID。在客户登录对象时返回。但是,我收到了错误:
'Invalid attempt to read when no data is present.'
我已经在数据库(执行我的存储过程)上完成了一个sql查询,它返回了正确的信息,所以我知道它就在那里。我只能假设以下方法有问题:
using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using (SqlCommand sqlComm = new SqlCommand("Select_Customer_By_UserName_And_Password", sqlConn))
{
sqlComm.Connection.Open();
try
{
sqlComm.CommandType = CommandType.StoredProcedure;
sqlComm.Parameters.Add("@Username", SqlDbType.NVarChar, 25).Value = pUsername;
sqlComm.Parameters.Add("@Password", SqlDbType.NVarChar, 25).Value = pPassword;
using (SqlDataReader sqlDR = sqlComm.ExecuteReader(CommandBehavior.SingleRow))
{
if (sqlDR.HasRows)
{
//Creating the new object to be returned by using the data from the database.
return new Customer
{
CustomerID = Convert.ToInt32(sqlDR["CustomerID"])
};
}
else
return null;
}
}
catch (Exception)
{
throw;
}
finally
{
sqlComm.Connection.Close();
}
}
}
答案 0 :(得分:3)
您需要调用sqlDR.Read()
,否则“记录指针”将指向记录。 HasRows
仅表示您实际可以阅读的行。要阅读每一行(或只是第一行),您需要拨打Read
一次或while
循环。
例如:
if (reader.HasRows)
{
while (reader.Read())
...
}
您的代码应为:
using (SqlDataReader sqlDR = sqlComm.ExecuteReader(CommandBehavior.SingleRow))
{
if (sqlDR.Read())
{
//Creating the new object to be returned by using the data from the database.
return new Customer
{
CustomerID = Convert.ToInt32(sqlDR["CustomerID"])
};
}
else
return null;
}
顺便说一下:祝贺使用using
和参数化查询!