| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 226 人关注过本帖
标题:求助,读取文本写入数据库
只看楼主 收藏
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
结帖率:0
  已结贴   问题点数:20  回复次数:17   
求助,读取文本写入数据库
请大神帮忙解决一下VB6.0将数据读取到数据库中的问题。
1,0
20004,0
-2.432280,0.766335
-2.510024,0.266551
-1.965815,-0.177701
-2.099091,-0.177701
-1.777008,-0.977354
-1.332756,-1.055098
-0.799654,-0.733016
-0.655272,-0.944035
-0.577528,-0.721909
0.499783,-1.055098
0.866291,-1.155055
1.199480,-0.910717
0.388720,-0.577528
0.155488,-0.555315
0.188807,-0.433146
-1.121736,0.222126
-1.166161,0.111063
-0.977354,-0.055531
-1.077311,-0.333189
-1.466031,-0.233232
-1.410500,0.099957
-2.432280,0.766335
-666666.0,-666666.0
2,0
20004,0
1.032886,-0.299870
1.399394,-0.077744
1.510457,-0.255445
2.121303,-0.344295
2.432280,-0.099957
2.476705,0.666378
2.476705,1.243906
1.454925,1.432713
1.043992,1.432713
0.755228,1.210587
0.344295,1.499350
0.144382,1.488244
-0.122169,1.110630
0.199913,0.932929
0.510890,1.099524
0.821866,1.010673
0.577528,0.888504
0.644165,0.499783
1.366075,0.610846
1.510457,0.288764
0.966248,0.211020
1.032886,-0.299870
-666666.0,-666666.0
......
655,0
30000,0
-61.083709,-40.126949
-666666.0,-666666.0
-999999,-999999

数据的格式大致像上面的一样,就是有很多相同的一小块一小块
数据说明,
1,0      其中数据1要读到数据库中的TgtID字段
20004,0   其中数据2004读到数据库的layer字段
-2.432280,0.766335  这两个数据分别读取到数据库的X和Y字段
每一小块结束的标志为-666666.0,-666666.0
整个文件结束的标志为-999999,-999999

数据表的字段
X   Y   TgtID   layer
相关文件已上传
附件: 您没有浏览附件的权限,请 登录注册
2017-11-14 16:17
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:186
帖 子:4059
专家分:25013
注 册:2008-10-15
  得分:20 
定义四个变量,如 DX,XY,TgtID,Layer
定义临时变量 S ,临时数组 A()

do
s=读一行
if instr(s,",")>1 then         '忽略空行
  a=split(s,",")                '分解为二段
  if a(1)=0 then         '为tgtid 或 layer 或尾
     if a(0)>????  then  'Layer的最小值-1 ,或者可能的 TgtID 最大值
         layer=a(0)            '取 Layer
     elseif a(0)=-666666.0  then     '段结束
         layer=0                '置段标记
         tgtid=0
     elseif a(0)=-999999 then    '文件结束
         退出循环标志=1        
     end if
  else                '不属于以上三种情况,置X,Y
    DX=a(0)
    DY=a(1)
  end if
  if 退出循环标志 =1 then exit do
    if layer>0 and tatid>0 then
       sql="INSERT INTO 表名 (X, y,TgtID,layer) VALUES (" & dx & "," & dy & "," & TgtID & "," & layer & ");"
       数据连接执行SQL命令
    end if
end if
loop

大体上我想到的流程就是这样的,浏览器写的代码,有些地方需要使用 val 函数转换。你慢慢完善吧。

授人于鱼,不如授人于渔
早已停用QQ了
2017-11-14 17:44
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
  得分:0 
回复 2楼 风吹过b
好的,我在VB上看看行不行,谢谢你,如果有问题可以直接向您提问吗?
2017-11-14 18:17
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
  得分:0 
回复 3楼 huihuihuiol
您好,在数据库的表中表的字段是这样的
编号 X  Y  TgtID layer

编号是自动的,这样的话,此句该怎么改 sql="INSERT INTO 表名 (X, y,TgtID,layer) VALUES (" & dx & "," & dy & "," & TgtID & "," & layer & ");"
2017-11-14 18:50
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
  得分:0 
回复 2楼 风吹过b
您好,在数据库的表中表的字段是这样的
编号 X  Y  TgtID layer

