1
namespace iss_farmacie_spitali
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlDataReader reader = null;
            DataTable table = null;

            try
            {
                sqlConnection1.Open();
            }

            catch(Exception f)
            {
                Console.WriteLine(e.ToString());
            }
            sqlCommand1.Parameters.AddWithValue("@user",textBox1.Text);
            sqlCommand1.Parameters.AddWithValue("@pass",textBox2.Text);
            sqlCommand1.CommandText = "SELECT id,parola FROM ANGAJAT WHERE id='@user' AND parola='@pass'";

            reader = sqlCommand1.ExecuteReader();
            table.Load(reader);  


            sqlConnection1.Close();
        }


    }
}

ここで忠実なログオンを試みていますが、null 参照エラーが発生し続けます。私が助けを必要としているのは、SQL から取得したデータを処理する方法と、文字列などとして使用できるようにする方法を少し理解することです。

4

3 に答える 3

5

コードtable変数はに初期化されているnullため、スローされNullReferenceExceptionます。

コードで次の修正を行います -

  1. table変数の初期化
  2. SqlConnection を初期化し、using使用後のオブジェクトのクリーンアップに使用する
  3. SqlCommand を初期化し、using使用後のオブジェクトのクリーンアップに使用する
  4. 設定connection string
  5. 使用using後のオブジェクトのクリーンアップに使用するreader

なので -

private void button1_Click(object sender, EventArgs e) 
{
    SqlDataReader reader = null;

    //Corrections
    DataTable table = new DataTable(); //#1 : Initialize Table

    using(SqlConnection sqlConnection1 = new SqlConnection()) //#2: Initialize SqlConnection & make use of `using` for object cleanup after use
    using(SqlCommand sqlCommand1 = new SqlCommand()) //#3: Initialize SqlCommand & make use of `using` for object cleanup after use
    {

        sqlConnection1.ConnectionString = "<connection string>"; //#4: Set connection string
        sqlCommand1.Connection = sqlConnection1;

        sqlConnection1.Open();

        sqlCommand1.CommandText = "SELECT id,parola FROM ANGAJAT WHERE id=@user AND parola=@pass";

        sqlCommand1.Parameters.AddWithValue("@user",textBox1.Text);
        sqlCommand1.Parameters.AddWithValue("@pass",textBox2.Text);

        using(SqlReader reader = sqlCommand1.ExecuteReader()) //#4 : Make use of `using` for object cleanup after use
        {
            table.Load(reader);  
        }

        sqlConnection1.Close();
    }
}

編集 :

Jon Skeetの観察に従って、回答を改善するための要約された修正:)

于 2013-06-06T08:41:43.547 に答える
5

ここには複数の問題があります。

1 つは、どこに表示されていないsqlCommand1sqlConnection1、宣言または初期化されていることです。私の推測では、それらは両方とも null であり、そのため例外が発生しています。これらusing、適切に破棄されるように、ステートメントを使用してメソッド内で宣言および初期化する必要があります。

using (var connection = new SqlConnection(...))
{
    connection.Open();
    using (var command = new SqlComand(...))
    {
        ...
    }
}

次に、この問題があります。

SELECT id,parola FROM ANGAJAT WHERE id='@user' AND parola='@pass'

@user引用符があるということは、パラメーターの値ではなく、正確に ID を探していることを意味し@userます。あなたがしたい:

SELECT id,parola FROM ANGAJAT WHERE id=@user AND parola=@pass

編集:そして、前述のように、あなたDataTableも初期化してください:)

于 2013-06-06T08:41:32.140 に答える
2

リーダーに行があるかどうかを確認していないため、null ポイント例外が発生しています。

ここにコードスニペットがあります

reader = sqlCommand1.ExecuteReader();

while (reader.Read()) 
{
   // Do somthing here
}

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

于 2013-06-06T08:45:03.277 に答える