Sub OnClick(ByVal Item)
Dim conn,oCom,rst1,sel1,mysql1
'On Error Resume Next
Dim group1
Dim m,i,j,k,columcount,addheader
m=0
'---------------------数据库建立连接 ADODB---------------------'
Set conn=CreateObject("ADODB.Connection")
Set rst1=CreateObject("ADODB.Recordset")
'---------------------连接数据库,输入账号及密码---------------------'
conn.Open "DSN=refire_mzDB;uid=sa;pwd=refire_mz;"
'---------------------查询数据库---------------------'
sel1= "SELECT * FROM [dbo].[Table1]"'读取字段SN 赋予Sell
Set rst1=conn.Execute(sel1)
rst1.movefirst
columcount=rst1.fields.count
Do While Not rst1.EOF
m=m+1
rst1.movenext
Loop
Msgbox m
Dim mysreadsheet,myworksheet
rst1.movefirst
Dim mycolumns
i=2
Set mysreadsheet=ScreenItems("控件1")
For addheader=1 To columcount
mysreadsheet.rows(1).Cells(addheader)=CStr(rst1.fields(addheader-1).name)
Next
Do While Not rst1.EOF
mysreadsheet.rows(i).Cells(1)=CStr(rst1.fields(0).value)
For addheader=2 To columcount
mysreadsheet.rows(i).Cells(addheader)=CStr(rst1.fields(addheader-1).value)
Next
i=i+1
rst1.movenext
Loop
' 关闭记录集
rst1.Close ' 释放指针
' 关闭数据库连接
conn.Close ' 释放连接
Set rst1 = Nothing ' 断开句柄
Set conn = Nothing ' 断开连接
MsgBox("查询结束")
End Sub
这是我写的一个简单的例子程序,这个是正常可以用的,它的目的就是读取数据库中的数据,然后显示到wincc中的Excel控件中。
这是我实际测试中发现的问题:
1、我想用msgbox显示m的值,m是数据库中的记录条目数,原来是想用recordcount来读取记录数的:m=rst1.recordcount,实际测试中m的返回值一直是-1,百度查询得知-1表示ADO 无法确定记录数,或者如果提供程序或游标类型不支持 RecordCount ,该属性将返回 -1。 读取已关闭的 Recordset 的 RecordCount 属性将导致错误。Recordset 对象的游标类型决定是否能确定记录数。 对于只进游标,RecordCount 属性将返回 -1 ;对于静态游标或键集游标,则返回实际记录数;而对于动态游标,则返回 -1 或实际记录数。目前无法找到这个问题的处理方法,所以曲线救国,用了替代方法:
Do While Not rst1.EOF
m=m+1
rst1.movenext
Loop
这就是遍历数据库的查询结果,统计数据的条目数。
2、原来方框中的代码是放到1处的,之所以犯这种低级错误,是因为这个代码有部分是从别的项目代码中复制过来的,按照原来的错误逻辑是先使用了
For addheader=1 To columcount
mysreadsheet.rows(1).Cells(addheader)=CStr(rst1.fields(addheader-1).name)
Next
然后才
Set mysreadsheet=ScreenItems("控件1")
这样就造成了程序错误,无法读取mysreadsheet的参数,造成无法把列标题写到Excel控件中,后面的脚本就执行错误了。移动了代码的位置后,程序正常了。