try
{
OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;");
myConnection.Open();
// Create Oledb command to execute particular query
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = myConnection;
// Query to create table with specified data columne
myCommand.CommandText = "CREATE TABLE UXZona([IDZona] int, [Morada] text)";
//myCommand.ExecuteNonQuery();
MessageBox.Show("Tabela criada");
}
catch
{
OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;");
myConnection.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO UXZona (IDZona, Morada) VALUES ('" +
transaction.UnloadPlaceAddress.AddressID + "','" +
transaction.UnloadPlaceAddress.AddressLine2 + "')";
cmd.ExecuteNonQuery();
MessageBox.Show("Dados inseridos");
}
我需要将数据插入数据库,但它无法正常工作。我启动程序并且没有错误,我做了所有事情,但是当我检查数据库时表格是空的。
更新
现在,当我启动程序时出现此错误:
“System.InvalidOperationException:'ExecuteNonQuery:Connection属性尚未初始化。”在cmd.ExecuteNonQuery();
答案 0 :(得分:2)
有很多错误!我给出了以下更正的代码:
try
{
bool success = false;
using (var myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;"))
{
// Create Oledb command to execute particular query
using (var myCommand = new OleDbCommand())
{
myCommand.Connection = myConnection;
// Query to create table with specified data columne
//myCommand.CommandText = "CREATE TABLE UXZona([IDZona] int, [Morada] text)";
//myCommand.ExecuteNonQuery();
//MessageBox.Show("Tabela criada");
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO UXZona (IDZona, Morada) VALUES (@id, @morada)";
var param = cmd.CreateParameter();
param.ParameterName = "@id";
param.OleDbType = OleDbType.Integer;
param.Value = transaction.UnloadPlaceAddress.AddressID;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "@morada";
param.OleDbType = OleDbType.VarChar;
param.Value = transaction.UnloadPlaceAddress.AddressLine2;
cmd.Parameters.Add(param);
myConnection.Open();
if (cmd.ExecuteNonQuery() == 1)
{
success = true;
}
}
}
if (success)
{
MessageBox.Show("Dados inseridos");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
作为解释。我已经注释掉了(但没有删除)创建表的所有引用。表创建和表插入应该在两个不同的例程中。通常,您只创建一次表,但可能多次调用insert。
我已将OleDbConnection和OleDbCommand放在使用循环中。这是一种很好的做法,因为它们都实现了IDisposable。编写这样的代码意味着垃圾收集器(GC)立即知道它可以在使用后安全地处理对象。
我已经更改了insert语句,因此需要参数。这是强烈建议的做法,以防止SQL注入(如果你不知道这是什么请谷歌它)。事实上,Access相对不受最恶劣形式的SQL注入的影响,因为它拒绝任何包含多个语句的命令,但请养成良好的习惯。随着时间的推移,您将进入其他没有此限制的数据库。
我打算在打开连接之前等待,直到需要之前。连接消耗资源,因此最好尽可能少地使用它们。也是因为这个原因,我已经将你的成功消息移到了use循环之外。这意味着资源的清理不等待用户在消息框中单击“确定”。
最后尝试捕获一切都很好,但通常你想知道错误发生的原因。因此,您添加(例外ex)以捕获,以便您可以找到原因。
PS我忘了提及。在您的原始INSERT中,您使用单引号围绕两个VALUES。仅对字符串/文本使用单引号。整数和其他数字不需要引号。如果引用它们,数据库会将其视为字符串,您将收到数据类型错误。