| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1860 人关注过本帖
标题:有没有更快的插入数据记录的方法,这样太慢了....
只看楼主 加入收藏
wei0916
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-10-25
收藏
 问题点数:0 回复次数:16 
有没有更快的插入数据记录的方法,这样太慢了....
我用一个ODBC连接上一个FOXPRO数据库,由于查询后的记录比较多,我原来是用一条一条插入的方法插入到另一个数据库.现在想一次性将其记录导入到一个ACCESS数据库,不知有没有办法.
搜索更多相关主题的帖子: 数据记录 
2006-11-14 10:56
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

用sql server做转换就行

2006-11-14 10:58
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
收藏
得分:0 
可以提交DATASET啊。

XAplus!
讨论群:51090447
删吧删吧,把我的号给删了!
2006-11-14 11:00
wei0916
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-10-25
收藏
得分:0 

代码如下
PubConnstr = "provider=MSDASQL.1;user id=admin;password=;driver=microsoft visual foxpro driver;sourcedb="+Pathstr+";sourcetype=dbf;Persist Security Info=False";//用ODBC连接一个FOXPRO数据库.
OdbcConn.ConnectionString = PubConnstr;
OdbcConn.Open();

sqlstr="SELECT * FROM PIAOLST";
OdbcComm.CommandText =sqlstr;
OdbcComm.ExecuteNonQuery();
OdbcData.Fill(TmpDsc,"piaolst");//这里得到并填充数据

for(k = 0; k < TmpDsc.Tables[0].Rows.Count ; k++)//循环插入本地库CURRDAYBUSINFO(ACCESS类型的)
{
sqlstr="INSERT INTO CurrDayBusinfo(num,times,name,linenum,counter1,limt,km,bc,qnum,name1,dayxy,piaodj,chknum,days,recnum,"
+"types,memos,model,fache,facname,facnum,fjsxf,cw,isprntime,fsit,hc,resone,hl)"//zdt,fhj
+"values("+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[0].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[1].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[2].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[3].ToString().Trim()+"'"+","
+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[4].ToString())+","+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[5].ToString())+","+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[6].ToString())+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[7].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[8].ToString().Trim()+"'"+","
+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[9].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[10].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[11].ToString().Trim()+"'"+","+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[12].ToString())+","+"#"+TmpDsc.Tables[0].Rows[k].ItemArray[13].ToString().Trim()+"#"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[14].ToString().Trim()+"'"+","
+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[15].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[16].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[17].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[18].ToString().Trim() +"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[19].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[20].ToString().Trim()+"'"+","
+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[21].ToString())+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[22].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[23].ToString().Trim() +"'"+","+int.Parse(TmpDsc.Tables[0].Rows[k].ItemArray[24].ToString())+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[25].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[26].ToString().Trim()+"'"+","+"'"+TmpDsc.Tables[0].Rows[k].ItemArray[27].ToString().Trim()+"'"+")";
OleDbComm.CommandText =sqlstr;
OleDbComm.ExecuteNonQuery();//第循环一次插入一条记录,这样太慢了.
txt_info.Text="本地数据库插入记录信息:"+k.ToString().Trim()+" 条";
txt_info.Refresh();
}

以上是一条一条插入的方法,太慢了.主要是两种类型的数据库,我现在不清楚的是用ODBC查询到的数据,怎么才能把它一次性插入到一个用OLECONNECTION连接上的ACCESS里,?????????????


2006-11-14 11:09
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
都告诉你直接用SQL Server的数据转换功能了,一步一步向导就搞掂,何须编码
2006-11-14 11:11
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
收藏
得分:0 
提交整张表(DATASET中的一张)

XAplus!
讨论群:51090447
删吧删吧,把我的号给删了!
2006-11-14 11:17
wei0916
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-10-25
收藏
得分:0 
不是我不想,要用程序实现这个功能.这是个前题,在这个前题下才能继续讨论下去呀.
这本来就是一个程序里的小部份功能.然道让程序运行到这里,再用手动将这个库转换一下,
然后再让程序运行????

2006-11-14 11:18
wei0916
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-10-25
收藏
得分:0 
TO jacklee,能否说一下.现在数据记录都在TMPDS(DATASET)里,如何将这些记录全部插入到一个本地ACCESS里,指点一下.谢.

还有一个方法,是否可用SQL语句一次性实现,如:INSERT INTO TABLE1 SELECT * FROM TABLE2;就是在对第一个表进行查询的时侯,就可以对要插入的表进行操作.但那是在同数据库类型的情况下,如同一ACCESS数据库,将表A查询后的记录导入表B,这样是有办法的.现在是两个不同类型的数据库呢.

高手相助.

[此贴子已经被作者于2006-11-15 1:23:36编辑过]


2006-11-14 11:20
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
收藏
得分:0 
看看是不是。要吃饭了。找了个。。你看一下这方法。我用过
用SqlCommandBuilder 实现批量更新

1.功能:

可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更 新到数 据库中,而没必要每次都更新到

数据库

2.使用方法
public DataSetUpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
SqlConnection conn = new SqlConnection(strConnection));

SqlDataAdapter myAdapter = new SqlDataAdapter();
SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);
myAdapter.SelectCommand = myCommand;
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
try

{

lock(this) //处理并发情况(分布式情况)

{

myAdapter.Update(ds,strTblName);

}

}

catch(Exception err)
{

conn.Close();
throw new BusinessException(err);
}

return ds; //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds

}



public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{


SqlConnection conn = new SqlConnection(strConnection));
SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);

SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );

SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);

myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();

myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();

myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();

try

{

lock(this) //处理并发情况(分布式情况)

{

conn.Open();

myAdapter.Update(ds,strTblName);

conn.Close();

}

return ds; //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }
catch(Exception err)
{

conn.Close();
throw new BusinessException(err);
}
}

直接调用这两个方法的任意一个就OK啦,说明的一点是select * from "+strTblName是一定要的,
作用大家也应该想到了,主要是告诉 SqlDataAdapter更新哪个表


3.什么时候用?

a. 有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后,

最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除

更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行

效率上也变得有些慢

b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击

页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况

c.有些情况下只往数据库里更新,不读取. 也就是说没有从数据库里读,SqlDataAdapter也就不知道是

更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.


4.
注意点:
1.只能更新一个表,如果此数据集是从两个或者两个以上的表关联而来的,则不能用此方法自动更新
2.表中必须设置主键
3.更新的表中字段不能有image类型的

5.优点:

节省代码量,节省时间,这个方法可以代替所有的: 更新/删除/插入操作语句

6.缺点:
访问两次数据库(select * TableName,就是这句,要确认是哪个表,除非是很大的数据量,
一般是感觉不到的),效率稍微有些慢

XAplus!
讨论群:51090447
删吧删吧,把我的号给删了!
2006-11-14 11:27
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
SqlDataAdapter update
2006-11-14 11:27
快速回复:有没有更快的插入数据记录的方法,这样太慢了....
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018598 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved