0

アプリケーションで SQL データベースの Admins テーブルをチェックし、現在のユーザーが所属する部門の名前を取得しようとしています。その後、別のテーブルを調べて、その部門に属するニュース項目だけを選択したいと考えています。

以下は、私がどのように取り組んでいるのかを示していますが、問題は、(2 番目の SQL クエリ内で使用される) While ループの外側で mydepartment 変数を使用することにあります。

それ以外はすべて機能します。どんな助けでも大歓迎です。

public string username = System.Web.HttpContext.Current.User.Identity.Name.Split('\\')[1];
public string mydepartment;

protected void Page_Load(object sender, EventArgs e)
{
    lblUser.Text = username.ToString();
    SqlConnection myConnection = new SqlConnection();
    myConnection.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFileName=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True";

    myConnection.Open();
    string selectretrieveSQL = ("SELECT * FROM Admins WHERE userid = '" + username.ToString() + "'");
    SqlCommand retrieveinfocmd = new SqlCommand(selectretrieveSQL, myConnection);
    SqlDataReader reader = retrieveinfocmd.ExecuteReader();

    while (reader.Read())
    {
        ListItem newItem = new ListItem();
        newItem.Text = reader["Department"].ToString();
        newItem.Value = reader["userid"].ToString();
        UserIds.Items.Add(newItem);
        mydepartment = reader["Department"].ToString();
        mydepartmentlbl.Text = reader["Department"].ToString();
    }
    reader.Close();

    string selectNewsSQL = ("SELECT * FROM NewsItems WHERE Department = '" + mydepartment + "'");
}
4

2 に答える 2

3

まず、データベース オブジェクトのプロパティを保持するクラスをいくつか作成することを強くお勧めします。

たとえば、管理者は次のようになります。

public class Admin
{
  public string Username { get; set; }
  public string Department { get; set; }

  // .. More properties here
}

次に、面倒な作業を行うメソッドをいくつか作成する必要があります。データベースの初期化から始めます。

static SqlConnection InitializeDatabase(string connectionString)
{
  var connection = new SqlConnection(connectionString);
  connection.Open();

  return connection;
}

したがって、適切な方法を取得できる可能性がありAdminます。

static IEnumerable<Admin> GetAdminsByUsername(SqlConnection connection, 
                                              string username)
{
  var adminList = new List<Admin>();

  // You really should be using stored procedures here instead...
  var query = @"SELECT * FROM Admins WHERE Username = @Username";

  using (var command = new SqlCommand(query, connection))
  {
    command.Parameters.AddWithValue("@Username", username);

    using (var reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
        var adminUsername = reader["Username"].ToString();
        var adminDepartment = reader["Department"].ToString();

        var admin = new Admin
        {
          Username = adminUsername,
          Department = adminDepartment
        };

        adminList.Add(admin);
      }
      reader.Close();

      return adminList;
    }
  }
}

次に、次のPage.Loadようになります。

protected void Page_Load(object sender, EventArgs e)
{
  var connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFileName=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True";

  using(var connection = InitializeDatabase(connectionString))
  {
    var admin = GetAdminsByUsername(connection, username).FirstOrDefault();

    if(admin == null)
    {
      // No admin was found, do something here.
      return;
    }

    var newItem = new ListItem();
    newItem.Text = admin.Department.
    newItem.Value = admin.Username;

    // Keep your controls named consistently, don't use shorthands
    // since you already have IntelliSense to auto-complete them for you

    usernameLabel.Text = admin.Username;
    departmentLabel.Text = admin.Department;
  }

これにより、少なくとも正しい方向に進むことができます。

于 2013-01-16T22:06:14.213 に答える
2

以前の投稿者が言ったことはすべて脇に置いておきますが、そのすべてに同意しますが、提示されたコードは機能しません。その while ループ中に、あなたがしているのは、ある種のリスト ボックスまたはドロップダウンにユーザー情報を入力しているためです (Department asディスプレイとユーザー ID を値として)。

部門に基づいてさらに情報を取得できるようにする場合は、そのリストボックスまたは選択の SelectedIndexChanged イベント (または同様のもの) を処理し、現在選択されているテキスト値を取得してから、その 2 番目のクエリを作成して実行する必要があります

でも; 以前の投稿者のアドバイスに従ってください。ストアド プロシージャを使用する必要はありませんが、クエリでパラメーターを使用する必要があります。厄介な人がl33t';drop table Admins のUserID を渡すことができたらどうなるか想像してみてください。あなたのページはこれを実行します:

SELECT * FROM Admins WHERE userid = 'l33t';drop table Admins;

おっと....あなたの特定のケースでは、ユーザー入力を受け入れていないことは知っていますが、遅かれ早かれ...

お役に立てれば。

于 2013-01-17T01:10:02.837 に答える