C# ExecuteNonQuery 错误(将 My.ASP Web 窗体连接到 Access 数据库)
C# ExecuteNonQuery Error (Connecting My.ASP Web Form to an Access DB)
我正在尝试将我的 ASP.NET 在线注册表连接到 MS Access 后端数据库。我使用的连接代码是
String connString;
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
myConnection.Close();
try
{
using (myConnection)
{
myConnection.Open();
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
}
myCommand.ExecuteNonQuery();
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
myConnection.Close();
当我点击 "Register" 按钮时总是出现错误。错误是
"ExecuteNonQuery requires an open and available Connection. The connection's current state is closed."
我不确定如何解决这个问题。
执行第一个查询后,您将关闭数据库连接。但是,在下面的 try-catch 块之后,您执行另一个查询。而此时,连接已经关闭
我建议仅在执行完所有查询后关闭数据库连接。这样您就不需要为每个查询都建立新的连接。
更新:
除了最后一个和不必要的 using 语句外,我删除了所有关闭。此代码应该可以正常工作:
String connString;
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
try
{
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
}
myCommand.ExecuteNonQuery();
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
myConnection.Close();
您两次关闭了数据库连接。
尝试先删除 myConnection.Close();
@Jerodev
我的代码的最新版本是
字符串连接字符串;
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new
OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
try
{
using (myConnection)
{
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
myConnection.Close();
}
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
它给出了同样的错误,但它说错误是一致的
"OleDbDataReader myReader = myCommand.ExecuteReader();"
根据您所说的,这就是您需要的全部代码。
请注意您的代码容易受到 SQL 注入攻击,因为您将用户输入直接填充到查询中。用户可以拥有您的数据库或非常容易地销毁它。 See this for more information 和研究 OleDbParameter
.
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
try
{
using(OleDbConnection myConnection = new OleDbConnection(connString))
{
using(OleDbCommand myCommand = myConnection.CreateCommand())
{
myCommand.CommandText = myQuery;
myConnection.Open();
myCommmand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler " + ex.Message;
}
我正在尝试将我的 ASP.NET 在线注册表连接到 MS Access 后端数据库。我使用的连接代码是
String connString;
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
myConnection.Close();
try
{
using (myConnection)
{
myConnection.Open();
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
}
myCommand.ExecuteNonQuery();
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
myConnection.Close();
当我点击 "Register" 按钮时总是出现错误。错误是
"ExecuteNonQuery requires an open and available Connection. The connection's current state is closed."
我不确定如何解决这个问题。
执行第一个查询后,您将关闭数据库连接。但是,在下面的 try-catch 块之后,您执行另一个查询。而此时,连接已经关闭
我建议仅在执行完所有查询后关闭数据库连接。这样您就不需要为每个查询都建立新的连接。
更新:
除了最后一个和不必要的 using 语句外,我删除了所有关闭。此代码应该可以正常工作:
String connString;
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
try
{
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
}
myCommand.ExecuteNonQuery();
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
myConnection.Close();
您两次关闭了数据库连接。 尝试先删除 myConnection.Close();
@Jerodev 我的代码的最新版本是 字符串连接字符串; connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\MyWebsite\WorkDatabase.mdb";
OleDbConnection myConnection = new
OleDbConnection(connString);
myConnection.Open();
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
try
{
using (myConnection)
{
myCommand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler" + ex;
}
finally
{
myConnection.Close();
}
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
}
它给出了同样的错误,但它说错误是一致的 "OleDbDataReader myReader = myCommand.ExecuteReader();"
根据您所说的,这就是您需要的全部代码。
请注意您的代码容易受到 SQL 注入攻击,因为您将用户输入直接填充到查询中。用户可以拥有您的数据库或非常容易地销毁它。 See this for more information 和研究 OleDbParameter
.
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')";
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb";
try
{
using(OleDbConnection myConnection = new OleDbConnection(connString))
{
using(OleDbCommand myCommand = myConnection.CreateCommand())
{
myCommand.CommandText = myQuery;
myConnection.Open();
myCommmand.ExecuteNonQuery();
SuccReglbl.Text = "successful registration";
}
}
}
catch (Exception ex)
{
SuccReglbl.Text = "Exception in DBHandler " + ex.Message;
}