我正在尝试将项目添加到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注入证明。
答案 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()
来创建命令,在这种情况下它将已经与连接关联(清理器)。