2017-08-09 198 views
-2
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"); 
} 

我需要插入数据到数据库,但它不工作。我启动程序并且没有错误,我做了所有事情,但是当我检查数据库时表格是空的。插入数据到MS Access数据库

UPDATE

现在,当我启动程序我有这样的错误:

“System.InvalidOperationException:“的ExecuteNonQuery:Connection属性尚未初始化”上cmd.ExecuteNonQuery();

+2

[SQL注入警报](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 你应该**永远不会EVER **连接在一起你的SQL声明 - ***总是***使用**参数化查询**,而不是为了避免SQL注入 –

+0

@marc_s我会记住这一点,谢谢 –

+0

@marc_s只是一个问题,我正在使用访问,那SQL注入警报影响我? –

回答

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

作为解释的方式。我已注释掉(但未删除)所有对创建表的引用。表创建和表插入应该在两个不同的例程中。通常你只能创建一次表,但插入可能会被调用很多次。

我已经将OleDbConnection和OleDbCommand放入使用循环中。这是很好的做法,因为它们都实现了IDisposable。像这样编写代码意味着垃圾收集器(GC)立即知道它可以在使用后安全地处理对象。

我已经改变了插入语句,以便它带有参数。这是强烈建议的做法,以防止SQL注入(如果你不知道这是什么,请Google)。实际上Access对于最糟糕的SQL注入来说是相对免疫的,因为它拒绝包含多个语句的任何命令,但是请注意保持良好的习惯。随着时间的推移,你将会进入其他没有这个限制的数据库。

我在打开连接之前有意等待,直到需要之前。连接会消耗资源,所以最好尽可能少地使用它们。也是因为这个原因,我把你的成功消息移到了使用循环之外。这意味着清理资源不会等待用户在消息框中单击“确定”。

最后尝试抓住一切都很好,但通常你想知道错误发生的原因。因此,你可以添加(Exception ex)来捕获,以便找到原因。

PS我忘了提及。在你原来的INSERT中,你用单引号括住了两个VALUES。仅为字符串/文本使用单引号。整数和其他数字不需要引号。如果引用它们,数据库会将其视为一个字符串,并且会得到一个数据类型错误。