从数据库创建按钮 - 发生System.NullReferenceException

时间:2016-08-25 11:19:16

标签: c# sql database button

这段代码昨天有效,但是今天当我开始时,我收到了这个错误。 我不知道发生了什么,数据库仍然连接。

代码:

private void LoginFS_Load(object sender, EventArgs e)
{

    SQLFunctions Lgn = new SQLFunctions();
    Lgn.ConnectionToday();

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = SQLFunctions.conn;

    int NumOfButtons = 50;

    for (int i = 1; i <= NumOfButtons; i++)
    {
        Button btn = new Button();
        {
            btn.Tag = i;
            btn.Dock = DockStyle.Fill;
            btn.Margin = new Padding(10, 10, 10, 10);

            cmd.CommandText = "SELECT username FROM Login where id='" + btn.Tag + "'";

            btn.Text = cmd.ExecuteScalar().ToString(); // <= ERROR
            //ERROR: An unhandled exception of type 'System.NullReferenceException' occurred in.  Additional information: Object reference not set to an instance of an object.
            string btn_name = cmd.ExecuteScalar().ToString();
            btn.Name = btn_name.ToString();

            btn.Click += delegate
            {
                pass_txt.Clear();
                username_txt.Text = btn_name;
                username_lbl.Text = btn_name;
                username_lbl.Visible = true;
                pass_txt.ReadOnly = false;
            };

        }
        users_table.Controls.Add(btn);

    }
    SQLFunctions.conn.Close();
}

我该怎么做,或者为什么会出现这个错误? 感谢

2 个答案:

答案 0 :(得分:1)

在应用cmd.ExecuteScalar()

之前,检查ToString()是否返回任何值
  

返回值类型:System.Object第一行的第一列   结果集,或空引用
  https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx

答案 1 :(得分:0)

你正在尝试使用可能存在的东西,但也不能......

cmd.CommandText = "SELECT username FROM Login where id='" + btn.Tag + "'";
btn.Text = cmd.ExecuteScalar().ToString();

您必须先验证查询是否返回了某些内容,然后再尝试使用它...

cmd.CommandText = "SELECT username FROM Login where id='" + btn.Tag + "'";
var Text = cmd.ExecuteScalar();
if(Text != null) {
  //do your things here
}

关于50个按钮的问题,这是因为你正在循环到50,并且无论如何创建按钮:

for (int i = 1; i <= NumOfButtons; i++)
{
    Button btn = new Button(); //<= here you create the button

如果您只想创建按钮,如果数据库中存在按钮,您可以执行以下操作:

for (int i = 1; i <= NumOfButtons; i++)
{
    cmd.CommandText = "SELECT username FROM Login where id='" + i.ToString() + "'";
    var Text = cmd.ExecuteScalar();
    if(Text != null) {
        Button btn = new Button();
        {
            //...
        }
    }
}

这样,只有在数据库中存在按钮时才会创建该按钮。 但进一步说,也许你应该考虑在循环之前放置查询,查询所有存在的按钮,而不是为它们循环...