C# 通过C#代码向Access数据库批量插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 通过C#代码向Access数据库批量插入数据相关的知识,希望对你有一定的参考价值。

如题,请给出简单列子,谢谢。

解决问题后再追加100分!
请问谁能再解释一下Access的事务操作?有个简单的能运行的代码更好,谢谢

参考技术A 难道你不知道“数据库事物”是什么吗?数据库事务就是用于批量对数据库进行插入、修改、删除数据用的。比如,如果一条条向数据库插入数据,如果数据有成千上万条,那么这种插入效率是不能忍受的,会花很长时间,数据库事务就是用来解决这种问题。如果你不明白什么是数据库事务,我建议你找找相关资料来看一下。

用事务,比如:
OleDbConnection conn=....;
OleDbTransaction trans=null;
try

trans = conn.BeginTransaction();
OleDbCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;

//执行插入数据的SQL操作

trans.Commit();
cmd.Dispose();
trans.Dispose();

catch(Exception e)

本回答被提问者采纳
参考技术B 我这个绝对行,不行你砍我。

解释一下,参数:sql:就是Sql语句了。
Accesspath:Access的路径。就像 c:\abc.mdb 一样。

记住引用 System.Data.OleDb;
就是: using System.Data.OleDb;

你要是添加批量数据库,就循环调用这个方法就可以了。
public void Insert(string sql,string AccessPath)

string connectionstring = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source="+AccessPath;
OleDbConnection conn = new OleDbConnection(connectionstring);
OleDbCommand comm = new OleDbCommand(sql, conn);
try

conn.Open();
comm.ExecuteNonQuery();

catch

//出错了,这里的代码,你自己写。

finally

conn.Close();



access本身没有批量添加数据的功能。因为insert语句本身只能插入一条语句。
sqlserver本身倒是可以,你可以在多个insert语句之间用; 间隔就可以了。也就是说 你连接一次数据库,可以插入多条记录。但access本身不行。我用过很长时间了。access本身就是小型就用,效率不高,但一般单机软件足够用了。

你下面的插入 空白的,我也不知道了。
如果你觉得Access不好用。建议你用SQLite 。和access一样,都是单文件数据库。 但效率要高好多。

希望能帮到你
参考技术C 建议 用 事务提交 参考技术D 批量新增:
public bool DataInsert()

try

this.sqlCommand = "insert into " + this.tableName + "(";
int count = this.alFieldItems.Count;
string str = string.Empty;
for (int i = 0; i < (count - 1); i++)

this.sqlCommand = this.sqlCommand + ((DBKeyItem) this.alFieldItems[i]).fieldName.ToString() + ",";
str = str + "@" + ((DBKeyItem) this.alFieldItems[i]).fieldName.ToString() + ",";

this.sqlCommand = this.sqlCommand + ((DBKeyItem) this.alFieldItems[count - 1]).fieldName.ToString();
str = str + "@" + ((DBKeyItem) this.alFieldItems[count - 1]).fieldName.ToString();
this.sqlCommand = this.sqlCommand + ") values(";
this.sqlCommand = this.sqlCommand + str;
this.sqlCommand = this.sqlCommand + ")";
this.cmd.CommandText = this.sqlCommand;
this.GenParameters();
this.cmd.ExecuteNonQuery();
return true;

catch (Exception exception)

Error.Record("数据插入出错", exception.ToString());
return false;



删除:
public int DataDelete()

try

this.sqlCommand = "delete from " + this.tableName;
if (this.conditionExpress != string.Empty)

this.sqlCommand = this.sqlCommand + " where " + this.conditionExpress;

this.cmd.CommandText = this.sqlCommand;
this.GenParameters();
return this.cmd.ExecuteNonQuery();

catch (Exception exception)

Error.Record("数据删除出错", exception.ToString());
return -1;



批量修改:
public int DataUpdate()

try

this.sqlCommand = "update " + this.tableName + " set ";
int count = this.alFieldItems.Count;
for (int i = 0; i < (count - 1); i++)

string sqlCommand = this.sqlCommand;
this.sqlCommand = sqlCommand + ((DBKeyItem) this.alFieldItems[i]).fieldName.ToString() + "=@" + ((DBKeyItem) this.alFieldItems[i]).fieldName.ToString() + ",";

this.sqlCommand = this.sqlCommand + ((DBKeyItem) this.alFieldItems[count - 1]).fieldName.ToString() + "=@" + ((DBKeyItem) this.alFieldItems[count - 1]).fieldName.ToString();
if (this.conditionExpress != string.Empty)

this.sqlCommand = this.sqlCommand + " where " + this.conditionExpress;

this.cmd.CommandText = this.sqlCommand;
this.GenParameters();
return this.cmd.ExecuteNonQuery();

catch (Exception exception)

Error.Record("数据更新出错", exception.ToString());
return -1;

第5个回答  2008-10-10 只能用 循环了。。

从 C# 应用程序插入 Access 数据库失败

【中文标题】从 C# 应用程序插入 Access 数据库失败【英文标题】:insert into Access database failing from C# application 【发布时间】: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");            
 

【问题讨论】:

解释它是如何不工作的。是否存在编译器错误、运行时异常、意外输出或其他原因? 【参考方案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");            

【讨论】:

以上是关于C# 通过C#代码向Access数据库批量插入数据的主要内容,如果未能解决你的问题,请参考以下文章

C# 调用Adodb对Access数据库执行批量插入

使用C#向ACCESS中插入数据(仅供参考)

使用 C# windows 窗体向 Ms Access 数据库插入新记录时出现语法错误

c#实现几种数据库的大数据批量插入

当我尝试通过 C# 将日期插入 Access 数据库时出现“INSERT INTO 语句中的语法错误”错误

无法通过 C# oledb 将记录插入 MS Access