将datatable一次插入access,如何搞?

江南野鹤 2012-05-21 02:15:48
1 SqlBulkCopy 只有sql才可用的
2 本想将多个insert语句 拼在一起执行,无奈access不支持
2 只有用 sqldataadapter.update(dataset,tablename); 这个了
代码如下,执行后未插入数据, 已知 dt中有数据的



OleDbDataAdapter adapt = new OleDbDataAdapter("select id,ItemGuid,StartTime from " + tableName, conn);
adapt.Fill(dt);
var cmd = new OleDbCommand("insert into " + tableName + "(ID,ItemGuid,StartTime) values(@id,@ItemGuid,@StartTime)", conn);
cmd.Parameters.Add("@Id", OleDbType.Integer, 4, "Id");
cmd.Parameters.Add("@ItemGuid", OleDbType.VarChar, 40, "itemGuid");
cmd.Parameters.Add("@StartTime", OleDbType.VarChar, 20, "StartTime");
adapt.InsertCommand = cmd;


if (dt != null)
{
try
{
adapt.Update(dt);
}
catch (Exception e)
{
return e.Message;
}
}

...全文
526 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzh_my 2013-11-26
  • 打赏
  • 举报
回复
不错。。借鉴了。。。
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapt);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";

builder 虽然定义了,下面未用到啊!
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
搞定了 谢谢老大!
需要先将 dt转成一个新表!
孟子E章 2012-05-21
  • 打赏
  • 举报
回复
多字段,我给你的例子中都有了啊,你都不看也没办法了。测试代码

System.Data.DataTable dataTable1 = new System.Data.DataTable("TestTableXXXXXXXXXXXXXXXXXX");
System.Data.DataRow dr;
dataTable1.Columns.Add(new System.Data.DataColumn("UserId", typeof(System.Int32)));
dataTable1.Columns.Add(new System.Data.DataColumn("Title", typeof(System.String)));
dataTable1.Columns.Add(new System.Data.DataColumn("Description1", typeof(System.String)));
dataTable1.Columns.Add(new System.Data.DataColumn("Description2", typeof(System.String)));
dataTable1.Columns.Add(new System.Data.DataColumn("Description3", typeof(System.String)));
dataTable1.Columns.Add(new System.Data.DataColumn("Description4", typeof(System.String)));
dataTable1.Columns[0].AutoIncrement = true;
dataTable1.PrimaryKey = new System.Data.DataColumn[] { dataTable1.Columns["UserId"] };

//生成示例数据
for (int i = 0; i < 8; i++)
{
dr = dataTable1.NewRow();
dr["Title"] = "【孟子E章】" + i.ToString();
dr["Description1"] = "【1孟子E章】" + i.ToString();
dr["Description2"] = "【2孟子E章】" + i.ToString();
dr["Description3"] = "【3孟子E章】" + i.ToString();
dr["Description4"] = "【4孟子E章】" + i.ToString();
dataTable1.Rows.Add(dr);
}


String tableName = "TestTable";
String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|aspxWeb.mdb;";
OleDbConnection conn = new OleDbConnection(connectionString);

OleDbDataAdapter adapt = new OleDbDataAdapter();
var cmd = new OleDbCommand("insert into " + tableName + "(id,ItemGuid,StartTime) values(@id,@ItemGuid,@StartTime)", conn);
cmd.Parameters.Add("@id", OleDbType.Integer, 40, "UserId");
cmd.Parameters.Add("@ItemGuid", OleDbType.VarChar, 40, "Title");
cmd.Parameters.Add("@StartTime", OleDbType.VarChar, 20, "Description3");
adapt.InsertCommand = cmd;
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapt);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
adapt.Update(dataTable1);
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
还有问题就是 ,dt里的列数要大于 access中表的列数,这个该怎么搞?
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
dt是从sql读取的数据,要往access里插入啊. id不是自增长的. 对于access.dt里的数据就是新数据啊


[Quote=引用 8 楼 的回复:]
你是同一个表,插入的是新数据。旧的数据是不插入的
[/Quote]
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
System.Data.DataSet ds = new System.Data.DataSet();
System.Data.DataTable dataTable1;
System.Data.DataRow dr;

