我一直收到这个错误,说"ExecuteScalar has not been initialized"
我对C#不熟悉,但看了谷歌和教程,但仍然无法看到问题所在。它可能是一个非常愚蠢的错误,但如果有人可以帮助。谢谢:))
// open connection
myConnection.Open();
// sql command
string Account_Num = txt_acc.Text;
string Pin_num = txt_pin.Text;
SqlCommand check_details = new SqlCommand("select Account_num, Pin_num from Cust_details where Account_num='" + txt_acc.Text + "'and Pin_num ='" + txt_pin.Text + "'");
check_details.Parameters.AddWithValue("@Account_num", txt_acc.Text);
check_details.Parameters.AddWithValue("@Pin_num", txt_pin.Text);
int result = Convert.ToInt32(check_details.ExecuteScalar());
if (result > 0)
{
Console.WriteLine("user exists");
}
else
{
Console.WriteLine("error");
}
}
答案 0 :(得分:1)
看起来你没有用连接连接你的命令。只需将Connection
property设置为myConnection
。
check_details.Connection = myConnection;
或者您可以在SqlCommand
构造函数中将其设置为第二个参数;
SqlCommand check_details = new SqlCommand("yourCommand", myConnection);
或者您可以使用连接中的CreateCommand
method;
SqlCommand check_details = myConnection.CreateCommand();
你被误解为parameterized queries。你仍然在sql查询中进行字符串连接,但是你尝试添加参数。这毫无意义。
使用using
statement自动处理您的连接和命令。
也不要尽可能多地使用AddWithValue
。 It may generate unexpected and surprising results sometimes。使用Add
方法重载来指定参数类型及其大小。
using(var myConnection = new SqlConnection(conString))
using(var check_details = myConnection.CreateCommand())
{
check_details.CommandText = @"select Account_num, Pin_num from Cust_details
where Account_num = @accnum
and Pin_num = @pinnum";
// I assume your column types as Int
check_details.Parameters.Add("@accnum", SqlDbType.Int).Value = int.Parse(txt_acc.Tex);
check_details.Parameters.Add("@pinnum", SqlDbType.Int).Value = int.Parse(txt_pin.Text);
myConnection.Open();
int result = (int)check_details.ExecuteScalar();
...
}
顺便说一句,没有必要在命令中选择Pin_num
列,因为ExecuteScalar
会忽略它。