【问题标题】:Adding records to MS Access database through C#通过 C# 将记录添加到 MS Access 数据库
【发布时间】:2017-11-20 07:21:24
【问题描述】:

我正在尝试将项目添加到 C# 中的 Access 数据库。我的代码似乎可以工作(我可以打开和关闭数据库),但是按钮单击事件会产生错误。我整个下午都在谷歌上搜索,但没有任何乐趣。我的代码是:

private void button26_Click(object sender, EventArgs e)
{  //Setup tab LoadDatabase
try
{
connection.Open();
button26.ForeColor = Color.Lime;
mainDataGridView.Visible = true;
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = "INSERT INTO Main('Prop', 'Value',   'Default','Type')    VALUES('one', 'Kelly', 'Jill','one')";
cmd.ExecuteNonQuery();
button26.Text = "Done Insert"; 
connection.Close();
}
catch (Exception ex)
{
richTextBox1.Text=("Error "+ex);
button26.ForeColor = Color.Black;
connection.Close();
}
}

我得到的错误是:

错误 System.InvalidOperationException:ExecuteNonQuery:连接属性尚未初始化。
在 System.Data.OleDb.OleDbCommand.ValidateConnection(字符串方法)
在 System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(字符串方法)
?在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)
在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
在 C:\Somepath\Form1.cs:line 49 中的 CrewCheifSettingsBeta3.Form1.button26_Click(Object sender, EventArgs e)

显然连接字符串有问题,而且它也不是 SQL 注入证明。

【问题讨论】:

  • 要执行的命令需要知道应该使用哪个连接。您没有设置任何与您的命令的连接
  • 它不会编译 conn.Open(); OleDbCommand cmd = 新 OleDbCommand();连接.CreateCommand(); cmd.CommandText = "INSERT INTO Main('Prop', 'Value',Default','Type') VALUES('one', 'Kelly', 'Jill','one')"; cmd.ExecuteNonQuery(); button26.Text = "完成插入"; conn.Close(); @史蒂夫
  • 对 4 个空间代码 cmets 很感兴趣 :)

标签: c# ms-access database-connection


【解决方案1】:

这个问题是众所周知的。命令需要知道用于执行命令文本的连接。但是,您的代码中还有其他问题。

连接对象(如命令)不应该是全局的,而是在需要时创建并在之后销毁。 using 语句在这里非常有用,因为您不必显式关闭和销毁这些对象,并且在发生异常时永远不会发生资源泄漏。

其次,当您在数据库中使用也是保留关键字的字段名称时,您应该将这些名称括在某种转义字符中。 Access 的这些字符是开/关括号,而不是单引号。

private void button26_Click(object sender, EventArgs e)
{  
    try
    {
        string cmdText = @"INSERT INTO Main
                          ([Prop], [Value], [Default],[Type])    
                          VALUES('one', 'Kelly', 'Jill','one')";
        using(OleDbConnection connection = new OleDbConnection(.....))
        using(OleDbCommand cmd = new OleDbCommand(cmdText, connection))
        {            
            connection.Open();
            cmd.ExecuteNonQuery();
            button26.Text = "Done Insert"; 
            button26.ForeColor = Color.Lime;
            mainDataGridView.Visible = true;
        }
    }
    catch (Exception ex)
    {
        richTextBox1.Text=("Error "+ex);
        button26.ForeColor = Color.Black;
    }
}

最后我不知道你的字段是不是文本类型。您传递文字文本,因此它们应该是文本类型,并记住在将此简单代码切换为实际值时使用参数。

【讨论】:

    【解决方案2】:

    如下行分配连接属性。

    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = connection;
    

    【讨论】:

    • 嗯我无法编译@Ayax“当前上下文中不存在'连接'”
    • 它是你用来打开它的同一个连接对象..connection.Open()。你是如何创建连接对象的?
    • 您是否将 connection.Open() 更改为 conn.Open()?如果是这样,改变 cmd.Connection = conn;
    • private OleDbConnection conn = new OleDbConnection();公共 Form1() { InitializeComponent(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Userssomepath\Set.mdb;Persist Security Info=False;";} @Ayax 我上面给你的编译错误
    • 只需替换 cmd.Connection = connection; with cmd.Connection = conn;
    【解决方案3】:

    根据@Steve 的评论,当您像这样实例化它时,没有与该命令关联的连接。您需要设置命令的Connection 属性,或者最好先使用connection.CreateCommand() 创建命令,在这种情况下,它已经与连接关联(清理程序)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多