ExecuteScalar尚未初始化

时间:2015-12-16 11:07:16

标签: c#

我一直收到这个错误,说"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");
           }
       }

1 个答案:

答案 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自动处理您的连接和命令。

也不要尽可能多地使用AddWithValueIt 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会忽略它。