【问题标题】:Trying to insert data into an access database from C#, but it fails, and I have no idea why尝试从 C# 将数据插入访问数据库,但失败了,我不知道为什么
【发布时间】:2018-05-23 10:57:14
【问题描述】:

在浏览了这个网站一段时间后,我开始编写一段代码,将一组文本框中的信息添加到预设数据库中。

代码如下:

string connString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=[[Rather not release private information, but trust me, this part works]]";

var _ID = LblID.Text;
var _FirstName = TxtUsername.Text;
var _LastName = TxtPassword.Text;
var _DOB = TxtFirstName.Text;
var _Number1 = TxtLastName.Text;
var _Number2 = TxtDOB.Text;
var _Email = TxtNumber2.Text;
var _Username = TxtEmail.Text;
var _Password = TxtNumber1.Text;

using (OleDbConnection conn = new OleDbConnection(connString))
{

    OleDbCommand cmd = new OleDbCommand("INSERT into Users ([_ID], [_FirstName], [_LastName], [_DOB], [_Number1], [_Number2], [_Email], [_Username], [_Password]) Values(@ID Number, @First Name, @Last Name, @Date of Birth, @Phone Number 1, @Phone Number 2, @Email, @Username, @Password)");

    cmd.Connection = conn;

    conn.Open();

    if (conn.State == ConnectionState.Open)
    {
        cmd.Parameters.Add("@ID Number", OleDbType.VarChar).Value = _ID;
        cmd.Parameters.Add("@First Name", OleDbType.VarChar).Value = _FirstName;
        cmd.Parameters.Add("@Last Name", OleDbType.VarChar).Value = _LastName;
        cmd.Parameters.Add("@Date of Birth", OleDbType.VarChar).Value = _DOB;
        cmd.Parameters.Add("@Phone Number 1", OleDbType.VarChar).Value = _Number1;
        cmd.Parameters.Add("@Phone Number 2", OleDbType.VarChar).Value = _Number2;
        cmd.Parameters.Add("@Email", OleDbType.VarChar).Value = _Email;
        cmd.Parameters.Add("@Username", OleDbType.VarChar).Value = _Username;
        cmd.Parameters.Add("@Password", OleDbType.VarChar).Value = _Password;

        try
        {
            cmd.ExecuteNonQuery();
            MessageBox.Show("Data Added");
            conn.Close();
        }
        catch (OleDbException ex)
        {
            MessageBox.Show(ex.Message);
            conn.Close();
        }
    }
    else
    {
        MessageBox.Show("Connection Failed");
    }
}

有点长,但请留在我这里。

此代码与我从previous question 的答案中找到的代码非常相似,当然还有重命名变量等以将代码集成到我的应用程序中。

但是,在逐步分解应用程序如何处理此问题后,这里似乎失败了:

try
{
    cmd.ExecuteNonQuery();
    MessageBox.Show("Data Added");
    conn.Close();
}

更具体地说,是 cmd.ExecuteNonQuery()。

try 似乎在这部分停止了,直接跳到了 catch 处。

我的问题是,我做错了什么?我把这件事搞砸到什么程度?

如果您需要任何细节,请发表评论,我会尽快回复。

提前致谢。

编辑 1:忘记添加错误消息,我深表歉意。

“查询表达式'@ID Number'中的语法错误(缺少运算符)。”

编辑 2:不确定这是否应该是一个编辑,但现在我遇到了一个全新的问题。

阅读 cmets 后,我更改了区域名称(在应用程序和数据库中),现在我收到一条全新的错误消息。

“INSERT INTO 语句包含以下未知字段名称:'_ID'。”

我感觉其他人也会抱怨。

很抱歉给您带来了麻烦。

【问题讨论】:

  • 乍一看,我怀疑参数名称中不允许有空格。 JET 无法解析。但为了有机会获得有用的答案,请将完整的异常信息添加到您的问题中。
  • 尝试在cmd.Parameters.Add... 行和查询本身中删除参数名称中的空格(即使用@IDNumber 而不是@ID Number
  • “直接跳到捕获”,这时你会遇到一个异常,里面充满了有用的调试信息。请分享留言等。
  • 对此表示歉意,我将在问题中添加错误消息。关于命名,我是否也应该重命名数据库中的列?只做@ID_Number 会起作用吗?
  • @LtWub:你应该避免在列名中使用空格。您可以使用下划线,也可以使用 PascalCase,无论您喜欢哪一种……但不能使用空格!

标签: c# ms-access cmd


【解决方案1】:

Access SQL 中不允许空格周围没有反引号。由于参数名称与数据库中的任何内容无关,因此只需删除其中的空格即可:

... VALUES (@IDNumber, @FirstName, @LastName, ...)

cmd.Parameters.Add("@IDNumber", OleDbType.VarChar).Value = _ID;
cmd.Parameters.Add("@FirstName", OleDbType.VarChar).Value = _FirstName;
cmd.Parameters.Add("@LastName", OleDbType.VarChar).Value = _LastName;

“INSERT INTO 语句包含以下未知字段名称:'_ID'。”

发生这种情况是因为_ID 与数据库中列的名称不匹配。与您可以完全控制的参数名称不同,列名称是数据库架构的一部分,因此您需要使用准确的名称,包括它可能包含的任何空格。对带空格的名称使用方括号:

INSERT INTO Users ([ID Number], [First Name], ... ) ...

【讨论】:

  • 问题是,我的数据库中的部分为“ID 号”,带有空格。我也应该改变所有这些吗?
  • @musefan Spaces 肯定在这里是错误的,您不需要为此提供异常详细信息。如果事实证明 OP 有不同的问题,我可以随时编辑以添加更多细节。然而,无论编辑如何,都需要解决空间问题。
  • @LtWub 对,方括号中的字符串,即_FirstName_LastName等必须与数据库中的内容匹配,其中包含空格。
  • @musefan 你错过了我试图提出的观点:如果 OP 编辑​​添加一个异常说“无法建立连接”,那么我会编辑解释如何修复连接问题,但我会保留“删除空格”部分,因为这是 OP 必须解决的问题,无论他的代码可能有任何其他问题。
  • 如果我可以插话,单词中的空格也是错误的。解决这个问题让我发现了这个新的错误消息,所以我想说这个快速评论帮助很大。
【解决方案2】:

正如异常告诉您的那样,您在 VALUES 列表中的 @ID 参数后面缺少一个逗号。

对于您的第二个错误消息:您的数据库表中是否有一个名为 _ID 的列?

除此之外,您不必显式关闭连接,因为您已经在为 db-connection 使用 using 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多