大量数据插入SQL数据库问题,急急急!!!!!!

时间:2021-07-25 16:54:12
写了一个如下函数进行将数据插入到SQL数据库中:
bool UpdateToSQL(SQLInfo &info,char Item[][50],int nCount)
{
CString strSQL;

CString strItem,strValue,strTemp,SQLItem;

try
{
strItem.Format("PC_Name,SN,Result,Fail_Item,Fail_Value,End_Time,Test_Time");
//
CString str;
sprintf((LPSTR)(LPCSTR)strTemp,Item[6]);
if(strTemp=="")
str="0";
else
{
int n;
n=atoi(strTemp);
str.Format("%d",n);
}

/* sprintf((LPSTR)(LPCSTR)strTemp,Item[7]);
if(strTemp=="")
sprintf(Item[7],"N");*/
strValue.Format("'%s','%s','%s','%s','%s','%s','%s'",Item[0],Item[1],Item[2],Item[3],
Item[4],Item[5],str);
//
for(int i=8;i<=nCount;i++)
{
SQLItem.Format("%d",i-7);
if (SQLItem.GetLength()==1)
SQLItem="R00"+SQLItem;
else if (SQLItem.GetLength()==2)
SQLItem="R0"+SQLItem;
else
SQLItem="R"+SQLItem;

strItem=strItem+","+SQLItem;
strValue=strValue+","+"'"+Item[i]+"'";
}
//
strSQL.Format("insert into %s with (tablock) (%s) values (%s)",info.Tablename,strItem,strValue);

//m_pConnection->Execute((_bstr_t)strSQL,NULL,NULL); 2007-10-18
//m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText);
//m_pConnection->CommandTimeout=30;
//
//
m_pConnection->Execute((_bstr_t)strSQL,NULL,NULL);



for(int k=0;k<nCount;k++)
{
for(int j=0;j<50;j++)
strcpy(&Item[k][j],"");
}
}
catch(_com_error e)
{
strcpy(ErrMsg,e.Description());
return false;
}

return true;
}

当数据量比较少时,程序能够正常运行,但是当数据量比较多,比如有上万条时,多台电脑同时运行该程序并且操作同一个表时,就会出错,只有一台能够正常运行,其他的都会出错。
不知道这个问题该如何解决?是表被锁住了么?还是怎么了?有没有什么办法可以优化么?
请大家帮帮忙~~~~

9 个解决方案

#2


由于我需要读取大量txt文本,然后将需要的信息进行读取存放到数组中,然后再将数组中的数据插入到表中,所以好像楼上给的不适用。

继续等待高手解决~~~

#3


我以前做的也是根据表的内容读取大量文本,然后再插入到数据库的

因为没用sqlserver,只能说access的做法是
建议不要保存到数足,然后通过数祖一次性插入或者分批插入
而是在保存到一个临时文本里,再一次性导入
sqlserver有什么不同,不清楚。比如导入的差异,存储过程的应用等等

#4


如果是操作大量的TXT数据,那么优化的方法有很多.
1.使用OpenRowSet()
2.使用OpenDataSource()
3.Bulk Insert都可以高效的实现TXT/CSV/XLS数据的大量入库.

我使用过OpenRowSet/OpenDataSource操作CSV文件,14万行数据1分钟搞定入库.
insert into myTable
select * from OpenDataSource(...)...[filename#txt]
或者用OpenRowSet(...)

结合你的数据,看看这两个函数的用法,可以解决不少问题.

#5


哈哈,那个帖子的楼主来了~~

#6


楼上的意思是将txt文本中需要的信息先截取出来存放到临时文本里,然后再一次性导入么?
可是我原数据txt文本是别的程序在不断生成的,数据采集需要模拟实现实时的效果,
而且得到的数据字段个数是不一定的,比如文本A需要插入到表A中的a1~a6的字段,但是文本B就需要插入到表A中的a1~a8字段。

这个该怎么实现呢?

所以我原先的设想就是一个个文本的读取,然后一条条插入到数据库中。然后将原先文本移动到备份文件夹内。
速度慢一点没关系,但是不能出现程序挂掉的现象。

#7


如果是操作大量的TXT数据,那么优化的方法有很多. 
1.使用OpenRowSet() 
2.使用OpenDataSource() 
3.Bulk Insert都可以高效的实现TXT/CSV/XLS数据的大量入库. 

我使用过OpenRowSet/OpenDataSource操作CSV文件,14万行数据1分钟搞定入库. 
insert into myTable 
select * from OpenDataSource(...)...[filename#txt] 
或者用OpenRowSet(...) 

结合你的数据,看看这两个函数的用法,可以解决不少问题.
========================================================================
========================================================================

好的。我先去试试看。谢谢楼上两位~~!

#8


我用过bulk Insert, 10w级别的,耗时不到一分钟。

#9


bulk Insert

#1


#2


由于我需要读取大量txt文本,然后将需要的信息进行读取存放到数组中,然后再将数组中的数据插入到表中,所以好像楼上给的不适用。

继续等待高手解决~~~

#3


我以前做的也是根据表的内容读取大量文本,然后再插入到数据库的

因为没用sqlserver,只能说access的做法是
建议不要保存到数足,然后通过数祖一次性插入或者分批插入
而是在保存到一个临时文本里,再一次性导入
sqlserver有什么不同,不清楚。比如导入的差异,存储过程的应用等等

#4


如果是操作大量的TXT数据,那么优化的方法有很多.
1.使用OpenRowSet()
2.使用OpenDataSource()
3.Bulk Insert都可以高效的实现TXT/CSV/XLS数据的大量入库.

我使用过OpenRowSet/OpenDataSource操作CSV文件,14万行数据1分钟搞定入库.
insert into myTable
select * from OpenDataSource(...)...[filename#txt]
或者用OpenRowSet(...)

结合你的数据,看看这两个函数的用法,可以解决不少问题.

#5


哈哈,那个帖子的楼主来了~~

#6


楼上的意思是将txt文本中需要的信息先截取出来存放到临时文本里,然后再一次性导入么?
可是我原数据txt文本是别的程序在不断生成的,数据采集需要模拟实现实时的效果,
而且得到的数据字段个数是不一定的,比如文本A需要插入到表A中的a1~a6的字段,但是文本B就需要插入到表A中的a1~a8字段。

这个该怎么实现呢?

所以我原先的设想就是一个个文本的读取,然后一条条插入到数据库中。然后将原先文本移动到备份文件夹内。
速度慢一点没关系,但是不能出现程序挂掉的现象。

#7


如果是操作大量的TXT数据,那么优化的方法有很多. 
1.使用OpenRowSet() 
2.使用OpenDataSource() 
3.Bulk Insert都可以高效的实现TXT/CSV/XLS数据的大量入库. 

我使用过OpenRowSet/OpenDataSource操作CSV文件,14万行数据1分钟搞定入库. 
insert into myTable 
select * from OpenDataSource(...)...[filename#txt] 
或者用OpenRowSet(...) 

结合你的数据,看看这两个函数的用法,可以解决不少问题.
========================================================================
========================================================================

好的。我先去试试看。谢谢楼上两位~~!

#8


我用过bulk Insert, 10w级别的,耗时不到一分钟。

#9


bulk Insert