如何在vfp表单上导入txt文本到sql server 数据库?

时间:2023-02-07 13:23:01
问题描述:
我需要将一个规范的txt文本,通过vfp表单上的导入按钮,直接导入到后台 SQL server 数据库,
数据库已经通过代码连接好了,
待导入的文本以“,”分隔,示例如下:
201401,0835001450751,8868,1,61
201401,0835001451034,8857,1,94
201401,0835001451466,8905,1,++
201401,0935001250045,7805,1,87
201401,0935001251080,7808,1,70
vfp操作界面如下:
通过  浏览   按钮找到待带入的文本文件,通过   导入   按钮 导入数据到SQL server数据库,
后台数据库的表名 为  tbl_xkcj
如何在vfp表单上导入txt文本到sql server 数据库?

我的思路是:先将txt文本导入到一个临时表,然后在插入到后台数据库,可是在导入临时表时,提示文件不存在。
我在 导入 按钮写的代码如下:请帮忙看看,多谢!!
M_File=ALLTRIM(this.Parent.t_data.Value)
IF LEN(M_File)=0
   =MESSAGEBOX("不能为空,请选择待导入的文件!",0+48,"提示")
   RETURN
ENDIF

CREATE CURSOR mycursor(cksdm c(6),cxh c(13),csjh c(4),cxkgs i(4),cxkcj c(4))
SELECT mycursor
Append FROM M_File Delimited With Character ','

11 个解决方案

#1


最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

#2


试下这样应该会明白
Append FROM &M_File Delimited With Character ','

引用 1 楼 cnpablo 的回复:
最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

试下这样应该会明白
Append FROM &M_File Delimited With Character ','

#3


引用 2 楼 oldbbb 的回复:
试下这样应该会明白
Append FROM &M_File Delimited With Character ','

Quote: 引用 1 楼 cnpablo 的回复:

最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

试下这样应该会明白
Append FROM &M_File Delimited With Character ','


告诉vfp 这个 M_File 是变量,谢谢!

导入临时表成功了,

那么问题来了,怎么将临时表导入到SQL Server 中的tbl_xkcj表呢

#4


在导入按钮输入以下代码,利用临时表更新 远程表
M_File=ALLTRIM(this.Parent.t_data.Value)
IF LEN(M_File)=0
   =MESSAGEBOX("不能为空,请选择待导入的文件!",0+48,"提示")
   RETURN
ENDIF

nHandle=GetConnHandle()     &&获得连接句柄

if nhandle>0   
sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    

SELECT cur_xkcj
Append FROM &M_File Delimited With Character ','
    
thisform.grdxk.RecordSourceType= 1
thisform.grdxk.RecordSource="cur_xkcj"

cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
cursorsetprop("wheretype",2) 
cursorsetprop("buffering",5)&&设置表缓冲 * 

select cur_xkcj
tableupdate(.t.,.t.,"cur_xkcj") 
else
    messagebox("数据库连接失败,请与管理员联系。",48+4,"连接失败提示")      
    return
endif 


为何 只能导入到临时表,无法更新远程表呢,

#5


本帖最后由 dkfdtf 于 2014-11-13 09:53:06 编辑
改动一下语句顺序,另外要检查下是否已 set multilocks on

    sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    
 
    SELECT cur_xkcj
    cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
    cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
    cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
    cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
    cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
    cursorsetprop("wheretype",2) 
    cursorsetprop("buffering",5)&&设置表缓冲 * 

    Append FROM &M_File Delimited With Character ','
    tableupdate(.t.,.t.,"cur_xkcj") 

    thisform.grdxk.RecordSourceType= 1
    thisform.grdxk.RecordSource="cur_xkcj"

#6


引用 5 楼 dkfdtf 的回复:
改动一下语句顺序,另外要检查下是否已 set multilocks on

    sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    
 
    SELECT cur_xkcj
    cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
    cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
    cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
    cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
    cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
    cursorsetprop("wheretype",2) 
    cursorsetprop("buffering",5)&&设置表缓冲 * 

    Append FROM &M_File Delimited With Character ','
    tableupdate(.t.,.t.,"cur_xkcj") 

    thisform.grdxk.RecordSourceType= 1
    thisform.grdxk.RecordSource="cur_xkcj"


老大,按照你的做法还是 无法导入成功。

是不是一定要 使用 远程表 生成的临时表才能更新远程表,而不能自己创建临时表来更新远程表呢,