编号是自动的,这样的话,此句该怎么改 sql="INSERT INTO 表名 (X, y,TgtID,layer) VALUES (" & dx & "," & dy & "," & TgtID & "," & layer & ");"
2017-11-14 18:59
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:186
帖 子:4059
专家分:25013
注 册:2008-10-15
  得分:0 
编号是自动的 ,那插入数据时就不用管了。

如果是手动编号,你自己查一下 SQL 命令的语法就知道怎么加了。

授人于鱼,不如授人于渔
早已停用QQ了
2017-11-14 19:41
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
  得分:0 
回复 6楼 风吹过b
就是那个字段可以忽略吗?还有一个问题,就是在您的程序中,没有看到对Igtid赋值的语句,而在给字段添加数据时却出现了
2017-11-14 20:23
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:186
帖 子:4059
专家分:25013
注 册:2008-10-15
  得分:0 
     elseif a(0)=-999999 then    '文件结束
         退出循环标志=1        
     else
         Igtid =a(0)


写漏了。

授人于鱼,不如授人于渔
早已停用QQ了
2017-11-14 20:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:186
帖 子:4059
专家分:25013
注 册:2008-10-15
  得分:0 
整个程序的原理就是
每读一行,分析一行。
如果该行,第二个值为0 ,那么就属于 段头,段尾,文件尾。
段头有二行,第一个值》0 ,《?
            第二行值》?
段尾,固定 负数
文件尾,固定,负数 ,这二个负数,根据段头判断里,附加到小的那个部分 再判断。

当读到段尾后,置 二个值为0 ,然后保存时再次判断,
防止没有读到段头,就读到了数据,这种的数据无法知道放哪个位置,所以丢弃,当然你可以在这里 加一个 提示,注意这个提示不要立即用 msgbox ,否则会烦死的。


授人于鱼,不如授人于渔
早已停用QQ了
2017-11-14 20:49
huihuihuiol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2017-11-14
  得分:0 
回复 3楼 huihuihuiol
Private Sub Command1_Click()
Dim DX As Double
Dim DY As Double
Dim iTgtID As Integer
Dim iLayer As Long
Dim sList() As Variant
Dim dataFile As String
Dim accessFile As String
Dim Flag As Integer

With CommonDialog1
    .Filter = "数据文件(*.*)|*.*"       '设置选择文件的格式
    .ShowOpen
End With
dataFile = CommonDialog1.fileName

With CommonDialog1
    .Filter = "数据库*.mdb)|*.mdb"       '设置选择文件的格式
    .ShowOpen
End With
accessFile = CommonDialog1.fileName

Dim s As String '定义一个字符型变量,用于存储读取文本中的一行
Open fileName For Input As #1 '打开原始数据

Do
   Line Input #1, s
   If InStr(s, ",") > 1 Then      '忽略空行
     sList = Split(s, ",")             '分解为二段
      If sList(1) = 0 Then       '为tgtid 或 layer 或尾
        If Split(0) > 655 Then 'Layer的最小值-1 ,或者可能的 TgtID 最大值
           iLayer = sList(0)          '取 Layer
        Else
           iTgtID = sList(0)

      ElseIf Split(0) = -666666# Then     '段结束
         layer = 0              '置段标记
         tgtid = 0
      ElseIf Split(0) = -999999 Then  '文件结束
         Flag = 1
      End If
   Else                '不属于以上三种情况,置X,Y
      DX = Split(0)
      DY = Split(1)
   End If
  
   If Flag = 1 Then Exit Do

Dim db As Database
Dim iTB As TableDef
'Dim tb2 As TableDef
Dim rs As Recordset
'Dim rs2 As Recordset
Set db = OpenDatabase(accessFile)                 '打开数据库
Set rs1 = db.OpenRecordset("MainInfo") '打开数据表

  If iLayer > 0 And iTgtID > 0 Then
     rs.AddNew
     rs.Fields(1).Value = DX
     rs.Fields(2).Value = DY
     rs.Fields(3).Value = iTgtID
     rs.Fields(4).Value = iLayer
  End If
  End If
Loop

Close #1
rs.Close
End Sub

这是我根据您的思路写的,有些地方改了,请您帮我看看
2017-11-14 20:51







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

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