C# 存储SQL Server存储过程中的有用数据
我对c很陌生,总是试图把事情弄得一团糟。我习惯于在iSeries RPG上编码,所以c对我来说是一个非常不同的概念 我有一个存储过程,它根据匹配的行返回一行或多行数据 假设my table用户持有以下列:C# 存储SQL Server存储过程中的有用数据,c#,sql,sql-server,C#,Sql,Sql Server,我对c很陌生,总是试图把事情弄得一团糟。我习惯于在iSeries RPG上编码,所以c对我来说是一个非常不同的概念 我有一个存储过程,它根据匹配的行返回一行或多行数据 假设my table用户持有以下列: UserId, CompanyId, FirstName, LastName, CompanyAdmin, AccountStatus, UserName. 我有一个存储过程,它返回所有这些列,其中有一个匹配的公司ID,即。。从CompanyId=1的用户中选择* 我已经创建了一个类,其中包
UserId, CompanyId, FirstName, LastName, CompanyAdmin, AccountStatus, UserName.
我有一个存储过程,它返回所有这些列,其中有一个匹配的公司ID,即。。从CompanyId=1的用户中选择*
我已经创建了一个类,其中包含上述匹配字段和适当的get/set方法,即public int UserId{get;set;}等
我使用了SqlDataReader,并试图从类中加载每个字段,其中包含来自该读取器的数据,但出现了一个错误
“reader[UserName]”引发了类型为的异常
“System.InvalidOperationException”对象
{System.invalidoOperationException}
我错过了什么?最终,我想要一个对象,该对象定义了我的所有字段,这些字段将与我的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();
}
}
}
我认为问题可能在于将用户名转换为字符。一个字符只代表一个字符,一个字符串代表多个字符,因此您可能希望使用该字符
或者用户名的大小写不正确?我认为问题可能是将用户名转换为字符。一个字符只代表一个字符,一个字符串代表多个字符,因此您可能希望使用该字符 或者用户名的大小写不正确?试试这个 请注意:如果存储过程返回多行,则只取最后一行。因为你只是在一个对象中循环。如果您期望的结果比应该使用列表或某种集合对象的结果多
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();
}
}
}
}
}
试试这个
请注意:如果存储过程返回多行,则只取最后一行。因为你只是在一个对象中循环。如果您期望的结果比应该使用列表或某种集合对象的结果多
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();
}
}
}
}
}
名字、姓氏和用户名。它们是字符还是不应该是字符串?我现在已经更改了它们,但仍然得到相同的问题字符串,小写字母为s。我们可以从存储过程中看到所选的列吗?也要尽量减少异常的可能性!e、 g.试试reader[名字]!=DBNull.Value?reader[FirstName].ToString:string.Empty;我正要写那封信。。好消息@humpty dumptyfirstname、lastName和用户名。它们是字符还是不应该是字符串?我现在已经更改了它们,但仍然得到相同的问题字符串,小写字母为s。我们可以从存储过程中看到所选的列吗?也要尽量减少异常的可能性!e、 g.试试reader[名字]!=DBNull.Value?reader[FirstName].ToString:string.Empty;我正要写那封信。。好球@humpty dumptyOk-我已经改变了这一点,但仍然会遇到同样的错误,我已经仔细检查了我的ot_User.cs,其中的字段也被定义为字符串。char可能是错误的,但是cast不能成为他报告的错误的来源,因为它发生在读取器获取数据之后。你能发布数据的实际模式吗?你使用的是什么数据库/服务器?好的-我已经更改了它,但仍然得到相同的错误,我已经仔细检查了我的ot_User.cs,其中的字段也被定义为字符串。char可能是错误的,但是cast不能成为他报告的错误的来源,因为它发生在读取器获取数据之后。你能发布数据的实际模式吗?您使用的是什么数据库/服务器?