String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|aspxWeb2.mdb";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
OleDbDataAdapter adapter = new OleDbDataAdapter("select id, [Title],[Description] from TestTable", connection);
adapter.Fill(ds, "TestTable");
dataTable1 = ds.Tables["TestTable"];
//以下的 这个 table 是什么??
DataTableMapping dtmTable = new DataTableMapping("Table", "TestTable");
adapter.TableMappings.Add(dtmTable);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
//以下这段 是将给dataTable1 插入数据,可是下面也没用到啊?
for (int i = 0; i < 8; i++)
{
dr = dataTable1.NewRow();
dr["Title"] = "【孟子E章】" + i.ToString();
dr["Description"] = "【孟子E章】" + i.ToString();
dataTable1.Rows.Add(dr);
}
adapter.Update(ds);
}
孟子E章 2012-05-21
  • 打赏
  • 举报
回复
你是同一个表,插入的是新数据。旧的数据是不插入的
孟子E章 2012-05-21
  • 打赏
  • 举报
回复
如果id是自动增长的主键,你应该去掉
OleDbDataAdapter adapt = new OleDbDataAdapter("select ItemGuid,StartTime from " + tableName, conn);
adapt.Fill(dt);
var cmd = new OleDbCommand("insert into " + tableName + "(ItemGuid,StartTime) values(@ItemGuid,@StartTime)", conn);
cmd.Parameters.Add("@ItemGuid", OleDbType.VarChar, 40, "itemGuid");
cmd.Parameters.Add("@StartTime", OleDbType.VarChar, 20, "StartTime");
adapt.InsertCommand = cmd;
dt.Rows.Add(new object[] { "AA", "BB3" });
adapt.Update(dt);
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复

dt就是新数据啊.
我就想把dt插入到表中.

你的代码能执行成功吗? 第二种方法我怎么看着晕呢?
[Quote=引用 5 楼 的回复:]
你的新数据呢?


C# code

OleDbDataAdapter adapt = new OleDbDataAdapter("select id,ItemGuid,StartTime from " + tableName, conn);
adapt.Fill(dt);
var cmd = new OleDbCommand("insert into " + tableName +……
[/Quote]
孟子E章 2012-05-21
  • 打赏
  • 举报
回复
你的新数据呢?

OleDbDataAdapter adapt = new OleDbDataAdapter("select id,ItemGuid,StartTime from " + tableName, conn);
adapt.Fill(dt);
var cmd = new OleDbCommand("insert into " + tableName + "(ID,ItemGuid,StartTime) values(@id,@ItemGuid,@StartTime)", conn);
cmd.Parameters.Add("@Id", OleDbType.Integer, 4, "Id");
cmd.Parameters.Add("@ItemGuid", OleDbType.VarChar, 40, "itemGuid");
cmd.Parameters.Add("@StartTime", OleDbType.VarChar, 20, "StartTime");
adapt.InsertCommand = cmd;
dt.Rows.Add(new object[]{1,"AA","BB"});
adapt.Update(dt);
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
方法
http://dotnet.aspx.cc/file/Insert-DataSet-Into-Access.aspx
[/Quote]

看了,我的问题在哪儿啊?
江南野鹤 2012-05-21
  • 打赏
  • 举报
回复
来回答啊
孟子E章 2012-05-21
  • 打赏
  • 举报
回复
方法
http://dotnet.aspx.cc/file/Insert-DataSet-Into-Access.aspx
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在C#编程环境中,将存储于DataTable中的大量数据传输至数据库是一项常规的数据管理任务。本文的核心议题是如何将保存在Access数据库内的员工考勤记录同步至SQL Server数据库平台。鉴于所处理的数据规模相当可观(最高可达40万条数据记录),采用逐条插入的数据传输方式显然难以满足效率要求,因此文章提出了一种批量数据传输的解决方案,该方案具体运用了C#的SqlBulkCopy组件以达成高效的数据批量处理目标。文章阐述了如何从Access数据库获取数据并填充至DataTable对象中。此过程是通过定义一个方法,即OleGetDataTable,来完成的。该方法借助OleDbConnection与OleDbDataAdapter与Access数据库进行交互,并且依据配置文件中指定的数据库连接字符串来建立连接。具体实施时,首先从配置文件中读取数据库连接字符串,随后创建一个OleDbConnection对象用以建立与数据库的连接,再创建一个OleDbDataAdapter对象执行SQL查询指令并将结果集填充到DataTable中。文章详尽说明了如何将DataTable中的数据批量传输至SQL Server数据库。这一过程是通过实现一个名为DataTableToSQLServer的方法来执行的。在该方法中,运用SqlBulkCopy组件以实现迅速的数据导入。SqlBulkCopy是.NET Framework中提供一个专用于高效地将数据从一个数据源(比如DataTable)批量复制到SQL Server数据库的指定表中的组件。在使用SqlBulkCopy时,必须确认目标表已经存...

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