我还有另个思路:
先将 txt数据导入到一个临时表,cur_xkcj,然后 逐条insert into 远程表 tbl_xkcj,其中,bz为主键,所有字段均为 字符型
	    FOR i=1 TO RECCOUNT()
    tmpbz=ALLTRIM(cur_xkcj.ksdm)+ALLTRIM(cur_xkcj.xh)+ALLTRIM(cur_xkcj.sjh)
    tmpksdm=ALLTRIM(cur_xkcj.ksdm)
    tmpxh=ALLTRIM(cur_xkcj.xh)
    tmpsjh=ALLTRIM(cur_xkcj.sjh)
    tmpxkgs=ALLTRIM(cur_xkcj.xkgs)
    tmpxkcj=ALLTRIM(cur_xkcj.xkcj)

 sqlstr0="INSERT INTO tbl_xkcj(bz,ksdm,xh,sjh,xkgs,xkcj)"+;  
                                "VALUES(?tmpbz,?tmpksdm,?tmpxh,?tmpsjh,?tmpxkgs,?tmpxkcj)"
                  nResult=SQLEXEC(nHandle,sqlstr0)

    IF nResult>0
       MESSAGEBOX("导入正式库成功!",0,"操作提示")
    ELSE
       MESSAGEBOX("导入失败,请与管理员联系!",0,"操作提示")
       RETURN
    ENDIF 
 ENDFOR


执行的时候一直提示  导入失败,这个是什么原因呢?

#7


那就看看出错信息是什么嘛

...
If tableupdate(.t.,.t.,"cur_xkcj")
   * update success
else
   local array aErr[1]
   aerror(aErr)
    messagebox(aErr[3])      
endif 

#8


直接发 insert into命令给 sql server 当然也是很清晰直接的方法

#9


引用 8 楼 dkfdtf 的回复:
直接发 insert into命令给 sql server 当然也是很清晰直接的方法

我在别的表单用  insert into 可以成功插入,
可在这个表 tbl_xkcj 总是返回 导入失败的提示,也确实没有插入数据,
是不是跟远程表有关系呢

#10


是不是远端表 tbl_xkcj 被打开了,无法 用 insert into 命令来执行 插入的操作

#11


引用 8 楼 dkfdtf 的回复:
直接发 insert into命令给 sql server 当然也是很清晰直接的方法


终于可以了,

原先失败的原因是 ,远程表  tbl_xkcj 表名中有下划线,查询等可以,插入失败,
折腾半天,应该就是这个原因

现在可以insert into了

#1


最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

#2


试下这样应该会明白
Append FROM &M_File Delimited With Character ','

引用 1 楼 cnpablo 的回复:
最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

试下这样应该会明白
Append FROM &M_File Delimited With Character ','

#3


引用 2 楼 oldbbb 的回复:
试下这样应该会明白
Append FROM &M_File Delimited With Character ','

Quote: 引用 1 楼 cnpablo 的回复:

最后一句
Append FROM M_File Delimited With Character ','
改为
Append FROM (M_File) Delimited With Character ','
然后就可以了
不知道为什么  文本文件名称 用变量 表示的要加上 括弧,
试了一下,可以导入了

试下这样应该会明白
Append FROM &M_File Delimited With Character ','


告诉vfp 这个 M_File 是变量,谢谢!

导入临时表成功了,

那么问题来了,怎么将临时表导入到SQL Server 中的tbl_xkcj表呢

#4


在导入按钮输入以下代码,利用临时表更新 远程表
M_File=ALLTRIM(this.Parent.t_data.Value)
IF LEN(M_File)=0
   =MESSAGEBOX("不能为空,请选择待导入的文件!",0+48,"提示")
   RETURN
ENDIF

nHandle=GetConnHandle()     &&获得连接句柄

if nhandle>0   
sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    

SELECT cur_xkcj
Append FROM &M_File Delimited With Character ','
    
thisform.grdxk.RecordSourceType= 1
thisform.grdxk.RecordSource="cur_xkcj"

cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
cursorsetprop("wheretype",2) 
cursorsetprop("buffering",5)&&设置表缓冲 * 

select cur_xkcj
tableupdate(.t.,.t.,"cur_xkcj") 
else
    messagebox("数据库连接失败,请与管理员联系。",48+4,"连接失败提示")      
    return
endif 


为何 只能导入到临时表,无法更新远程表呢,

#5


