VB中Recordset的添加记录方法区分

来源:互联网 发布:苹果铃声设置软件 编辑:程序博客网 时间:2024/05/01 13:45

今天开始了煤气层水合物项目的进行 ,用一天时间搭建了框架,今天进行了参数录入的模块.在向数据库中写入数据时,遇到了一点问题,当我按下保存的时候,提示文件名,目录名或卷标语法不正确!  

With rst
            .MoveFirst
       (1) '.AddNew
            .Fields(1) = txtLowTemp.Text
            .Fields(2) = txtHighTemp.Text
            .Fields(3) = txtPressure.Text
            .Fields(4) = txtLowVacuum.Text
            .Fields(5) = txtHighVacuum.Text
            .Fields(6) = txtInflux.Text
            .Fields(7) = txtOutflux.Text
            .Fields(8) = txtCoef.Text
            
       (3).Update
       (2)'.Save
            .Close
End With

(1)当使用.AddNew语句时,数据表各字段的写法必须为(用“!”的形式):

with rst

        !LowTemp = txtLowTemp.Text
        !HighTemp = txtHighTemp.Text.

        ……

end with

而且,使用AddNew的效果是,添加一条新的记录, .MoveFirst的本意,将记录移到表首进行覆盖写入的目的便达不到了,它会在表中新增一条记录,而不是覆盖原记录.

(2) 使用Save语句时,会出现错误提示"文件名,目录名或卷标语法不正确",原因如下:

Recordset对象的save方法是将记录集保存到一个文件中(注意这个文件不是你打开的数据库文件),

  语法      
  recordset.Save   FileName,   PersistFormat         
  参数       
  FileName       可选。文件的完整路径名,用于保存   Recordset。      
  PersistFormat     可选。PersistFormatEnum   值,指定保存 Recordset 所使用的格式。可以是如下某个常量:  
  常量 说明    
  adPersistADTG   (默认)使用专用的“Advanced   Data   Tablegram”格式保存。    
  adPersistXML   使用   XML   格式保存。     
 因此,在你第一次在当前数据集中使用这个方法是需要指定文件名

因此,在这个地方使用.Save完全没有意义,达不到目的

(3)使用.Update之后,即可将数据写道表里去,而且进行了覆盖,无需其它的额外操作,

 ---------------------------------------------------------------------------------------------------------------------------------------------------

续昨天:

另外,在程序首次运行,数据库中表还是一张空表时,可以使用下述判断方法

If rst.EOF Then
        txtLowTemp.Text = "0"
        txtHighTemp.Text = "0"
        txtPressure.Text = "0"
        txtLowVacuum.Text = "0"
        txtHighVacuum.Text = "0"
        txtInflux.Text = "0"
        txtOutflux.Text = "0"
        txtCoef.Text = "0"
Else
    'If Not rst.EOF Then
        rst.MoveFirst
       
        txtLowTemp.Text = rst.Fields(1)
        txtHighTemp.Text = rst.Fields(2)
        txtPressure.Text = rst.Fields(3)
        txtLowVacuum.Text = rst.Fields(4)
        txtHighVacuum.Text = rst.Fields(5)
        txtInflux.Text = rst.Fields(6)
        txtOutflux.Text = rst.Fields(7)
        txtCoef.Text = rst.Fields(8)
End If

----------------

判断完之后,在进行增加数据记录的时候,必须要使用.AddNew方法.

因为,在数据库中表还是一张空表时,使用.Fields(0) = txtTime.Text 这类语句时,会发生错误:“BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录”

这是由于:使用ADO连接数据库进行查询的时候,数据库将查询结果返回查询端,在查询端的内存里面就会有一个列表,这个列表存放的就是查询的结果。这个内存中的列表就是数据集。在你的程序里面rs就是表示这个数据集。bof表示rs当前的指针是指在了数据集的前面,比如数据集里面有编号为1,2,3,4的4条记录,但是rs指向的编号是-1,这样就会符合了bof的情况。同理,当rs的指针指向5,而第五条记录并不存在,这样就会产生了eof的情况。

        如果同时产生了bof和aof的情况,就是说rs的指针既在上界之外也在下届之外,这样只有一种情况,就是rs所代表的数据集是空的,这样rs的指针无论是指到什么地方都是同时具有bof和eof的属性。

        你的情况估计是sql语句查询出来的值是空的,因此数据集也是空的,在读取rs数据集里面的值的时候就会报这个错误。
        使用 if rs.bof and rs.eof then 这个判断可以判别rs里面是否有没有数据集,如果符合这个条件,说明数据集是空的,在程序中就要绕开对rs里字段的访问。

--------

若需要在表中只保留一条记录,则必须使用delete方法先将表中的记录完全删除,然后再重新打开一个Recordset对象,向里面进行添加记录的操作.(原先的想法:进行覆盖操作的方法,是不对的)

        If Not rst.EOF Then                      '先删除
            sql = "delete from GraphicsParam"
            Set rst = ExecuteSQL(sql, MsgStr)
        End If

        sql = "select * from GraphicsParam"   '再添加
        Set rst = ExecuteSQL(sql, MsgStr)
        With rst
            .AddNew
            .Fields(0) = txtTime.Text
            .Fields(1) = txtYMinTemp.Text
            .Fields(2) = txtYMaxTemp.Text
            .Fields(3) = txtYMaxPress.Text
            .Fields(4) = txtYMaxVacuum.Text
            .Fields(5) = txtMaxShunFlux.Text
            .Fields(6) = txtMaxLeiFlux.Text
           
            .Update
            .Close
        End With

还有一点:

当在一个窗体中,只有在数据库操作完全完成之后,即在完成该次表操作之后,才能rst.Close。在此之前的所有Close操作,都会导致后面再次操作数据库时,产生错误。

原创粉丝点击