'当然,你也可以自己写程序实现.例如:'执行指定文件中的 SQL 语句,sDatabase指定用来执行的数据库 'sProgressBar指定显示处理进度的进度条,sUseTrans指定是否使用事务处理 Public Function fExecuteSqlFromFile(ByVal sFileName$ _ , ByVal sDataBase As ADODB.Connection _ , Optional ByVal sUseTrans As Boolean = True _ ) As String Dim iSqlStr$, iText$ Dim iReturn As String
If sDataBase Is Nothing Then iReturn = "数据库服务器不可用" GoTo lbExit End If If sDataBase.State = adStateClosed Then iReturn = "未打开数据库服务器" GoTo lbExit End If
With sDataBase On Error GoTo lbFileErr Open sFileName For Input As #1
On Error GoTo lbErr
Do While Not EOF(1) Line Input #1, iText If LCase(iText) = "go" Then '若所读取的行为'go',则表示已读取一个完整的语句行 If iSqlStr <> "" Then .Execute iSqlStr '执行所读取的语句 iSqlStr = "" DoEvents Else iSqlStr = iSqlStr & iText & vbCrLf End If DoEvents Loop Close #1 If iSqlStr <> "" Then .Execute iSqlStr End With
iReturn = "" GoTo lbExit
lbFileErr: iReturn =error() GoTo lbExit lbErr: iReturn = error() lbExit: fExecuteSqlFromFile = iReturn End Function
我想执行的几条语句是这样的: set rowcount 10 select * from table1 where field_ID > 1000 set rowcount 0 我想让第二条语句返回一个adodb.recordset对象,以便进行处理, 但是当我把这三条语句放在一个字符串数组strSQL(2)中, 然后用cmd.execute顺序执行时,第一条语句对第二条语句不起作用,这样我选择的是所有field_ID > 1000记录,而不是我所想要的前十条记录。 用存储过程似乎可以解决这个问题,但用户方出于安全性考虑,不允许我们建立存储过程,那么我该怎么办呢?
master.dbo.xp_cmdshell 'osql -U 用户名 -P 密码 -i c:\***.sql'
'sProgressBar指定显示处理进度的进度条,sUseTrans指定是否使用事务处理
Public Function fExecuteSqlFromFile(ByVal sFileName$ _
, ByVal sDataBase As ADODB.Connection _
, Optional ByVal sUseTrans As Boolean = True _
) As String
Dim iSqlStr$, iText$
Dim iReturn As String
If sDataBase Is Nothing Then
iReturn = "数据库服务器不可用"
GoTo lbExit
End If
If sDataBase.State = adStateClosed Then
iReturn = "未打开数据库服务器"
GoTo lbExit
End If
With sDataBase
On Error GoTo lbFileErr
Open sFileName For Input As #1
On Error GoTo lbErr
Do While Not EOF(1)
Line Input #1, iText
If LCase(iText) = "go" Then '若所读取的行为'go',则表示已读取一个完整的语句行
If iSqlStr <> "" Then .Execute iSqlStr '执行所读取的语句
iSqlStr = ""
DoEvents
Else
iSqlStr = iSqlStr & iText & vbCrLf
End If
DoEvents
Loop
Close #1
If iSqlStr <> "" Then .Execute iSqlStr
End With
iReturn = ""
GoTo lbExit
lbFileErr:
iReturn =error()
GoTo lbExit
lbErr:
iReturn = error()
lbExit:
fExecuteSqlFromFile = iReturn
End Function
set rowcount 10
select * from table1 where field_ID > 1000
set rowcount 0
我想让第二条语句返回一个adodb.recordset对象,以便进行处理,
但是当我把这三条语句放在一个字符串数组strSQL(2)中, 然后用cmd.execute顺序执行时,第一条语句对第二条语句不起作用,这样我选择的是所有field_ID > 1000记录,而不是我所想要的前十条记录。 用存储过程似乎可以解决这个问题,但用户方出于安全性考虑,不允许我们建立存储过程,那么我该怎么办呢?