Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储SQL Server存储过程中的有用数据_C#_Sql_Sql Server - Fatal编程技术网

C# 存储SQL Server存储过程中的有用数据

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的用户中选择* 我已经创建了一个类,其中包

我对c很陌生,总是试图把事情弄得一团糟。我习惯于在iSeries RPG上编码,所以c对我来说是一个非常不同的概念

我有一个存储过程,它根据匹配的行返回一行或多行数据

假设my table用户持有以下列:

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不能成为他报告的错误的来源,因为它发生在读取器获取数据之后。你能发布数据的实际模式吗?您使用的是什么数据库/服务器?