我对c#很陌生,试图让事情变得混乱。我习惯在iSeries(RPG)上编码,所以c#对我来说是一个非常不同的概念。
我有一个存储过程,它根据匹配的行返回一行(或多行)数据。
想象一下,我的表用户包含以下列:
UserId, CompanyId, FirstName, LastName, CompanyAdmin, AccountStatus, UserName.
我有一个存储过程,它返回所有这些列,其中有匹配的公司ID(即.. Select * from users where CompanyId = 1
)。
我创建了一个具有上述匹配字段的类以及相应的get / set方法(即。public int UserId {get; set;}
等)。
我使用过SqlDataReader
并尝试使用来自阅读器的数据从我的班级加载每个字段,但是我收到了错误
'reader [“UserName”]'抛出了类型
的异常'System.InvalidOperationException'对象
{System.InvalidOperationException}
我错过了什么?最终,我想要一个对象,其中定义了我的所有字段,这些字段将与我的SQL Server存储过程中的结果集匹配。
抛出错误的代码看起来像这样..
public partial class Admin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet("ot_Users");
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
using (SqlCommand command = conn.CreateCommand())
{
command.CommandText = "dbo.ot_User_GetByUserName";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@UserName", Environment.UserName);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
ot_Users user = new ot_Users();
while(reader.Read())
{
user.CompanyId = (int) reader["CompanyId"];
user.UserId = (int) reader["UserId"];
user.FirstName = (String) reader["FirstName"];
user.LastName = (String) reader["LastName"];
user.CompanyAdmin = (bool) reader["CompanyAdmin"];
user.AccountStatus = (int) reader["AccountStatus"];
user.UserName = (String) reader["UserName"];
}
reader.NextResult();
CompanyName.Text = user.FirstName.ToString();
}
}
}
答案 0 :(得分:1)
我认为问题可能是将UserName强制转换为char
。 char
仅表示单个字符,字符串表示多个字符,因此您可能希望使用该字符!
那个或UserName
没有正确套装?
答案 1 :(得分:0)
试试这个。
请注意:如果您的sproc返回多行,则仅使用最后一行。因为你只是在一个对象中循环。如果你期望更多的结果,你应该使用List或somekind一个集合对象。
public partial class Admin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet("ot_Users");
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
{
using (SqlCommand command = conn.CreateCommand())
{
command.CommandText = "dbo.ot_User_GetByUserName";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@UserName", Environment.UserName);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
ot_Users user = new ot_Users();
while(reader.Read())
{
user.CompanyId = reader["CompanyId"] != DBNull.Value ? (int)reader["CompanyId"] : 0 ;
user.UserId = reader["UserId"] != DBNull.Value ? (int)reader["UserId"] : 0 ;
user.FirstName = reader["FirstName"] != DBNull.Value ? reader["FirstName"].ToString() : string.Empty;
user.LastName = reader["LastName"] != DBNull.Value ? reader["LastName"].ToString() : string.Empty;
user.CompanyAdmin = reader["CompanyAdmin"] != DBNull.Value ? (bool)reader["CompanyAdmin"] : false ;
user.AccountStatus = reader["AccountStatus"] != DBNull.Value ? (int)reader["AccountStatus"] : 0 ;
user.UserName = reader["UserName"] != DBNull.Value ? reader["UserName"].ToString() : string.Empty;
}
if (user != null)
{
CompanyName.Text = user.FirstName.ToString();
}
}
}
}
}