关闭边栏(ESC)打开边栏(ESC)

目 录

上一篇文章里做了一个把本地数据文件,如EXCEL或TXT文件通过FTP服务器上传到远程机子上,有了这些文件后,就能轻松地导入大的数据了。再得TXT格式是不能直接在客户端导入的,所以必须得上传到服务器端才行。这过程在弄导入TXT时,也是百度了许久呀,进过好多坑,特记录如下。

EXCEL格式-直接从客户端导入

EXCEL文件倒是容易处理,不用上传也可以本地导入,但是如果记录数过多时,比如上万条以上的记录时,本地导入就会显得好慢了。本地导入适用记录不是很多的时候,二三千条左右时,直接使用这种方式导入

strSQL = “SELECT * INTO [odbc;Driver={SQL Server};” & _
“Server=” + server_ip + “;Database=” + server_name + “;” & _
“UID=” + server_login + “;PWD=” + server_pwd + “].代码_活动商品 ” & _
“FROM [” + List1.Text + “]”
cn.Execute strSQL, lngRecsAff, adExecuteNoRecords

使用ODBC来导入,因为我的软件里是先读取了EXCEL表格,所以List1.text是要导入的表,其它的是登陆MMSQL的参数。

从服务端导入EXCEL

需要先把要导入的文件FTP到服务器,然后再执行即可。

strSQL = “select * into 代码_活动商品 FROM OPENROWSET(‘Microsoft.ACE.OLEDB.12.0’,’Excel 12.0;Database=” & fpath & “‘,” & List1.Text & “)”
conn.Execute strSQL, lngRecsAff, adExecuteNoRecords

服务器没有装OFFICE,所以要装上AccessDatabaseEngine_X64,不然这个驱动Microsoft.ACE.OLEDB.12.0会提示出错。这个对于07版以上的文件导入支持很好,对.xls这种感觉有点慢。参数Database就是上传文件后的服务端物理路径。List1.Text是要导入EXCEL里的哪个表。

TXT导入到远程服务器

同样,先把TXT上传到服务器端,再执行

sql_txt = “select * into 代码_活动商品 from OpenRowset(‘Microsoft.ACE.OLEDB.12.0’, ‘text;hdr=yes;database=” + fpath + “‘,” + Left(GetFileName(CommonDialog1.FileName), Len(GetFileName(CommonDialog1.FileName)) – 4) + “#txt)”

这里要注意了,2008的MMSQL要使用Microsoft.ACE.OLEDB.12.0导入,不能用MSDASQL,格式上,文件名要注意是这样:文件名#txt.其中database是服务端FTP文件夹的物理路径
下面还有一种写法,是2000的数据库本地导入的

sql_txt = “select * into 代码_活动商品 from OpenRowset(‘MSDASQL’, ‘Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=” + Left(CommonDialog1.FileName, Len(CommonDialog1.FileName) – Len(GetFileName(CommonDialog1.FileName))) + “;’,’select * from ” + GetFileName(CommonDialog1.FileName) + “‘)”

这里用的是MSDASQL,驱动用Microsoft Text Driver,可是在2008机上子就会提示

为了弄好这个TXT格式的导入,也是费了好多波折,怎么搞都不成功,后面百度里找到这篇文章,帮助好大,最终才测试成功了。在此感谢!

使用Bulk导入TXT

在测试19万条记录导入的时候,发现TXT几乎要花很长时间才执行完毕,想呀想,决定使用BULK来导入。但是BULK是把数据导入到已知结构的表里的,怎么办呢,可以先复制要导入的表的结构,使用WHERE 1=2即可

‘取得要导入的表结构
sql_txt = “select * into 代码_活动商品 from OpenRowset(‘Microsoft.ACE.OLEDB.12.0’, ‘text;hdr=yes;database=” + fpath + “‘,” + Left(GetFileName(CommonDialog1.FileName), Len(GetFileName(CommonDialog1.FileName)) – 4) + “#txt) where 1=2”
conn.Execute (sql_txt)
‘使用Bulk导入TXT
sql_txt = “Bulk insert 代码_活动商品 from ‘” + fpath + CStr(GetFileName(CommonDialog1.FileName)) + “‘ with (FieldterMinator =’,’, RowterMinator= ‘\n’)”

这样子在导入大容量数据时,时间几乎是花在了上传文件上,导入数据几乎是30S不到的,暂时可以这样用着,就是想不明白,为什么Windows server 2016版中的MMsql2008不能使用MSDASQL,这个在xp,mmsql2000中执行也是不到30S的。待解这个?