【问题标题】:insert into Access database failing from C# application从 C# 应用程序插入 Access 数据库失败
【发布时间】:2013-10-19 18:29:41
【问题描述】:

我已加入两个表值并将这些值插入另一个表中,但插入不起作用。我正在使用 Access 数据库,并且正在使用以下代码:

 string query = "select t2.date,t1.FlightNo,t1.Dept_Time,t1.Arr_Time,t1.Route,t1.[Destination 1],t1.[Destination 2],t1.[Destination 3],t1.[Destination 4] From [FlightNumber]as t1 inner join [schedule]as t2 on t1.FlightNo=t2.FlightNo";

 OleDbCommand cmd = new OleDbCommand(query, con);

 OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
 dt1 = new DataTable();
 adp.Fill(dt1);
 con.Open();
 string query2 = "Insert into Monday (date,[Flight_no],[Dept_time],[Arr_time],Route,[dest_1],dest2,dest3,dest4)values(@date,@flight,@dept,@arr,@route,@dest1,@dest2,@dest3,@dest4)";
 for (int i = 0; i < dt1.Rows.Count; i++)
 {
     OleDbCommand cmd1 = new OleDbCommand(query2, con);

     cmd.Parameters.AddWithValue("@date", SqlDbType.NVarChar).Value = dt1.Rows[i]["date"].ToString();
     cmd.Parameters.AddWithValue("@flight", dt1.Rows[i]["FlightNo"]);
     cmd.Parameters.AddWithValue("@dept", dt1.Rows[i]["Dept_Time"]);
     cmd.Parameters.AddWithValue("@arr", dt1.Rows[i]["Arr_Time"]);
     cmd.Parameters.AddWithValue("@route", dt1.Rows[i]["Route"]);
     cmd.Parameters.AddWithValue("@dest1", dt1.Rows[i]["Destination 1"]);
     cmd.Parameters.AddWithValue("@dest2", dt1.Rows[i]["Destination 2"]);
     cmd.Parameters.AddWithValue("@dest3", dt1.Rows[i]["Destination 3"]);
     cmd.Parameters.AddWithValue("@dest4", dt1.Rows[i]["Destination 4"]);

     cmd1.ExecuteNonQuery();
     con.Close();
     MessageBox.Show("successfully inserted");            
 }

【问题讨论】:

  • 解释它是如何不工作的。是否存在编译器错误、运行时异常、意外输出或其他原因?

标签: c# ms-access ms-access-2007 oledb


【解决方案1】:

DATE 是 Access SQL 中的 reserved word,因此您需要在 INSERT 命令中将该列名包含在方括号中(就像您对 [Flight_no]、[Dept_time] 等所做的那样)。

string query2 = "Insert into Monday ([date], ...

【讨论】:

    【解决方案2】:

    除了 Gord 提到的保留字 Date 之外,如果您不继续重建命令和参数,可能会在性能上更好,尤其是当您尝试插入大量记录时。相反,请执行类似...

    string query2 = "Insert into Monday (date,[Flight_no],[Dept_time],[Arr_time],Route,[dest_1],dest2,dest3,dest4)values(@date,@flight,@dept,@arr,@route,@dest1,@dest2,@dest3,@dest4)";
    

    // 预先构建命令和参数ONCE
    OleDbCommand cmd1 = new OleDbCommand(query2, con);

    cmd.Parameters.AddWithValue("@date", dt1.Rows[i]["date"].ToString() ); cmd.Parameters.AddWithValue("@flight", dt1.Rows[i]["FlightNo"]); cmd.Parameters.AddWithValue("@dept", dt1.Rows[i]["Dept_Time"]); cmd.Parameters.AddWithValue("@arr", dt1.Rows[i]["Arr_Time"]); cmd.Parameters.AddWithValue("@route", dt1.Rows[i]["Route"]); cmd.Parameters.AddWithValue("@dest1", dt1.Rows[i]["Destination 1"]); cmd.Parameters.AddWithValue("@dest2", dt1.Rows[i]["Destination 2"]); cmd.Parameters.AddWithValue("@dest3", dt1.Rows[i]["Destination 3"]); cmd.Parameters.AddWithValue("@dest4", dt1.Rows[i]["Destination 4"]);

     for (int i = 0; i < dt1.Rows.Count; i++)
     {
         cmd.Parameters[0].Value = dt1.Rows[i]["date"].ToString();
         cmd.Parameters[1].Value = dt1.Rows[i]["FlightNo"]);
         cmd.Parameters[2].Value = dt1.Rows[i]["Dept_Time"]);
         cmd.Parameters[3].Value = dt1.Rows[i]["Arr_Time"]);
         cmd.Parameters[4].Value = dt1.Rows[i]["Route"]);
         cmd.Parameters[5].Value = dt1.Rows[i]["Destination 1"]);
         cmd.Parameters[6].Value = dt1.Rows[i]["Destination 2"]);
         cmd.Parameters[7].Value = dt1.Rows[i]["Destination 3"]);
         cmd.Parameters[8].Value = dt1.Rows[i]["Destination 4"]);
    
         cmd1.ExecuteNonQuery();
     }
    
     con.Close();
     MessageBox.Show("successfully inserted");            
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      相关资源
      最近更新 更多