该函数应该只使用连接字符串和SQL查询作为输入,它应该连接到任何数据库(SQL,ORACLE,SYBASE,MS ACCESS)并执行我作为参数传递给函数的任何查询。
我已为此任务编写了以下功能,请您检查一次并告诉我这是正确的还是请告诉我,如果我错了。
#Public Function ConnectDB (strCon, strQuery)
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open strCon
objRecordSet.Open strQuery,objConnection
objRecordSet.MoveFirst
Do Until objRecordset.EOF
Msgbox "Number of records: " & objRecordset.RecordCount
Msgbox objRecordset(0)
Msgbox objRecordset(1)
objRecordset.MoveNext
Loop
objRecordSet.Close
objConnection.Close
Set objConnection = Nothing
Set objRecordSet = Nothing
End Function
#
Call ConnectDB ("Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = inventory.mdb","SELECT * FROM EMP ORDER BY EMPName")
更新
非常感谢您的回复。
实际上我被要求编写一个函数来执行连接到任何数据库并在该连接的数据库中执行任何查询(由用户给出)的任务。
我已经开始学习VBScript,并希望深入了解编写函数。 Ekkehard horner你能告诉我在哪里可以阅读以了解所有关于例程(功能和子程序)的信息。目前,我只有关于例程的基本想法,我提到了MSDN,他们只提供了基本信息。请帮助我在哪里学习更多关于例程的内容。如果不正确地了解程序就很难编写程序。
嗨Sanpaco,下面是我写的课程。请检查一次,让我知道更正。 我是VBScript的新手。请教我提高编程知识的方法。
Class DBCommunicator
Public Function DBConnect(StrCon)
Option Eplicit
Dim oConn
set oConn = CreateObject("ADODB.Connection")
oConn.Open Strcon
Function DBConnect = True
End Function
Public Function QueryDB(StrQuery)
Option Eplicit
Dim oRst, oField
set oRst = CreateObject("ADODB.recordset")
oRst.Open "StrQuery", oConn
Do Until oRst.EOF
For each oField in oRst.Fields
Print oField.Name & " = " & oField.Value
Next
oRst.MoveNext
loop
Public Function DBdisConnect
oRst.close
oConn.close
End Function
End Class
########################################
Option Explicit
Dim strResult
strResult=DBCommunicator.DBConnect("<<Connection String of any database User want to connect>>")
If strResult<>True Then
wscript.echo "DB Connection Failed"
End If
DBCommunicator.QueryDB("Select * from EMP")
DBCommunicator.DBdisConnect
答案 0 :(得分:1)
例程(Sub或Function)应该完成一个可重复/可重用的任务。您的 函数创建,打开和关闭连接,创建,使用和关闭 记录集,并用消息框惹恼用户。如果你想做点什么 明天是明智的,你必须写(通过复制和粘贴和修改)另一个 例程。
一个函数应该返回一个值;你的没有。功能应该没有 副作用;你的做IO。例行的工作/行为应该 仅由其参数决定;你的取决于默认设置/值 对于你没有提供的.Open方法的众多参数。
代码不应含有脂肪; .MoveFirst在.EOF循环之前,显示 。循环中的.RecordCount,并立即将对象变量设置为Nothing 在例程结束之前就是这样。 VBScript代码应以“Option”开头 明确的“;你的显然没有。
虽然您学习时特定DBMS的独立性很有吸引力 或调查,应该是一个现实世界问题的专业解决方案 基于对任务的“最佳”DBMS的决定;这将导致 使用DBMS特定功能的DBMS特定代码。然后切换 通过仅更改ConnectionString将一个DBMS转换为另一个DBMS是一种幻想。
数据库工作是“connect-do one thing-disconnect”风格的 .Net的ADO或“在启动时连接 - 执行许多不同的事情 - 断开连接 终止“'经典'ADO的风格。如果你指出,什么样的任务 你记得,我可能愿意附上这个答案。
答案 1 :(得分:0)
您可以考虑创建一个DatabaseCommunicator类来执行单独的数据库函数(Connect,ExecuteQuery,Disconnect),而不是尝试使用一种方法执行所有操作。此外,如果您想要动态使用不同类型的提供程序,那么您需要验证查询格式,以确保它为您使用的任何提供程序使用正确的语法。
如果你接受它,我会很高兴看到你如何完成这项任务。
答案 2 :(得分:0)
我修复了您的代码,不确定是否同意,但是似乎可行。我认为VB脚本不能识别类。
Option Explicit
'https://stackoverflow.com/questions/8429313/a-generic-vbscript-function-to-connect-to-any-database-and-execute-any-sql-query
'https://www.connectionstrings.com/microsoft-sql-server-odbc-driver/
Dim oConn, oRst
Public Function DBConnect(StrCon)
set oConn = CreateObject("ADODB.Connection")
oConn.Open Strcon
DBConnect = True
End Function
Public Function DBQuery(StrQuery)
Dim oField
set oRst = CreateObject("ADODB.recordset")
oRst.Open StrQuery, oConn
Do Until oRst.EOF
For each oField in oRst.Fields
wscript.echo oField.Name & " = " & oField.Value
Next
oRst.MoveNext
Loop
End Function
Public Function DBdisConnect
oRst.close
oConn.close
End Function
Dim strResult
strResult=DBConnect("<<Connection String of any database User want to connect>>")
If strResult<>True Then
wscript.echo "DB Connection Failed"
End If
DBQuery("Select * from EMP")
DBdisConnect