尝试通过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;
}
应根据查询结果将计数设置为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"); }
}
}
答案 0 :(得分: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将被关闭并释放资源。