QTP实现了类似DataFactory的对sql Server数据库的数据增加
下面是代码,呵呵,代码比较乱,也不想去整理了,希望对大家的数据访问有所借鉴:d = GetTableInfo
'e = GetPKInfo
'f = GetFKInfo
G = StructureSql( d,1)
ExecSql(g)
Function GetTableInfo
Dim oCon,oRecord1,oRecord2,sSql1,sSql2,iCountRow,iNum,iStartTable,bMoreTable,iTableCount,aTempArray
bMoreTable = 0 '2007/10/10新增了对数据库中表进行分表处理的状态0:表示一次进行处理。1:表示进行多次处理,每次处理20条。
iStartTable = 300 '2007/10/10新增了处理表的开始数
iTableCount = 50'2007/10/10新增了一次处理的表的数目
iNum = 1
Set oCon=CreateObject("Adodb.Connection")
Set oRecord1 =CreateObject("Adodb.Recordset")
Set oRecord2 =CreateObject("Adodb.Recordset")
'20070904增加对timestamp类型的判断,因为sqlserver2000中不用对它进行处理
'20070905,修改了查询条件:不对表dtproperties处理,
'2007917sSql2查询的表信息中增加了主键的查询,目的是用于update时条件的判断
sSql1 = "select count(*)as totle from syscolumns c inner join systypes t on c.xusertype=t.xusertype left join sysproperties p on c.id=p.id and c.colid= p.smallid left join syscomments m on c.cdefault=m.id"&_
" where objectproperty(c.id,'IsUserTable')=1 and t.name!='timestamp' and object_name(c.id)<>'dtproperties' "
sSql2="SELECT (case when a.colorder=1 then d.name else '' end)表名, a.name 字段名, b.name 数据类型,COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,(case when a.isnullable=1 then '1'else '0' end) 允许空,"&_
"isnull(e.text,'NULL') as 默认值, (case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys "&_
"WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 then '1' else '0' end) 主键 FROMsyscolumnsa left join systypes b "&_
"ona.xtype=b.xusertype inner join sysobjects d on a.id=d.idandd.xtype='U' andd.name<>'dtproperties' left join syscomments e on a.cdefault=e.id left join sysproperties g on a.id=g.id AND a.colid = g.smallid"&_
"whereb.name<>'timestamp' order by d.name,a.colorder"
'在以下修改数据库的连接,指定数据库服务器名(SERVER、WSID)、帐号(UID)、密码(PWD)、项目使用的数据库(DATABASE)
oCon.Open "Description=db1;DRIVER=SQL Server;SERVER=erwin\erwin;UID=erwin;PWD=erwin;DATABASE=Test1"
IfoCon.State = 0 Then
Reporter.ReportEvent micFail, "错误", "连接数据库失败,请检查数据库连接设置"
End If
oRecord1.Open sSql1,oCon
Do
IfoRecord1("totle").Value <>"" Then
iCountRow = oRecord1("totle").Value
End If
oRecord1.MoveNext
Loop Until oRecord1.Eof=true
oRecord1.Close
Set oRecord1=Nothing
oRecord2.Open sSql2,oCon
IfbMoreTable = 0 Then
ReDim aTableDesc(iCountRow)
aTableDesc(0) = "表名"&"~"&"字段名"&"~"&"数据类型"&"~"&"长度"&"~"&"允许空"&"~"&"默认值"&"~"&"主键"
Do
If iNum - 1<iCountRow Then
aTableDesc(iNum) =oRecord2("表名").Value&"~"&oRecord2("字段名").Value&"~"&oRecord2("数据类型").Value&"~"&oRecord2("长度").Value&"~"&oRecord2("允许空").Value&"~"&oRecord2("默认值").Value&"~"&oRecord2("主键").Value
iNum = iNum +1
End If
oRecord2.MoveNext
Loop Until oRecord2.Eof=true
Else
ReDim aTableDesc(500)
aTableDesc(0) = "表名"&"~"&"字段名"&"~"&"数据类型"&"~"&"长度"&"~"&"允许空"&"~"&"默认值"&"~"&"主键"
IfiStartTable = 0 Then
i = 0
Do
If iNum - 1<iCountRow Then
aTableDesc(iNum) =oRecord2("表名").Value&"~"&oRecord2("字段名").Value&"~"&oRecord2("数据类型").Value&"~"&oRecord2("长度").Value&"~"&oRecord2("允许空").Value&"~"&oRecord2("默认值").Value&"~"&oRecord2("主键").Value
iNum = iNum +1
IfoRecord2("表名").Value <>"" Then
i = i+ 1
End If
Ifi = iTableCountThen
oRecord2.MoveNext
iNum = iNum +1
For j = 0 To 150
If oRecord2("表名").Value = "" Then
aTableDesc((iNum+j)-1) =oRecord2("表名").Value&"~"&oRecord2("字段名").Value&"~"&oRecord2("数据类型").Value&"~"&oRecord2("长度").Value&"~"&oRecord2("允许空").Value&"~"&oRecord2("默认值").Value&"~"&oRecord2("主键").Value
Else
Exit For
End If
oRecord2.MoveNext
Next
End If
End If
oRecord2.MoveNext
Loop Untili = iTableCount
Else
j = 0
i = 0
Do
IfoRecord2("表名").Value <>"" Then
j = j+ 1
End If
If oRecord2.Eof=true Then
j = iStartTable
End If
oRecord2.MoveNext
Ifj = iStartTableThen
oRecord2.MoveNext
For k = 0 To 150
If oRecord2("表名").Value <> ""Or oRecord2.Eof=true Then
Exit For
End If
oRecord2.MoveNext
Next
End If
Loop Until j = iStartTable
oRecord2.MovePrevious
Do
If iNum - 1<iCountRow Then
aTableDesc(iNum) =oRecord2("表名").Value&"~"&oRecord2("字段名").Value&"~"&oRecord2("数据类型").Value&"~"&oRecord2("长度").Value&"~"&oRecord2("允许空").Value&"~"&oRecord2("默认值").Value&"~"&oRecord2("主键").Value
iNum = iNum +1
IfoRecord2("表名").Value <>"" Then
i = i+ 1
End If
If oRecord2.Eof=true Then
i = iTableCount
End If
Ifi = iTableCountThen
oRecord2.MoveNext
iNum = iNum +1
For j = 0 To 150
If oRecord2("表名").Value = "" Then
aTableDesc((iNum+j)-1) =oRecord2("表名").Value&"~"&oRecord2("字段名").Value&"~"&oRecord2("数据类型").Value&"~"&oRecord2("长度").Value&"~"&oRecord2("允许空").Value&"~"&oRecord2("默认值").Value&"~"&oRecord2("主键").Value
IfoRecord2.Eof=trueThen
Exit For
End If
Else
Exit For
End If
oRecord2.MoveNext
Next
End If
End If
oRecord2.MoveNext
Loop Untili = iTableCount
End If
End If
oRecord2.Close
Set oRecord2=Nothing
oCon.Close
Set oCon=Nothing
iNum = 0
For i = 0 To UBound(aTableDesc)
IfaTableDesc (i) <> "" Then
iNum = iNum + 1
End If
Next
aTempArray = aTableDesc
ReDim aTableDesc(iNum - 1)
For i = 0 To iNum-1
aTableDesc (i) = aTempArray (i)
Next
GetTableInfo = aTableDesc
End Function
接上
'TestType测试类型,'0:普通类型(操作包含:Insert每张表插入2条记录(所有字段内容,长度为定义的最大长度),Update (任意所有字段)2条2个字段记录,Delete一条记录)
'1:完全测试 测试类型(完全测试类型(操作包含:Insert:对每张表插入1条记录(所有字段内容,长度为定义的最大长度),另外对每个可为空的字段插入一条为空的记录,
' Update (更新每个字段)、delete:删除1条记录)
'2:性能测试,随机插入10000条记录,更新5000条记录,删除4000条记录
'3:所有类型 。
'默认类型为:0
Function StructureSql(aTableDesc,TestType)
Dim sTableName,sTempFiled,aTempArray,aTableValue,aTableValue1,aTableSql,nFiledCount,nTableCount,aTempFiledString,aTempValuesString,aTemp,aTempArray1,aFlag,aFlag2,aFlag3,aPrim,aPrim2
Dim aTempValuesString1,sUpdateValue,sUpdateValue1,sCondition,sCondition1,aTemp1,nIsNullFiledCount,aTemp2
Dim oCon
nFiledCount = 0
nTableCount = 0
nIsNullFiledCount = 0
Num = 0
IfTestType <>0 Then
IfTestType <>1 Then
IfTestType <>2 Then
IfTestType <>3 Then
TestType = 0
End If
End If
End If
End If
For i = 1 To UBound(aTableDesc)
aTempArray =Split(aTableDesc(i), "~", -1, 1)
IfaTempArray(0) <> "" Then
nTableCount = nTableCount + 1
End If
Next
For i = 1 To UBound(aTableDesc)
aTempArray =Split(aTableDesc(i), "~", -1, 1)
IfaTempArray(4) = "1" Then
nIsNullFiledCount = nIsNullFiledCount + 1
End If
Next
Select Case TestType
Case 0
ReDim aTableSql(5*nTableCount -1)'
Fori = 1 To (UBound(aTableDesc))
nFiledCount = 0
aTemp = Split(aTableDesc(i), "~", -1, 1)
IfaTemp(0) <> ""Then
aTempArray =Split(aTableDesc(i), "~", -1, 1)
sTableName = aTempArray(0)
IfsTableName <> "" Then
For j = 0 To (UBound(aTableDesc))
If i + j <UBound(aTableDesc) Ori + j =UBound(aTableDesc) Then
IfLeft(aTableDesc(i+j) ,(Instr(1, aTableDesc(i+j) , "~", 1) -1) )= ""or Left(aTableDesc(i+j) ,(Instr(1, aTableDesc(i+j) , "~", 1) -1) )=sTableNameThen
nFiledCount = nFiledCount + 1
Else
Exit For
End If
Else
End If
Next
End If
ReDim aTableValue(nFiledCount)
ReDim aTableValue1(nFiledCount)
ReDim aFlag(nFiledCount)
aTableValue(0) = "字段名"&"~"&"值"
aFlag(0)="标志位"'用于image ntexttext的判断
For k = 1 To nFiledCount
If i+k-1<UBound(aTableDesc) Ori+k-1 =UBound(aTableDesc) Then
aTempArray =Split(aTableDesc(i+k-1), "~", -1, 1)
aTableValue(k) = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),aTempArray(3))
aTableValue1(k) = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),aTempArray(3))
IfaTempArray(2) ="image" oraTempArray(2)="ntext" oraTempArray(2)="text" Then
aFlag(k)=1
Else
aFlag(k)=0
End If
Ifk = nFiledCount -1 Then
aTempArray =Split(aTableDesc(i+k-1), "~", -1, 1)
sUpdateValue = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),aTempArray(3))
aTempArray =Split(aTableDesc(i+k), "~", -1, 1)
sUpdateValue = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),aTempArray(3))
End If
Else
Exit For
End If
Next
aTempArray =Split(aTableValue(1), "~", -1, 1)
aTempFiledString = aTempArray(0)
aTempValuesString = aTempArray(1)
If aFlag(1)=1 Then
sCondition = aTempFiledString&" LIKE "&aTempValuesString
Else
sCondition = aTempFiledString&" = "&aTempValuesString
End If
aTempArray1 =Split(aTableValue1(1), "~", -1, 1)
aTempFiledString1 = aTempArray1(0)
aTempValuesString1 = aTempArray1(1)
'image 、 ntext 、 text在进行update delete时判断的条件格式特殊,当表中只有这三个类型的字段时,"LIKE"该去掉,因为用它还是会出错
If aFlag(1)=1 Then
sCondition1 = aTempFiledString1&" LIKE "&aTempValuesString1
Else
sCondition1 = aTempFiledString1&" = "&aTempValuesString1
End If
For l = 2 To UBound(aTableValue)
aTempArray =Split(aTableValue(l), "~", -1, 1)
aTempFiledString = aTempFiledString&","&aTempArray(0)
aTempValuesString = aTempValuesString&","&aTempArray(1)
If aFlag(l)=1 Then
sCondition = sCondition'&" and "&aTempArray(0)&" LIKE"&aTempArray(1),在此不对这些字段进行判断
Else
sCondition = sCondition&" and "&aTempArray(0)&"= "&aTempArray(1)
End If
续
If k=1 Thendd=0
End If
IfaTempArray(6) =1Then
aFlag3(k)=1
dd=dd+1
aPrim2(k,0)="插入字段可为空时主键的值"'1012新增
'918修改,用于不记录相同的随机数
m=1
Whilem<>nFiledCount
Ifm=1 Then
aPrim2(k,m)=StructureDataTypeVaule(aTempArray(2),aTempArray(3))
m=m+1
Else
nn=1
Resu=StructureDataTypeVaule(aTempArray(2),aTempArray(3))
Whilenn<=m-1 and aPrim2(k,nn)<>Resu
nn=nn+1
Wend
Ifnn=m Then
aPrim2(k,m)=Resu
m=m+1
Else
m=m
End If
End If
Wend
Else
aFlag3(k)=0
End If
Ifk = nFiledCount Then'此处修改了
If k<>dd Then'用到的变量dd,它是记录该表的主键数目
'917新增,找到一个非主键的字段,同时增加一个标志qq,否则会是死循环,还有不能直接对k操作,否则同样会进入外部FOR循环的死循环
nn=k
qq=0
WhileaFlag3(nn)=1 and nn>=1 and qq=0
nn=nn-1
If aFlag3(k-1)=1 Then
nn=nn-1
Else
qq=1
End If
Wend
aTempArray =Split(aTableDesc(i+nn-1), "~", -1, 1)
sUpdateValue = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),-3)'917修改,为了update操作成功,将此语句中的"aTempArray(3)"换成-3,转到赋值那边返回个不同值
Else
aTempArray =Split(aTableDesc(i+k-1), "~", -1, 1)
sUpdateValue = aTempArray(1)&"~"&StructureDataTypeVaule(aTempArray(2),aTempArray(3))
End If
End If
Else
Exit For
End If
Next
续
aTempArray =Split(aTableValue(1), "~", -1, 1)aTempFiledString = aTempArray(0)
aTempValuesString = aTempArray(1)
tt1=0 '该变量用于标记第一个字段是否处理过,1表示处理过
If aFlag(1)=1 Then
Else
sCondition3 = aTempFiledString&" = "&aTempValuesString
tt1=1
End If
'919新增,当表中第一个及后面几个都是该过滤掉的时候,该变量tt2记录最后一个过滤字段的位置,tt3是标记是否第一个可作update的条件
tt2=1
tt3=0
For l = 2 To UBound(aTableValue)
If aTableValue(l)<>""Then '此处增加了表中值是否为空的判断
aTempArray =Split(aTableValue(l), "~", -1, 1)
aTempFiledString = aTempFiledString&","&aTempArray(0)
aTempValuesString = aTempValuesString&","&aTempArray(1)
IfaFlag(l)=1 Then
tt2=l
Else
If aFlag(l-1)=1 and l-tt2=1 and tt3=0 and tt1=0 Then '914新增,因为当表中第一个字段刚好为过滤时,若不在此加条件,之后的update的条件里面会有上个表的字段
sCondition3 = aTempArray(0)&"= "&aTempArray(1)
tt3=1
Else
sCondition3 = sCondition3&" and "&aTempArray(0)&"= "&aTempArray(1)
End If
End If
Else
Exit For
End If
Next
'907新增对字段的值可为空的处理
m=1
k=1
j=1
Whilem<>nFiledCount +1 '这里应该用该表有多少个字段来做条件
aTempArray =Split(aTableValue(m), "~", -1, 1)
If aFlag2(m)=0 and aTempArray(2)=1 Then
'下面对i之前处理过的字段赋值
Fork=1 To m-1
If aTableValue(k)<>""Then '此处增加了表中值是否为空的判断
aTempArray =Split(aTableValue(k), "~", -1, 1)
If k=1Then
aTempFiledString1(j)=aTempArray(0)
If aFlag3(k)=1 Then'917新增,如果该字段为主键,则赋不同的值
aTempValuesString1(j) = aPrim2(k,j)
Else
aTempValuesString1(j) = aTempArray(1)
End If
Else
aTempFiledString1(j)=aTempFiledString1(j)&","&aTempArray(0)
IfaFlag3(k)=1 Then
aTempValuesString1(j) = aTempValuesString1(j)&","&aPrim2(k,j)
Else
aTempValuesString1(j) = aTempValuesString1(j)&","&aTempArray(1)
End If
End If
Else
Exit For
End If
Next
'下面是对i对应的本字段处理,不给它赋值
aTempArray =Split(aTableValue(m), "~", -1, 1)
If m=1 Then
Else
aTempValuesString1(j) = aTempValuesString1(j)
End If
aFlag2(m)=1
'对i之后的字段正常赋值
For l = m+1 To UBound(aTableValue) '这里循环次数要修改
If aTableValue(l)<>""Then '此处增加了表中值是否为空的判断
aTempArray =Split(aTableValue(l), "~", -1, 1)
Ifl=2Then'这样有问题,当前面的aTempFiledString1(j)已经有值时,这样会丢失掉之前的值
aTempFiledString1(j)=aTempArray(0)
IfaFlag3(l)=1 Then
aTempValuesString1(j)=aPrim2(l,j)'1012这个地方再研究一下
Else
aTempValuesString1(j) = aTempArray(1)
End If
Else
aTempFiledString1(j)=aTempFiledString1(j)&","&aTempArray(0)
IfaFlag3(l)=1 Then
aTempValuesString1(j) = aTempValuesString1(j)&","&aPrim2(l,j)'aPrim((j-1)*nIsNullFiledCount +l)
Else
aTempValuesString1(j) = aTempValuesString1(j)&","&aTempArray(1)
End If
End If
Else
Exit For
End If
Next
'下面是对i(包括i字段)之前处理过的字段,让它们正常赋值
Else
End If
m=m+1
'910修改,当此次循环中aTempValuesString1数组值为空时,下标不往下移动
IfaTempValuesString1(j)=Empty Then
Else
j=j+1
End If
Wend
续
aTableSql(Num) = "insert into "&sTableName&" ("&aTempFiledString&") "&"values ("&aTempValuesString&")"Num = Num + 1
aTempArray =Split(sUpdateValue, "~", -1, 1)
aTableSql(Num) = "update "&sTableName&"set "&aTempArray(0)&" = "&aTempArray(1)&"where "&sCondition3
Num = Num + 1
aTempArray1 = Split(sCondition3, " and ", -1, 1)
For m = 0 To UBound(aTempArray1)
aTemp1 =Split(aTempArray1(m), " = ", -1, 1)
IfaTemp1(0)= aTempArray(0) Then
aTemp2 = Split(sUpdateValue, "~", -1, 1)
sUpdateValue = aTemp2(0)&" = "&aTemp2(1)
aTempArray1(m) = sUpdateValue
End If
Next
'delete条件由aFlag最后一位来确定,当最后一位为要过滤的字段时,delete条件沿用update的条件;否则,只要update中set中那个字段及值就可以了
IfaFlag( UBound(aFlag))=1 Then
Else
sCondition3=aTempArray(0)&" = "&aTempArray(1)
End If
aTableSql(Num) = "delete from"&sTableName&" where "&sCondition3
Num = Num + 1
'907新增对可空字段,每个都插入一条数据
n=1
Whilen<>nFiledCount+1 andaTempValuesString1(n)<>Empty'这里可能越界,所以在定义该aTempValuesString时,空间放大点,and
aTableSql(Num) = "insert into "&sTableName&" ("&aTempFiledString1(n)&") "&"values ("&aTempValuesString1(n)&")"
Num = Num + 1
n=n+1
Wend
aTempArray =Split(sUpdateValue1, "~", -1, 1)
aTableSql(Num) = "update "&sTableName&"set "&aTempArray1(0)&" where "&sCondition3
Num = Num + 1
End If
Next
Case 2
Case 3
End Select
Num = 0
For i = 0 To UBound(aTableSql)
IfaTableSql (i) <> "" Then
Num = Num + 1
End If
Next
aTempArray1 = aTableSql
ReDim aTableSql(Num - 1)
For i = 0 To Num-1 '914修改,原先为 i = 0 To Num -1
aTableSql (i) = aTempArray1 (i)
Next
StructureSql = aTableSql
End Function
续
Function StructureDataTypeVaule(FiledType,nFiledLen)Select Case FiledType
Case "bigint"
IfnFiledLen<>-3 Then
IfnFiledLen <=12 Then '1014修改,因为当长度超过12位时,sqlserver2000里面用科学计数表示时,只是精确到小数点后11位,这样如果它为主键,且不处理,有时会报主键不能重复插入相同值的错误。
For k=1 To nFiledLen-3
strTemp="2"&strTemp
Next
Randomize
iTemp = Int((999 * Rnd) + 1)
strTemp=strTemp&CStr(iTemp)
RetValue=CDbl(strTemp)
Else
strTemp="222222"
Randomize
iTemp = Int((999 * Rnd) + 1)
strTemp=strTemp&CStr(iTemp)
RetValue=CDbl(strTemp)
End If
Else
RetValue=888
End If
Case "binary"
IfnFiledLen<>-3 Then
If nFiledLen>=3Then '修改,因为有时遇到binary长度小于3的情况
For k = 1 To nFiledLen-3
Ifk=197 Then'916新增
Exit For
Else
strTemp = "1"&strTemp
End If
Next
Ifk>=nFiledLen-3 Then '916增
Randomize
iTemp = Int((999 * Rnd) + 1)
strTemp=strTemp&CStr(iTemp)
RetValue="convert(binary("& nFiledLen&"),'0x"&strTemp&"')"
Else
Randomize
iTemp = Int((999 * Rnd) + 1)
strTemp=strTemp&CStr(iTemp)
RetValue="convert(binary("&k-1&"),'0x"&strTemp&"')"
End If
Else'相对于If nFiledLen>=3Then
RetValue="convert(binary(1),'0x1')"
End If
Else ' 相对于IfnFiledLen<>-3 Then
RetValue="convert(binary(1),'0x6')"
End If
Case "bit"
If nFiledLen<>-3 Then
RetValue=1
Else
RetValue=0
End If
Case "char"
If nFiledLen<>-3 Then
If nFiledLen<=3 Then '919新增当nFiledLen小于3时的情况,不过这种情况一般很少
IfnFiledlen=1 Then
Randomize '1014修改,本来是用字符的,不过当长度为1,且为主键时,用数字字符方便处理
iTemp = Int((9 * Rnd) + 1)
RetValue="'"&CStr(iTemp)&"'"
Else
Randomize '1014修改,本来是用字符的,不过当长度为2到3,且为主键时,用数字字符方便处理
iTemp = Int((99 * Rnd) + 1)
RetValue="'"&CStr(iTemp)&"'"
End If
Else
For k = 1 To nFiledLen-3'917修改,留出三位空间给主键的赋值使用
strTemp = "a"&strTemp
Next
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
End If
Else
strTemp="b" '注意 ,在此只赋一个值的用途:1.给更新的字段赋值;2.当更新字段恰好只为一个长度时,能避免赋其他值时碰到的长度不匹配
RetValue="'"&strTemp&"'"
End If
Case "datetime"
If nFiledLen<>-3 Then
strTemp="1753-10-1 20:"
strTemp1=":12"
Randomize '1014修改,因为有将datetime类型设置为主键的情况
iTemp = Int((45* Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&strTemp1&"'"
'RetValue=CDate(strTemp)
Else
strTemp="'1853-10-1 20:45:12'"
RetValue=strTemp
End If
Case "decimal"
If nFiledLen<>-3 Then
IfnFiledLen<9 Then '1014修改,因为有可能定义的长度小于9,且为主键,不处理,会报错
Randomize
iTemp = Int((99 * Rnd) + 1)
RetValue=CDbl(iTemp)
Else
For k=1 To nFiledLen/2-3
strTemp="2"&strTemp
next
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue=CDbl(strTemp&CStr(iTemp))
End If
Else
strTemp="0"
RetValue=CDbl(strTemp)
End If
Case "float"
If nFiledLen<>-3Then
strTemp="1234567"
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue=CDbl(strTemp&CStr(iTemp))
Else
strTemp="11111111"
RetValue=CDbl(strTemp)
End If
'image类型处理
Case "image"
If nFiledLen<>-3 Then
strTemp="111111111111111111111111111"
Else
strTemp="888"
End If
RetValue="'"&strTemp&"'"
Case "int"
If nFiledLen<>-3 Then
Randomize
RetValue = Int((999* Rnd) + 1)
Else
RetValue=0
End If
Case "money"
If nFiledLen<>-3Then
strTemp="8223372035477.5807"
Else
strTemp="666666.123"
End If
RetValue=CCur(strTemp)
Case "nchar"
IfnFiledLen<>-3Then
For k = 1 To nFiledLen-3
strTemp="b"&strTemp
Next
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
Else
strTemp="cc"
RetValue="'"&strTemp&"'"
End If
Case "ntext" '没有定义长度
If nFiledLen<>-3Then
RetValue = "'cccccccccccccccccccc'"
Else
RetValue = "'aaaaa'"
End If
续
Case "numeric"IfnFiledLen<>-3Then
IfnFiledLen<>18 Then '这样处理时因为定义numeric类型的字段时,当不采用默认的情况下,读出的长度和精度在显示表信息那里没有处理。所以这里暂时这样处理
Randomize
iTemp = Int((99* Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
Else
For k=1 To nFiledLen-3
strTemp="2"&strTemp
next
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
End If
Else'相对于 IfnFiledLen<>-3Then
strTemp="1111"
RetValue=CDbl(strTemp)
End If
Case "nvarchar"
If nFiledLen<>-3 Then
For k = 1 To nFiledLen-3
Ifk=200 Then'916修改,因为当表同时还有varchar类型时,且都达到他们的最大,那么在运行插入语句时,报"无法创建大小为8084的行,该值最大允许8060"
Exit For
Else
strTemp="d"&strTemp
End If
Next
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
Else
strTemp="g"
RetValue="'"&strTemp&"'"
End If
Case "real"
If nFiledLen<>-3Then
For k=1 To nFiledLen
strTemp="2"&strTemp
next
Else
strTemp="9"
End If
RetValue=CSng(strTemp)
Case "smalldatetime"
If nFiledLen<>-3 Then
strTemp="1900-1-1 20:45"
Else
strTemp="1999-1-1 20:45"
End If
RetValue="'"&strTemp&"'"
Case "smallint"
If nFiledLen<>-3 Then
Randomize
RetValue = Int((999* Rnd) + 1)
Else
RetValue=888
End If
Case "smallmoney"
If nFiledLen<>-3 Then
strTemp="200000"
Else
strTemp="100000"
End If
RetValue=CCur(strTemp)
Case "sql_variant"
IfnFiledLen<>-3 Then
strTemp="'1900-1-1 20:45'"
Else
strTemp="'1999-1-1 20:45'"
End If
RetValue=strTemp
Case "text"
If nFiledLen<>-3Then
RetValue = "'eeeeeeeeeeeeeeeeeee'"
Else
RetValue = "'zzz'"
End If
'timestamp不用处理,每次更新表的时候,系统自动插入一个时间戳
Case "tinyint"
If nFiledLen<>-3 Then
Randomize
iTemp = Int((255 * Rnd) + 1)
RetValue=iTemp
Else
RetValue=100
End If
Case "uniqueidentifier"
If nFiledLen<>-3 Then
strTemp="67EE7C0B-989D-46FB-8657-36088FC6C20B"
Else
strTemp="7D8146EE-88D6-4F36-BBD8-1090DD045860"
End If
RetValue="'"&strTemp&"'"
Case "varbinary" '914修改,让该类型的字段直接插入为本16进制的数据
IfnFiledLen<>-3 Then
For k = 1 To nFiledLen
Ifk=100 Then'916增
Exit For
Else
strTemp = "1"&strTemp
End If
Next
Ifk>nFiledLen Then '916增
RetValue="convert(varbinary("& nFiledLen&"),'0x"&strTemp&"')"
Else
RetValue="convert(varbinary("&k-1&"),'0x"&strTemp&"')"
End If
Else
RetValue="convert(varbinary(6),'0x111111')"
End If
Case "varchar"
If nFiledLen<>-3 Then
For k = 1 To nFiledLen-3
strTemp="h"&strTemp
Next
If nFiledLen<=3 Then '919新增当nFiledLen小于3时的情况,不过这种情况一般很少
Randomize '1014修改,本来是用字符的,不过当长度小于3,且为主键时,用数字字符方便处理
iTemp = Int((9 * Rnd) + 1)
RetValue="'"&CStr(iTemp)&"'"
Else
Randomize
iTemp = Int((999 * Rnd) + 1)
RetValue="'"&strTemp&CStr(iTemp)&"'"
End If
Else
strTemp="v"
RetValue="'"&strTemp&"'"
End If
End Select
StructureDataTypeVaule = RetValue
' msgbox(typename(RetValue)) '检测返回值类型
End Function
续
Function ExecSql(aTableSql)Dim oCon,sSql1
Set oCon=CreateObject("Adodb.Connection")
'Set fso = CreateObject("Scripting.FileSystemObject")
'Set MyFile = fso.CreateTextFile("c:\ExecSQLs.txt", True)
'在以下修改数据库的连接,指定数据库服务器名(SERVER、WSID)、帐号(UID)、密码(PWD)、项目使用的数据库(DATABASE)
oCon.Open "Description=db1;DRIVER=SQL Server;SERVER=erwin\erwin;UID=erwin;PWD=erwin;DATABASE=Test1"
IfoCon.State = 0 Then
Reporter.ReportEvent micFail, "错误", "连接数据库失败,请检查数据库连接设置"
End If
'记录执行的SQL语句数
' i = 655
i = 0
Whilei < UBound(aTableSql)
'每次执行10条SQL语句
Forj = 0To 10
If j = 0Then
oCon.BeginTrans
'MyFile.WriteLine "Begin Tran abc"
End If
If i =UBound(aTableSql)Then
Exit For
Else
sSql1 = aTableSql(i)
oCon.Execute sSql1
'MyFile.WriteLine sSql1
i=i+1
End If
Next
oCon.CommitTrans
'MyFile.WriteLine "Commit Tran abc"
' oCon.RollbackTrans
Services.ThinkTime(2)
Wend
oCon.Close
Set oCon=Nothing
End Function 先顶一把吧
谢谢楼主分享,还没细看:lol
什么垃圾玩艺
什么垃圾玩艺 LZ.最好整一个TXT文件.呵呵.这样好一些 就是啊,楼主应该整理成一篇文档,这样可以方便别人阅读! 本帖最后由 cebio 于 2010-12-13 17:41 编辑不错!可是有两点意见:
1.QTP跑性能是个问题,100万以上
2.同样用QTP实现的时间,还不如直接用TSQL来的可靠。
页:
[1]