1

私はC#が初めてで、物事を混乱させようとしています。私は iSeries (RPG) でのコーディングに慣れているので、c# は私にとって非常に異なる概念です。

一致する行に応じてデータの行 (または行) を返すストアド プロシージャがあります。

テーブルusersが次の列を保持しているとします。

UserId, CompanyId, FirstName, LastName, CompanyAdmin, AccountStatus, UserName.

Select * from users where CompanyId = 1一致する会社 ID (つまり.. )があるこれらの列をすべて返すストアド プロシージャがあります。

public int UserId {get; set;}上記の一致するフィールドと適切な 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();
            }
        }
    }
4

2 に答える 2

0

これを試して。

注意: sproc が複数の行を返す場合、最後の行のみが取得されることに注意してください。オブジェクトのみをループしているためです。リストまたは何らかのコレクションオブジェクトを使用する必要があるよりも多くの結果を期待している場合。

 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();
                }
            }
        }
    }
}
于 2013-10-23T15:29:16.703 に答える