【发布时间】:2013-07-23 14:37:43
【问题描述】:
我正在尝试使用 ASP.NET C# 和 MS Access .mdb 数据库创建一个简单的用户注册系统。问题是,每当我尝试注册时,代码在“尝试”中的OleDbCommand 处失败,而是被“捕获”。我在 MS Visual Studio 2012 中使用了断点,据我所知,所有键都存在。我的代码如下:
这里是我的注册方法所在的班级:
public static class DbUtil
{
private static OleDbConnection openConnection()
{
OleDbConnection con = new OleDbConnection();
try
{
string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|MainDatabase.mdb";
con = new OleDbConnection(conString);
con.Open();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return con;
}
private static void closeConnection(OleDbConnection con)
{
try
{
con.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static bool registerUser(string email, string password)
{
try
{
using (OleDbConnection con = openConnection())
{
string sqlString = @"INSERT INTO Users (Email, Password) VALUES (?, ?)";
using (OleDbCommand command = new OleDbCommand(sqlString, con))
{
command.Parameters.AddWithValue("Email", email);
command.Parameters.AddWithValue("Password", password);
command.ExecuteNonQuery();
closeConnection(con);
return true;
}
}
}
catch
{
return false;
}
}
}
这里是调用方法的地方:
public void btnRegisterSubmit_Click(object sender, EventArgs e)
{
string strEmail = txtRegisterEmail.Text;
string strPassword = txtRegisterPassword.Text;
bool regSuccess = DbUtil.registerUser(strEmail, strPassword);
if (regSuccess == false)
{
Response.Redirect("Default.aspx?reg=fail");
}
else
{
if (regSuccess == true)
{
Response.Redirect("Default.aspx?reg=success");
}
else
{
Response.Redirect("Default.aspx?reg=error");
}
}
}
我目前是第一次使用好评参数法。我确实在 SQL 字符串中使用了简单的连接方法,但这产生了同样的问题。
此外,没有打印错误或抛出异常。
任何帮助将不胜感激。提前致谢!
更新:
例外:
System.Data.OleDb.OleDbException (0x80040E14): Syntax error in INSERT INTO statement. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() at DbUtil.registerUser(String email, String password) in c:\Users\******\Documents\Visual Studio 2012\WebSites\********************\App_Code\DbUtil.cs:line 51
【问题讨论】:
-
您没有在 registerUser 方法中处理异常;它可能被抛出在那个范围内,所以你可能想对你在其他方法中所做的捕获做同样的事情。
-
顺便说一句,像在 registerUser 中那样编写一个 catch 处理程序可能永远不是一个好主意。您所做的只是检测到某些故障,但忽略所有可用于诊断问题的信息。在这个范围内发生了很多事情,可能由于多种原因而失败。即使您打算稍后加强它,这样的事情也很容易落空,并在您继续您的项目时给您留下神秘的问题。
-
感谢您的第二条评论,我会确保正确处理异常。我将在问题中粘贴异常。它似乎是我最初的 OleDbCommand ,但我只是没有看到问题。此外,星号只是传感器名称。
-
ODBC 使用问号作为参数标记,但我认为它不适用于 OleDb。尝试使用命名参数,因此 (?, ?) 变为 (@Email, @Password) 并且您必须在 AddWithValue 调用中为名称添加前缀,因此 AddWithValue("Email", email) 变为 AddWithValue("@Email", email) 等.
-
感谢您的提示。我试过了,但抛出了同样的异常,仍然没有添加数据:(
标签: asp.net sql ms-access webforms oledb