注册 登录
编程论坛 VB6论坛

求助,读取文本写入数据库

huihuihuiol 发布于 2017-11-14 16:17, 4402 次点击
请大神帮忙解决一下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
相关文件已上传
只有本站会员才能查看附件,请 登录
18 回复
#2
风吹过b2017-11-14 17:44
定义四个变量,如 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 函数转换。你慢慢完善吧。
#3
huihuihuiol2017-11-14 18:17
回复 2楼 风吹过b
好的,我在VB上看看行不行,谢谢你,如果有问题可以直接向您提问吗?
#4
huihuihuiol2017-11-14 18:50
回复 3楼 huihuihuiol
您好,在数据库的表中表的字段是这样的
编号 X  Y  TgtID layer

编号是自动的,这样的话,此句该怎么改 sql="INSERT INTO 表名 (X, y,TgtID,layer) VALUES (" & dx & "," & dy & "," & TgtID & "," & layer & ");"
#5
huihuihuiol2017-11-14 18:59
回复 2楼 风吹过b
您好,在数据库的表中表的字段是这样的
编号 X  Y  TgtID layer

编号是自动的,这样的话,此句该怎么改 sql="INSERT INTO 表名 (X, y,TgtID,layer) VALUES (" & dx & "," & dy & "," & TgtID & "," & layer & ");"
#6
风吹过b2017-11-14 19:41
编号是自动的 ,那插入数据时就不用管了。

如果是手动编号,你自己查一下 SQL 命令的语法就知道怎么加了。
#7
huihuihuiol2017-11-14 20:23
回复 6楼 风吹过b
就是那个字段可以忽略吗?还有一个问题,就是在您的程序中,没有看到对Igtid赋值的语句,而在给字段添加数据时却出现了
#8
风吹过b2017-11-14 20:43
     elseif a(0)=-999999 then    '文件结束
         退出循环标志=1        
     else
         Igtid =a(0)


写漏了。
#9
风吹过b2017-11-14 20:49
整个程序的原理就是
每读一行,分析一行。
如果该行,第二个值为0 ,那么就属于 段头,段尾,文件尾。
段头有二行,第一个值》0 ,《?
            第二行值》?
段尾,固定 负数
文件尾,固定,负数 ,这二个负数,根据段头判断里,附加到小的那个部分 再判断。

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

#10
huihuihuiol2017-11-14 20:51
回复 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

这是我根据您的思路写的,有些地方改了,请您帮我看看
#11
风吹过b2017-11-14 21:10
       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

这段不对

我是用的 IF .. THEN   .. elseif  ..  else   ... end if
IF 块结构,
在第一个  elseif 前面不能再出现 ELSE

你分析一下各种情况,或者跟踪一下各前几行的这个数组的值想一想,应该放哪个位置

------------------------
'变量定义,建议统一放到代码前
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") '打开数据表

-----------------
'你在本过程中打开了数据连接,那就记得要关掉
db.close

============
未经测试,只是静态看了一下。
有连接,执行SQL 的命令:
db.execute  sql
这样直接执行SQL命令,无返回值,不需要 rs 对象






[此贴子已经被作者于2017-11-14 21:12编辑过]

#12
huihuihuiol2017-11-14 21:31
回复 8楼 风吹过b
我试着去运行这个程序,就是在循环的第一次和第二次时数据库的表格的X Y都是0,
最终程序是出错的。
我的理解大概就是您这样读取数据使得每读一块都会多生成了两行X  Y是0的数据
#13
风吹过b2017-11-14 21:38
你说的这个问题,我没注意到,那就是 保存时,对 X Y 的值也要判断一下,只有这二个值全部不为空时才能保存。
或者再加一个标志变量,
循环开启,该变量为0
当X,Y 给值时,该变量为1
只有该变量为1时,同时 Layer  TgtID 不为零,才保存。

#14
huihuihuiol2017-11-14 21:39
回复 11楼 风吹过b
好的,谢谢你
我应经调了
#15
huihuihuiol2017-11-14 21:43
回复 13楼 风吹过b
好的,我试试,
读取这个的目的就是,在每一块中的layer和tgtid都是一样的而X  Y就是段头下面的那些坐标值

我刚刚学的VB 然后老师要求做这样的一个课程设计有很多不懂的,还望您不要嫌弃我的麻烦
#16
huihuihuiol2017-11-16 10:23
回复 9楼 风吹过b
您好,这是我写的程序,但是执行完了之后数据库中没有添加任何的记录
可以帮我看看吗?
Private Sub Command1_Click()
Dim DX() As Double
Dim DY() As Double
Dim TgtID As Long
Dim Layer As Integer
'Dim count As Long
Dim db As Database
'Dim iTB As TableDef
Dim rs As Recordset
Dim s As String
Dim sList() As String

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

With CommonDialog1
    .Filter = "数据库*.mdb)|*.mdb"       '设置选择文件的格式
    .ShowOpen
End With
accessFile = CommonDialog1.FileName
Set db = OpenDatabase(accessFile)     '打开数据库
Set rs = db.OpenRecordset("MainInfo") '打开数据表

ReDim Preserve sList(0) As String
sList(0) = "-666666.0"
ReDim Preserve sList(1) As String
sList(1) = "-666666.0"
Open dataFile For Input As #1 '打开原始数据

Do
   
   
   If sList(0) = -666666# And sList(1) = -666666# Then
      Line Input #1, s
      sList = Split(s, ",")
      If sList(0) = -999999 And sList(1) = -999999 Then Exit Do
      TgtID = sList(0)
      Line Input #1, s
      sList = Split(s, ",")
      Layer = sList(0)
      
      i = 0
      Do Until sList(0) = -666666# And sList(1) = -666666#
         Line Input #1, s
         sList = Split(s, ",")
         ReDim Preserve DX(i) As Double
         ReDim Preserve DY(i) As Double
         DX(i) = sList(0)
         DY(i) = sList(1)
         i = i + 1
      Loop
      ReDim Preserve DX(UBound(DX) - 1) As Double
      ReDim Preserve DY(UBound(DY) - 1) As Double
      
         If sList(0) = -666666# And sList(1) = -666666# Then
'            count = 0
            For i = 0 To UBound(DX) - 1
               rs.AddNew
               rs.Fields(1).Value = DX(i)
               rs.Fields(2).Value = DY(i)
               rs.Fields(3).Value = TgtID
               rs.Fields(4).Value = Layer
               Refresh
'               rs.Update
'               count = count + 1
            Next i
'            rs.Update
'         Exit Do
         End If
'     Loop
   End If
Loop
'rs.Update
rs.Close
db.Close
Close #1

End Sub
#17
风吹过b2017-11-16 10:27
               rs.AddNew                           '新增一条记录
               rs.Fields(1).Value = DX(i)          '记录内容
               rs.Fields(2).Value = DY(i)
               rs.Fields(3).Value = TgtID
               rs.Fields(4).Value = Layer
               Refresh                             '刷新,放弃新增的内容
'               rs.Update                          '更新,保存新增的内容

我注释了你关键代码,你看一下问题出在哪
#18
huihuihuiol2017-11-16 15:41
回复 17楼 风吹过b
恩恩,问题我已经解决了,谢谢你
#19
longyi_x2019-11-05 21:26
把您的程序传一份可以吗,万分感谢
1