51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4594|回复: 8
打印 上一主题 下一主题

[原创] 如何将sql语句在数据库查到一个表的全部值写入datatable中?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-8-13 17:54:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 betty7zhang 于 2012-8-14 14:48 编辑

Dim Cnn
Dim Rst
Dim strCnn
Set Cnn = CreateObject("ADODB.Connection")
Set Rst =CreateObject("ADODB.Recordset")
strCnn="rovider=SQLOLEDB.1assword=XXXersist Security Info=True;User ID=XXX;Initial Catalog=DB_Name;Data Source=DB_IPAddress;"
Cnn.Open strCnn
If Cnn.State=0 Then

Reporter.ReportEvent micFail,"testing","数据库连接失败"

else

Reporter.ReportEvent micPass, "testing","数据库连接成功"
End If
If Cnn.State<>0 Then
    strsql="select * from tb_General_Info"

Rst.Open strsql,Cnn

i=1

  Do While  Not Rst.eof


                DataTable.GlobalSheet.SetCurrentRow(i)
                DataTable("MerchantID","Global")=Rst("MerchantID").value
                DataTable("StoreID","Global")=Rst("StoreID").value
                DataTable("CustomerID","Global")=Rst("CustomerID").value
                DataTable("CustomerClientIP","Global")=Rst("CustomerClientIP").value
                DataTable("RequestorMachineName","Global")=Rst("RequestorMachineName").value
                DataTable("ReturnURL","Global")=Rst("ReturnURL").value
                DataTable("CustomField","Global")=Rst("CustomField").value
                DataTable("OrderID","Global")=Rst("OrderID").value
                DataTable("Operation","Global")=Rst("Operation").value
                DataTable("IsManualTransaction","Global")=Rst("IsManualTransaction").value



        Rst.MoveNext
        i=i+1


   Loop
   Rst.Close
   Cnn.Close
   Set Rst=nothing
   Set cnn=nothing
End If

想简化一下这个脚本,用for 循环将所查到表中的多列数据写入datatable里,而不用手动的在脚本中写多条类似这样的语句
DataTable("MerchantID","Global")=Rst("MerchantID").value

大家有什么好的建议吗?求教。

还有一个问题就是如何将这段脚本写成function供其它脚本运行时调用呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2012-8-14 10:36:36 | 只看该作者
本帖最后由 cellule 于 2012-8-14 10:42 编辑

Function selectSQL(strConnInfo,strSelectSql,objectProperty)
'*********************************************************
' 作者:cellule

' 功能:查询MS SQL数据库
   
' 输入:strConnInfo数据库连接信息,strSelectSql数据库查询语句,objectProperty目标字段

' 输出: 无        

' 示例:  strConnInfo="DRIVER=SQL Server;SERVER=192.168.0.7;UID=WD=;APP=Microsoft Office 2003;DATABASE=UserDataDB"
'        strSelectSql=""
'        objectProperty="Money"
'        Call selectSQL(strConnInfo,strSelectSql,objectProperty)
'*********************************************************
        Dim addConn,connRes
        Dim i
        '创建数据库对象
        Set addConn=CreateObject ("adodb.Connection")
        '使用连接打开数据库
        addConn.Open strConnInfo
        '判断是否打开数据库成功
        If addConn.State=1 Then
                Reporter.ReportEvent micPass ,"成功","连接数据库成功"
                else
                Reporter.ReportEvent micFail,"失败","连接数据库失败"
                addConn.Close
                Set addConn=nothing
        End If
        '创建数据库记录集对象
        Set connRes=CreateObject ("adodb.RecordSet")
        '执行数据库查询
        connRes.Open strSelectSql,addConn
        connRes.MoveFirst()

        '判断表名是否存在,不存在着添加
        intDataCount=DataTable.GetSheetCount
        For intStat=1 to intDataCount
                strDataName=DataTable.GetSheet(intStat).Name
                If strDataName="SQL_Results" Then
                        Exit for
                        else
                        DataTable.AddSheet "SQL_Results"
                End If
        Next

        '获取表内列数
        intParameter=DataTable.GetSheet("SQL_Results").GetParameterCount
        varStat=true
        '判断如果列数为0直接添加,如果不是则把状态转成False
        If  intParameter=0 Then
                DataTable.GetSheet("SQL_Results").AddParameter objectProperty,null
                else
                varStat=False
        End If
        '当varStat=False执行获取列明并进行判断
        Do while varStat=False
                        For intStartParameter=1 to intParameter
                                strParameterName=DataTable.GetSheet("SQL_Results").GetParameter(intStartParameter).Name
                                If  strParameterName=objectProperty Then
                                        Exit do
                                        else
                                        If  intStartParameter=intParameter Then
                                                DataTable.GetSheet("SQL_Results").AddParameter objectProperty,"null"
                                                Exit do
                                        End If
                                End If        
                        Next
        Loop
        
        i=1
        '获取数据库结果并写入DataTbale中
        Do
                DataTable.GetSheet("SQL_Results").SetCurrentRow (i)
                DataTable.Value (objectProperty,"SQL_Results")=connRes.Fields (objectProperty)
                i=i+1
                connRes.MoveNext
        Loop until connRes.EOF
        
        connRes.Close
        addConn.Close
        Set connRes=nothing
        Set addConn=nothing
