ExecuteScalar需要一个开放且可用的连接。连接的当前状态已关闭

问题描述 投票:-4回答:1

当我尝试在我的程序中注册一个新帐户时,通过LocalDB,我得到一个错误说明:

ExecuteNonQuery需要一个开放且可用的连接。连接的当前状态已关闭

但正如你所看到的,我已经打开了连接

我已经尝试在多个地方设置连接字符串,但无济于事


// The  methods which will be called if the user tries to log in or register
        private void LoginRegisterClick(object sender, EventArgs e)
        {
            // The following lines of code will execute if the user tries to register
            if (lblView.Text == "Register")
            {
                // If all the textboxes have passed validation, the details from the textboxes are retrieved and stored
                if (ucRegister1.AllFieldsValidated() == true)
                {
                    string[] details = ucRegister1.ReturnRegisterDetails();
                    // (cmdCountUsernames) Checks to see if new username is unique
                    Helper.ConnectionToDB().Open();
                    SqlCommand cmdCU = new SqlCommand(@"SELECT COUNT(*) FROM LoginsTable WHERE Login = '" + details[6] + "'", Helper.ConnectionToDB());
                    try
                    {
                        int count = (int)cmdCU.ExecuteScalar();
                        //int count = Convert.ToInt32(cmdCU.ExecuteScalar());
                        // If the new username is unique, the record is added into MainParentTable
                        if (count == 0)
                        {
                            try
                            {
                                // Order of the details:         
                                // details[(0)Firstname, (1)Surname, (2)DOB, (3)HomeTel, (4)MobileTel, (5)Address, (6)Username, (7)Password, (8)Email]

                                // (cmdCNL) Creates a new record in the LoginsTable
                                SqlCommand cmdCNL = new SqlCommand(@"INSERT INTO LoginsTable (Login, Password) VALUES (@login, @password)", Helper.ConnectionToDB());
                                Helper.ConnectionToDB().Open();
                                cmdCNL.Parameters.AddWithValue("@login", details[6]);
                                cmdCNL.Parameters.AddWithValue("@password", details[7]);
                                cmdCNL.ExecuteNonQuery();

                                // (cmdFindUserID) Finds the UserID of the new acccount which was just created above.
                                SqlCommand cmdFUID = new SqlCommand(@"SELECT * FROM LoginsTable WHERE Login = @login", Helper.ConnectionToDB());
                                cmdFUID.Parameters.AddWithValue("@login", details[6]);
                                var da = new SqlDataAdapter(cmdFUID);
                                var dt = new DataTable();
                                da.Fill(dt);
                                globalVariables.userIDSelected = dt.Rows[0]["UserID"].ToString();

                                // (cmdInsertMainParentTable) Adds to the MainParentTable, a new parent using the UserID from the code above.
                                SqlCommand cmdIMPT = new SqlCommand(@"INSERT INTO MainParentTable (UserID, FirstName, Surname, DOB, Address, HomeTelephone, MobileTelephone, Email) VALUES (@userid, @firstname, @surname, @dob, @address, @hometelephone, @mobiletelephone, @email)", globalVariables.conDB);
                                cmdIMPT.Parameters.AddWithValue("@userid", globalVariables.userIDSelected);
                                cmdIMPT.Parameters.AddWithValue("@firstname", details[0]);
                                cmdIMPT.Parameters.AddWithValue("@surname", details[1]);
                                cmdIMPT.Parameters.AddWithValue("@dob", Convert.ToDateTime(details[2]));
                                cmdIMPT.Parameters.AddWithValue("@address", details[5]);
                                cmdIMPT.Parameters.AddWithValue("@hometelephone", details[3]);
                                cmdIMPT.Parameters.AddWithValue("@mobiletelephone", details[4]);
                                cmdIMPT.Parameters.AddWithValue("@email", details[8]);
                                cmdIMPT.ExecuteNonQuery();
                                Helper.ConnectionToDB().Close();
                            }
                            catch (Exception msg2)
                            {
                                MessageBox.Show("Error Message 2: " + msg2);
                            }
                        }
                    }
                    catch (Exception msg)
                    {
                        MessageBox.Show("Error Message: " + msg);
                        throw;
                    }
                   // Helper.ConnectionToDB().Close();



                    // Populates and brings ucLogIn to the front of the form
                    ucLogIn1.PopulateLogins(details[6], details[7]);
                    lblView.Text = "Log In";
                    lblView.Location = new Point(293, 30);
                    ucLogIn1.BringToFront();                    
                }
                return;      
            }

应根据查询结果将Count设置为0或1


GlobalVariables.Con只是这样做

public static SqlConnection conDB = Helper.ConnectionToDB();

我的帮助程序类如下:

public static class Helper
{
    public static SqlConnection ConnectionToDB()
    {
        return new SqlConnection (@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = G:\myDatabase.mdf; Integrated Security = True"); }
    } 
}
c# localdb executescalar
1个回答
1
投票

此问题是由此行引起的(以下命令中的类似行)

SqlCommand cmdCU = new SqlCommand(........, Helper.ConnectionToDB());

我敢打赌,每次调用它时,Helper.ConnectionToDB都会创建SqlConnection对象的新实例。

现在,即使你有这条线

  Helper.ConnectionToDB().Open();

您正在打开一个连接实例,但是,由于该命令再次调用Helper.ConnectionToDB,您将在每个命令中获取一个不同的实例,并在仍然关闭时使用它。

你需要一个完全不同的方法

.... previous stuff....
if (ucRegister1.AllFieldsValidated() == true)
{
    string[] details = ucRegister1.ReturnRegisterDetails();
    using(SqlConnection cnn = Helper.ConnectionToDB())
    {
        cnn.Open();
        SqlCommand cmdCU = new SqlCommand("......", cnn);

        .... replace all calls to Helper.ConnectionDB with the cnn variable ....

        .....
    }  // <== This close the connection 
}

using statement可以帮助您控制SqlConnection及其使用的资源。 SqlConnection是一个一次性对象,其中包含与之关联的重要非托管资源。必须尽快释放这些资源,并且using语句保证当代码退出using块时,SqlConnection将被关闭并释放资源。

© www.soinside.com 2019 - 2024. All rights reserved.