在
各位大虾:
现在我遇到一个比较棘手的问题,我要做一个上传的程序,但要求是把文本文件导入的sql中,请那位高手指点一下,vb中有没有这样的功能。
问题点数:0、回复次数:7Top
1 楼zcm123(老蝌蚪精 ●~ www.84ren.com 来了就下的源码站)回复于 2003-12-02 15:24:51 得分 0
upTop
2 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 15:26:30 得分 0
文件传输总分部数据
写procedure把新增修改记录导出文本,这样需要在表中添加判断标志,
如:1 未传传输,2 已上传
把文本传到其他服务器,这个可以用前台软件写个传输文件程序(或者直接用
master..xp_cmdshell),取指定服务器目录内的文件,再用过程导入数据库,导入时进行数据过滤
程序可以这样写过程 比如表名叫table 状态字段为state (1 未传传输,2 已上传)
CREATE PROCEDURE sp_convert --数据转换过程
with recompile ,encryption
as
declare
@bcp varchar(600),
@path char(100),
@file char(200),
@user char(10),
@mdate char(8)
@mdept char(5),
@passwd char(8)
if @@TRANCOUNT >0
COMMIT TRAN
select @user=suser_name()
select @passwd=password from login where code=ltrim(rtrim(@username)) --用户登录表
select @path=ltrim(rtrim(up_path))+'download\'
from parm --运行参数表 包括文件传输路径
select @mdate=convert(char(8),cast(open_close as datetime),112)
select @file='file'+@mdate 得到带日期的txt文件
--convert data to txt
select @bcp='bcp "select * from dbname..table where state=1 " queryout '+ltrim(rtrim(@path))+ltrim(rtrim(@file))+'.txt'+' -c -t, -U '+@user+'-P '+@passwd --选择未传输数据导出
exec master..xp_cmdshell @bcp
begin tran
update dbname..table set state=1 where ct_state=1 --更新状态
commit tran
CREATE PROCEDURE sp_copyfile --文件copy过程
with recompile,encryption
as
declare
@path char(100),
@copy char(300),
@user char(10),
@passwd char(8),
@bcpname char(300)
if @@TRANCOUNT >0
COMMIT TRAN
select @usere=suser_name()
select @passwd=password from login where code=ltrim(rtrim(@username))
select @path=ltrim(rtrim(up_path))+'upload\' from parm
--copy files to servers
select @copy='copy '+ltrim(rtrim(@path))+'file*.txt '+ltrim(rtrim(@path))+substring(convert(char(8),getdate(),112),7,2)
exec master..xp_cmdshell @copy
select @copy='del '+ltrim(rtrim(@pathname))+'file*.txt' --copy完成删除文件
exec master..xp_cmdshell @copyname
if @@TRANCOUNT >0
COMMIT TRAN
return
总部每天做日结处理,也用同样的方法导出数据成文本,在分部与总部联接传输数据据同时把
总部数据传入分部
Top
3 楼hewei2003(为为)回复于 2003-12-02 15:27:14 得分 0
我知道一点点,数据库有这功能
QQ33524826Top
4 楼online(龙卷风V4.0--决战江湖(MS MVP-VB))回复于 2003-12-02 15:35:57 得分 0
使用sqlserver中的bulk insert
先删除
delete dcss_dwjbda where bldddm = @bldd and sj = @sbsj
然后插入
bulk insert dcss_dwjbda
from 'c:\trans.txt'
with(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|\n',
FIRSTROW = 2
)
这种方法速度非常快,放在vb中调用即可
可以考虑写在存储过程中
CREATE PROCEDURE insert_from_text
AS
begin
declare @max_sj datetime --以前最大时间
if @tableno = '0011'
begin
delete dcss_dwjbda where bldddm = @bldd and sj = @sbsj
bulk insert dcss_dwjbda
from 'c:\trans.txt'
with(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|\n',
FIRSTROW = 2
)
end
end
vb中
Dim rs As New ADODB.recordset
rs.open insert_from_text,connTop
5 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 15:38:08 得分 0
http://expert.csdn.net/Expert/topic/2429/2429510.xml?temp=.6784021
http://expert.csdn.net/Expert/topic/2457/2457457.xml?temp=.6571161Top
6 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 15:39:53 得分 0
/** 导入文本文件
EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword'
/** 导出文本文件
EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword'
或
EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'
导出到TXT文本,用逗号分开
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'
BULK INSERT 库名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
Top
7 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 15:40:35 得分 0
http://expert.csdn.net/Expert/topic/2341/2341997.xml?temp=.5800287Top




