2017-06-17 101 views
0

我正在尝试将项目添加到C#中的Access数据库。我有代码似乎工作(我可以打开和关闭数据库),但按钮单击事件会产生错误。我一直在Google上搜索整个下午,但没有快乐。我的代码是:通过C#向MS 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:Connection属性尚未初始化。
在System.Data.OleDb.OleDbCommand.ValidateConnection(字符串方法)
在System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(字符串方法)
?在System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(的CommandBehavior行为,字符串方法)
在System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
在CrewCheifSettingsBeta3.Form1.button26_Click(对象发件人,EventArgs e)如C:\ Somepath \ Form1.cs:line 49

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

+1

要执行的命令需要知道应该使用哪个连接。你不设置任何连接到你的命令 – Steve

+0

它不会编译conn.Open(); OleDbCommand cmd = new OleDbCommand(); connection.CreateCommand(); (''','凯利','吉尔','一')“;插入主要('道具','价值',默认','类型')。 cmd.ExecuteNonQuery(); button26.Text =“完成插入”; conn。关(); @Steve – Data

+0

坚果到4空间代码评论:) – Data

回答

0

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

1

将连接属性指定为以下行。

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

嗯我不能得到那编译@Ayax“'连接'不存在于当前的情况下” – Data

+0

请分享你得到的错误。 – SMA

+0

这是你用来打开它的连接对象.connection.Open()。你如何创建连接对象? – SMA

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; 
    } 
} 

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