将数据插入MS Access数据库

时间:2017-08-09 08:30:05

标签: c# ms-access

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();

1 个答案:

答案 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。仅对字符串/文本使用单引号。整数和其他数字不需要引号。如果引用它们,数据库会将其视为字符串,您将收到数据类型错误。