本帖最后由 dkfdtf 于 2014-11-13 09:53:06 编辑
改动一下语句顺序,另外要检查下是否已 set multilocks on

    sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    
 
    SELECT cur_xkcj
    cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
    cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
    cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
    cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
    cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
    cursorsetprop("wheretype",2) 
    cursorsetprop("buffering",5)&&设置表缓冲 * 

    Append FROM &M_File Delimited With Character ','
    tableupdate(.t.,.t.,"cur_xkcj") 

    thisform.grdxk.RecordSourceType= 1
    thisform.grdxk.RecordSource="cur_xkcj"

#6


引用 5 楼 dkfdtf 的回复:
改动一下语句顺序,另外要检查下是否已 set multilocks on

    sqlexec(nhandle,"select * from tbl_xkcj","cur_xkcj") &&将服务器中的tbl_xkcj表中的数据读到 cur_xkcj 表中    
 
    SELECT cur_xkcj
    cursorsetprop("tables","tbl_xkcj","cur_xkcj") &&设置临时表的更新目标表 
    cursorsetprop("keyfieldlist",'ksdm,xh,sjh',"cur_xkcj") &&设置临时表的关键字   
    cursorsetprop("updatablefieldlist","ksdm,xh,sjh,xkgs,xkcj","cur_xkcj")&&设置临时表的更新字段   
    cursorsetprop("updatenamelist","ksdm tbl_xkcj.ksdm ,xh tbl_xkcj.xh,sjh tbl_xkcj.sjh,xkgs tbl_xkcj.xkgs,xkcj tbl_xkcj.xkcj","cur_xkcj") &&&用cur_xkcj中的相应字段更新tbl_xkcj表   
    cursorsetprop("sendupdates",.t.,"cur_xkcj")&&设置为可更新   
    cursorsetprop("wheretype",2) 
    cursorsetprop("buffering",5)&&设置表缓冲 * 

    Append FROM &M_File Delimited With Character ','
    tableupdate(.t.,.t.,"cur_xkcj") 

    thisform.grdxk.RecordSourceType= 1
    thisform.grdxk.RecordSource="cur_xkcj"


老大,按照你的做法还是 无法导入成功。

是不是一定要 使用 远程表 生成的临时表才能更新远程表,而不能自己创建临时表来更新远程表呢,

我还有另个思路:
先将 txt数据导入到一个临时表,cur_xkcj,然后 逐条insert into 远程表 tbl_xkcj,其中,bz为主键,所有字段均为 字符型
	    FOR i=1 TO RECCOUNT()
    tmpbz=ALLTRIM(cur_xkcj.ksdm)+ALLTRIM(cur_xkcj.xh)+ALLTRIM(cur_xkcj.sjh)
    tmpksdm=ALLTRIM(cur_xkcj.ksdm)
    tmpxh=ALLTRIM(cur_xkcj.xh)
    tmpsjh=ALLTRIM(cur_xkcj.sjh)
    tmpxkgs=ALLTRIM(cur_xkcj.xkgs)
    tmpxkcj=ALLTRIM(cur_xkcj.xkcj)

 sqlstr0="INSERT INTO tbl_xkcj(bz,ksdm,xh,sjh,xkgs,xkcj)"+;  
                                "VALUES(?tmpbz,?tmpksdm,?tmpxh,?tmpsjh,?tmpxkgs,?tmpxkcj)"
                  nResult=SQLEXEC(nHandle,sqlstr0)

    IF nResult>0
       MESSAGEBOX("导入正式库成功!",0,"操作提示")
    ELSE
       MESSAGEBOX("导入失败,请与管理员联系!",0,"操作提示")
       RETURN
    ENDIF 
 ENDFOR


执行的时候一直提示  导入失败,这个是什么原因呢?

#7


那就看看出错信息是什么嘛

...
If tableupdate(.t.,.t.,"cur_xkcj")
   * update success
else
   local array aErr[1]
   aerror(aErr)
    messagebox(aErr[3])      
endif 

#8


直接发 insert into命令给 sql server 当然也是很清晰直接的方法

#9


引用 8 楼 dkfdtf 的回复:
直接发 insert into命令给 sql server 当然也是很清晰直接的方法

我在别的表单用  insert into 可以成功插入,
可在这个表 tbl_xkcj 总是返回 导入失败的提示,也确实没有插入数据,
是不是跟远程表有关系呢

#10


是不是远端表 tbl_xkcj 被打开了,无法 用 insert into 命令来执行 插入的操作

#11


引用 8 楼 dkfdtf 的回复:
直接发 insert into命令给 sql server 当然也是很清晰直接的方法


终于可以了,

原先失败的原因是 ,远程表  tbl_xkcj 表名中有下划线,查询等可以,插入失败,
折腾半天,应该就是这个原因

现在可以insert into了