1

私はプログラミングと使用が初めてで、SQL Server Compactこの個人的なプロジェクトを学んでいるので、どんな支援も大歓迎です。

buttonログインに成功したユーザータイプのアカウントにMain Form応じて、を非表示にしようとしています。

私のデータベースにはusername、と の 3 つの列がpasswordありtype - (this is what I am trying to access for this project)ます。

必要な効果を得るには Main_load を処理する必要があると考えたので、ここにこのコードを配置しました。

    private void Main_Load(object sender, EventArgs e)
    {
        admincontrolbtn.Visible = false;
        conn = new SqlCeConnection("Data Source=Users.sdf; Persist Security Info = False");
        comm = new SqlCeCommand("Select * from [user]", conn);
        reader = comm.ExecuteReader();
        while (reader.Read())
        {
            try
            {
                conn.Open();
                if (reader.GetString(2) == "Administrator")
                {
                    admincontrolbtn.Visible = true;
                }
                else
                {
                    admincontrolbtn.Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                conn.Close();
            }
        }
    }

コードをビルドしたとき、エラーは見つかりませんでした。私は正しい軌道に乗っていると思いました。しかし、 を持つ資格情報を使用してログインしたときUser" typebuttonはまだ表示されていました。コード自体にブレークを配置してコードをデバッグしようとしましたMain_loadが、実行してログインすると、Main_load を完全に無視してメイン ページが表示されます。

また、プロパティの可視性buttonを false に設定しようとしましたが、メイン ページが読み込まれると、管理者タイプの資格情報を使用しても、button非表示のままになります。

コードの構文が間違っていませんか? Main_loadおよび/または、私のターゲットが間違っているという私の考え方は間違っているのでしょうか?

4

3 に答える 3

0

SqlExceptionこれが;をスローできなかった理由がわかりません。理由は 2 つあります。

  1. あなたが書いたSQLは正しくないようで、

  2. それが正しければ、( を使用して*)複数の結果が期待されるように思われます。この場合、 usingwhile (reader.Read()) { ... }は各結果をループし、それに応じてロジックを設定します。したがって、最初のユーザーがUSERで、2 番目のユーザーが である場合Administrator、ボタンの有効状態は、最後にアクセスした値に応じて設定されます。これは、必要なものではありません。

代わりに、静的ユーティリティ クラスをセットアップして、SQL クエリを支援します。したがって、次のようなものがあります

public static calss Utilities
{
    public static bool SQLResult(SqlConnection conn, string strSQL)
    {
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = strSQL;
            strResult = cmd.ExecuteScalar().ToString();
        }
        catch (Exception e)
        {
            // Return error or display.
            return false;
        }
        return true;
    }
}

このメソッドは、単一のテキスト結果を返すことを想定しています。

使用するSQLは次のとおりです

SELECT SYSTEM_USER;
GO

これにより、現在ログインしているユーザーが返されます。クエリを実行しているユーザー。私にとっては、「ServerName\Administrator」が返されます。だからあなたの論理は

string sql = "SELECT SYSTEM_USER;";
string result = Utilities.SQLResult(someValidConnection, sql);
if (result.Contains("Administrator"))
    // Do stuff.

これが役立つことを願っています。

ノート。上記は、SQL インジェクション攻撃やその他のセキュリティの問題を考慮していません。ほとんどの基本的な WinForm アプリケーション (非 Web ベース) では、これらのセキュリティの問題は IMO であり、心配する必要はありません。

于 2013-01-07T11:58:44.133 に答える
0

通常、ユーザーがログインすると、そのユーザーに関連するすべての情報を保持するユーザー オブジェクトを作成します。そうすれば、ユーザーについて何か知りたいときに毎回データベースにアクセスする必要がなくなります。

class User
{
  string role;
  //.. other user attributes.
}

コマンドは、1 人のユーザーに関する情報のみが必要であるという点で異なる必要があります。

comm = new SqlCeCommand("Select * from [user] where user_id=1", conn);
于 2013-01-07T11:48:56.350 に答える
0

Main_load 自体にブレークを設定してコードをデバッグしようとしましたが、実行してログインすると、Main_load を完全に無視してメイン ページが表示されます。

これは通常、メソッドがフォームのLoadMain_Loadイベントにバインドされていないことを意味します。フォームLoadイベントの処理方法を確認し (処理している場合)、問題を修正してください。

お役に立てれば。

于 2013-01-07T11:49:11.697 に答える