End Function

不过也只能获取1列
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2012-8-14 10:45:57 | 只看该作者
Function selectSQL(strConnInfo,strSelectSql,objectProperty)
'*********************************************************
' 作者:cellule

' 功能:查询MS SQL数据库
   
' 输入:strConnInfo数据库连接信息,strSelectSql数据库查询语句,objectProperty目标字段

' 输出: 无        

' 示例:  strConnInfo="DRIVER=SQL Server;SERVER=192.168.0.7;UID=saWD=sa;APP=Microsoft Office 2003;DATABASE=UserDataDB"
'        strSelectSql=""
'        objectProperty="Money"
'        Call selectSQL(strConnInfo,strSelectSql,objectProperty)
'*********************************************************
        Dim addConn,connRes
        Dim i
        '创建数据库对象
        Set addConn=CreateObject ("adodb.Connection")
        '使用连接打开数据库
        addConn.Open strConnInfo
        '判断是否打开数据库成功
        If addConn.State=1 Then
                Reporter.ReportEvent micPass ,"成功","连接数据库成功"
                else
                Reporter.ReportEvent micFail,"失败","连接数据库失败"
                addConn.Close
                Set addConn=nothing
        End If
        '创建数据库记录集对象
        Set connRes=CreateObject ("adodb.RecordSet")
        '执行数据库查询
        connRes.Open strSelectSql,addConn
        connRes.MoveFirst()

        '判断表名是否存在,不存在着添加
        intDataCount=DataTable.GetSheetCount
        For intStat=1 to intDataCount
                strDataName=DataTable.GetSheet(intStat).Name
                If strDataName="SQL_Results" Then
                        Exit for
                        else
                        DataTable.AddSheet "SQL_Results"
                End If
        Next

        '获取表内列数
        intParameter=DataTable.GetSheet("SQL_Results").GetParameterCount
        varStat=true
        '判断如果列数为0直接添加,如果不是则把状态转成False
        If  intParameter=0 Then
                DataTable.GetSheet("SQL_Results").AddParameter objectProperty,"test"
                else
                varStat=False
        End If
        '当varStat=False执行获取列名并进行判断
        Do while varStat=False
                        For intStartParameter=1 to intParameter
                                strParameterName=DataTable.GetSheet("SQL_Results").GetParameter(intStartParameter).Name
                                If  strParameterName<>objectProperty Then
                                        If  intStartParameter=intParameter Then
                                                DataTable.GetSheet("SQL_Results").AddParameter objectProperty,null
                                                Exit do
                                        End If
                                End If       
                        Next
        Loop

        '获取sheet的rows
        intDataRow=DataTable.GetSheet("SQL_Results").GetRowCount
        '如果rows小于1直接赋值i=1
        If  intDataRow<=1 Then
                i=1
                else
                strStat=false
                intNUM=int(intDataRow)
                Do
                        DataTable.GetSheet("SQL_Results").SetCurrentRow (intNUM)
                        '获取值
                        strValue=trim(DataTable.Value(objectProperty,"SQL_Results"))
                        '判断是否为空,为空着行-1,不为空着strStat=True
                        If  strValue=null Then
                                intNUM=intNUM-1
                                else
                                i=intNUM
                                strStat=true
                        End If
                Loop until strStat=true
        End If

        '获取数据库结果并写入DataTbale中
        Do
                DataTable.GetSheet("SQL_Results").SetCurrentRow (i)
                DataTable.Value (objectProperty,"SQL_Results")=connRes.Fields (objectProperty)
                i=i+1
                connRes.MoveNext
        Loop until connRes.EOF
       
        connRes.Close
        addConn.Close
        Set connRes=nothing
        Set addConn=nothing
