这段代码昨天有效,但是今天当我开始时,我收到了这个错误。 我不知道发生了什么,数据库仍然连接。
代码:
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();
}
我该怎么做,或者为什么会出现这个错误? 感谢
答案 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();
{
//...
}
}
}
这样,只有在数据库中存在按钮时才会创建该按钮。 但进一步说,也许你应该考虑在循环之前放置查询,查询所有存在的按钮,而不是为它们循环...