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();
        }


    }
}

所以我试图在这里进行我的忠实登录,但我不断收到空引用错误。我需要帮助的是了解如何处理从 sql 获得的数据,以及如何使其可用作字符串等。

4

3 回答 3

5

这里有多个问题。

一是您没有显示在哪里声明sqlCommand1sqlConnection1初始化。我的猜测是它们都是空的,这就是你得到异常的原因。它们应该在方法中声明和初始化,使用using语句,以便它们得到适当的处理:

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

然后就是这个问题。

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

你得到引号的事实意味着你正在寻找一个完全的 ID @user- 而不是@user参数的值。你要:

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

编辑:如上所述,DataTable也初始化你的:)

于 2013-06-06T08:41:32.140 回答
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 的观察总结了改进 asnwer 的更正:)

于 2013-06-06T08:41:43.547 回答
2

您没有检查阅读器中是否有任何行,这就是您收到空点异常的原因。

这是代码片段

reader = sqlCommand1.ExecuteReader();

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

希望它会有所帮助。

于 2013-06-06T08:45:03.277 回答