End Function
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2012-8-14 10:46:20 | 只看该作者
以上的请大家帮忙优化
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2019-4-10 17:57
  • 签到天数: 35 天

    连续签到: 1 天

    [LV.5]测试团长

    5#
    发表于 2012-8-14 10:49:25 | 只看该作者
    我这边也写了个, 看看能否满足LZ要求, 我用的是LocalSheet的:
            i = 1
            Do While Not rs.EOF
                    DataTable.LocalSheet.SetCurrentRow(i)
                    For j = 0 to rs.Fields.Count -1
                            If i = 1 Then
                                    DataTable.LocalSheet.AddParameter rs.Fields(j).Name,  rs.Fields(j).Value
                            Else
                                    DataTable(rs.Fields(j).Name, dtLocalSheet) = rs.Fields(j).Value
                            End If
                    Next
                   
                   rs.MoveNext
                   i = i + 1
          Loop
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
     楼主| 发表于 2012-8-14 14:53:47 | 只看该作者
    回复 5# shingo0109

    我这边是直接从数据库里查询表然后存在datatable里的,不过还是谢谢你的解答!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
     楼主| 发表于 2012-8-14 15:01:36 | 只看该作者
    回复 3# cellule

    首先谢谢你的解答,你的Function写得不错,以后我要好好学习一下。

    以下是另一位朋友写的Function,我个人觉得比较简单明了一些,而且也能得到我想要的结果。

    Function ImportDataFromDB(sql)
                    'Connect SQLServer
                    Set Con=CreateObject("ADODB.Connection")
                    Con.open "DRIVER=SQL Server;SERVER=XXX;UID=XXXWD=XXX;DATABASE=DB_Name"
                    'query data from table
                    Set Record=CreateObject("ADODB.Recordset")
                    'sql="select * from dbo.Tokenization_Service"
                    Record.open sql,con
                   
                    Record.MoveFirst
                    ' no result
                    If Record.EOF and Record.BOF Then
                                    Record.Close
                                    Reporter.ReportEvent micFail,"test","query fail"
                    Else
                                    For i = 0 to Record.Fields.Count-1
                                                    DataTable.GlobalSheet.AddParameter Record(i).name, Record(i).value
                                    Next
                                    Record.movenext
                                    j=2
                                    Do while not(Record.EOF)
                                                    For i = 0 to Record.Fields.Count-1
                                                                    DataTable.SetCurrentRow(j)
                                                                    DataTable.value(i+1,1)=Record(i).value
                                                    Next
                                                    Record.movenext
                                                    j=j+1
                                    Loop
                    End If
                   
                    Record.close
                    Set Record=nothing
                    Con.close
                    Set Con=nothing
    End Function
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-4-10 17:57
  • 签到天数: 35 天

    连续签到: 1 天

    [LV.5]测试团长

    8#
    发表于 2012-8-14 15:23:58 | 只看该作者
    本帖最后由 shingo0109 于 2012-8-14 15:37 编辑

    回复 6# betty7zhang


        是连接数据库的啊, 只不过前面那段连接数据库的我没写上去, 你之前的代码里不是有么, 要写成方法么, 加个function就可以了。
    楼上的方法貌似和我的一样的吧, 只不过他把=1的情况分离了出来, 我的是合在一起的, LZ可以试试
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2012-8-14 19:13:33 | 只看该作者
    费这个事情干嘛啊,都有数据库的谁会用DT啊自己给自己找麻烦么,要写框架也直接用dataset对象了
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 06:53 , Processed in 0.071083 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表