c# - Access c# 数据库 OleDbException

标签 c# database ms-access

我尝试编写代码来 Access 数据库,但在粗体字行出现 OldDbException 错误。我应该如何更改我的话,以便在运行时不会出现任何错误?

    private void submitbutton_Click(object sender, EventArgs e)
    {
        availabilitytabControl.SelectedTab = orderlisttabPage;

        OleDbConnection myAccessConn = myAccessConnection();
        OleDbCommand myAccessCommand = new OleDbCommand();
        DataSet myDataSet = new DataSet();

        try
        {
          int i;

            myAccessConn.Open();
            String insert ="insert into Particulars (Title,FirstName,LastName,Nationality,PassportNumber,PhoneNumber) VALUES(";


            for (i = 0; i < 100; i++)
            {
                myAccessCommand.CommandText = insert;
                String title = titlecomboBox.Items[i].ToString();
                String firstname = firstnametextBox.Text;
                String lastname = lastnametextBox.Text;
                String nationality = nationalitycomboBox.Items[i].ToString();
                String passportno = passporttextBox.Text;
                String phoneno = phonenotextBox.Text;

                myAccessCommand = new OleDbCommand(insert,myAccessConn);
                OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
                **myAccessCommand.ExecuteNonQuery();**

            }

        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
            return;
        }
        finally
        {
            myAccessConn.Close();
        }


    }

最佳答案

据我所知,您从不在查询的 VALUES(..) 部分添加您的值。

我的建议是;

  • VALUES 部分定义参数
  • 在您的 for 循环中使用 myAccessCommand.Parameters.Add 添加您的值。
  • 执行您的查询。
  • Clear() 在您想为下一个循环插入值之前清除您的参数。
  • 您的 OleDbDataAdapter 部分是不必要的,因为您试图将 INSERT 语句放入其中。

您应该始终使用 parameterized queries .这种字符串连接对于 SQL Injection 是开放的攻击。还可以使用 using 语句来处理您的数据库连接和命令。

using(var myAccessConn = myAccessConnection());
using(var myAccessCommand = myAccessConn.CreateCommand())
{
    myAccessCommand.CommandText = @"insert into Particulars (Title,FirstName,LastName,Nationality,PassportNumber,PhoneNumber) 
                                    VALUES(?, ?, ?, ?, ?, ?)";
    for (i = 0; i < 100; i++)
    {
        myAccessCommand.Parameters.Clear();

        myAccessCommand.Parameters.AddWithValue("?", titlecomboBox.Items[i].ToString());
        myAccessCommand.Parameters.AddWithValue("?", firstnametextBox.Text);
        myAccessCommand.Parameters.AddWithValue("?", lastnametextBox.Text);
        myAccessCommand.Parameters.AddWithValue("?", nationalitycomboBox.Items[i].ToString());
        myAccessCommand.Parameters.AddWithValue("?", passporttextBox.Text);
        myAccessCommand.Parameters.AddWithValue("?", phonenotextBox.Text); 

        myAccessConn.Open();
        myAccessCommand.ExecuteNonQuery();
    }
}

我以 AddWithValue 方法为例,但您没有。 This method may generate unexpected results sometimes .使用 Add 方法重载来指定您的参数类型及其大小。

关于c# - Access c# 数据库 OleDbException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700461/

相关文章:

c# - 如何处理任务等待程序中未处理的异常

c# - 方法重载和多态性

vba - 如何在查询中使用多个复选框值

sql - ms-access 选择有问题的数据

r - 当出现一行时标记数据框中的列

ms-access - 更改 Access 中链接表中的表名称

c# - NodaTime .NET Core 实现中的 BCL DateTimeZoneProvider 在哪里?

c# - 如何像 SQL 连接一样工作 CAML 连接?

mysql - 如何使用 MYSQL LOAD DATA 加载和追加不重复的数据

sql - 组合对象和属性