通过C#向MS Access数据库添加记录

时间:2017-06-17 17:32:45

标签: c# ms-access database-connection

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

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:尚未初始化Connection属性   在System.Data.OleDb.OleDbCommand.ValidateConnection(String method)
    at System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(String method)
  ?在System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior,String method)
    在System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
    在C:\ Somepath \ Form1.cs中的CrewCheifSettingsBeta3.Form1.button26_Click(Object sender,EventArgs e):第49行

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

3 个答案:

答案 0 :(得分:2)

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

连接对象(如命令)不应该是全局的,而是在需要和销毁之后创建的。 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;
    }
}

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

答案 1 :(得分:1)

将Connection属性指定为以下行。

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

答案 2 :(得分:0)

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