【问题标题】:Unable to connect to .MDB database with ASP.NET C#无法使用 ASP.NET C# 连接到 .MDB 数据库
【发布时间】: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


【解决方案1】:

我没有使用任何保留字

password 确实是 Access SQL 中的保留字。以下代码失败

OleDbException 未处理:INSERT INTO 语句中的语法错误。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace oledbTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\testData.accdb;"))
            {
                conn.Open();
                using (var cmd = new OleDbCommand(
                        @"INSERT INTO Users (Email, Password) VALUES (?, ?)",
                        conn))
                {
                    cmd.Parameters.AddWithValue("?", "gord@example.com");
                    cmd.Parameters.AddWithValue("?", "myPassword");
                    cmd.ExecuteNonQuery();
                }
                conn.Close();
            }

            Console.WriteLine("Done.");
            Console.ReadKey();
        }
    }
}

如果我将代码更改为...

...
using (var cmd = new OleDbCommand(
        @"INSERT INTO Users (Email, [Password]) VALUES (?, ?)",
        conn))
{
...

...然后它工作正常。

【讨论】:

  • 谢谢,不过我设法让它工作了。我已经尝试在列名周围加上方括号,但没有解决。
【解决方案2】:

设法解决了这个问题。我重写了registerUser() 方法,并删除了using 块,现在效果很好。以下是注释掉部分的代码:

public static bool registerUser(string email, string password)
    {
        try
        {
            //using (OleDbConnection con = openConnection())
            //{
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;Data Source=|DataDirectory|MainDatabase.mdb");
                string sqlString = "INSERT INTO [Users] ([Email], [Password]) VALUES (@Email, @Password)";
                //using (OleDbCommand command = new OleDbCommand(sqlString, con))
                //{
                OleDbCommand command = new OleDbCommand(sqlString, con);
                    command.Parameters.AddWithValue("@Email", email);
                    command.Parameters.AddWithValue("@Password", password);
                    con.Open();
                    command.ExecuteNonQuery();
                    con.Close();

                    return true;
                //}
            //}
        }
        catch (Exception e)
        {
            return false;
            //System.Diagnostics.Debug.WriteLine(e.Message);
        }
    }

感谢 cmets :)

【讨论】:

  • 如果可以,您可能应该单击此答案旁边的复选标记,使其显示为已回答。
  • 我会的,它说我要等两天 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2020-07-10
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多