【解決方法】executereader を修正するにはどうすればよいですか: 接続プロパティが初期化されていません。


私はコーディングにもっと夢中になっています。事前にお詫び申し上げます。 私自身初心者です。

C#
private void btnLogin_Click(object sender, EventArgs e)
{
    if (txtPassword.Text != string.Empty || txtUsername.Text != string.Empty)
    {
        SqlCommand cmd = new SqlCommand("select * from LoginTable where username='" + txtUsername.Text + "' and password='" + txtPassword.Text + "'", cn);
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            dr.Close();
            this.Hide();
            Form1 home = new Form1();
            home.ShowDialog();
        }
        else
        {
            dr.Close();
            MessageBox.Show("No Account avilable with this username and password ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }
    else
    {
        MessageBox.Show("Please enter value in all field.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

私が試したこと:

以前のエラーから提案されたことに従い、「dr」のローカルを生成しましたが、現在、未処理の例外に問題があります。
System.InvalidOperationException: 'ExecuteReader: Connection property has not been initialized.'

ここでこのプロパティをどのように初期化しますか?
SqlDataReader dr = cmd.ExecuteReader();

解決策 1

最初に次のような接続が必要です。

using (SqlConnection cn = new SqlConnection()) {  
    cn.ConnectionString = "Server=[server_name];Database=[database_name];Trusted_Connection=true";  
    // using the code here...  
}  

ここの例も参照してください:
ADO.NET を使用した C# での SQL Server データベース接続[^]

また: DataReader を使用したデータの取得 – ADO.NET | マイクロソフト ラーン[^]

コードは SQL インジェクションに対して脆弱です。コードを本番環境で使用する場合は、パラメーター化されたクエリを使用してください。以下を参照してください。
パラメータ化されたクエリを使用して SQL インジェクションを回避する[^]

解決策 2

非常に小さなコードで、非常に多くのエラーが発生しています…そのほとんどはまだ発見されていません…

あなたが知らない大きな問題から始めましょう: 文字列を連結して SQL コマンドを作成しないでください。 データベース全体を破壊する可能性のある、偶発的または意図的な SQL インジェクション攻撃にさらされる可能性があります。 代わりに、常にパラメーター化されたクエリを使用してください。

文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

どの SQL が 3 つの別個のコマンドとして認識されるか:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?

そして、ログイン画面で? それで、あなたのものを破壊するためにサインアップする必要さえありませんか? :はぁ:
緊急の問題として、アプリ全体で修正してください。

2 番目は、あなたが見たことのないものです。置くと、多額のお金がかかるか、場合によっては刑務所に入れられることさえあります。 パスワードをクリア テキストで保存しないでください。これは重大なセキュリティ リスクです。 ここにそれを行う方法に関するいくつかの情報があります: パスワードの保管: 方法。[^]

覚えておいてください: 欧州連合のユーザーがいる場合、GDPR が適用されます。つまり、パスワードを機密データとして扱い、安全な方法で保管する必要があります。 テキストはそれらのどちらでもなく、罰金は….うーん…傑出している可能性があります。 2018 年 12 月、ドイツの会社は、それだけで 20,000 ユーロという比較的低い罰金を科されました。

アプリ全体でそれを修正したら、見つけた問題について考え始めます。 エラーメッセージを読めば、これは些細なことです。 あなたのSqlConnection cn は初期化されていません – データベースへのオープン接続ではありません。 したがって、接続オブジェクトを作成して開き、コードに使用して、閉じて破棄します。

コメント

タイトルとURLをコピーしました