救命啊!请各位高手,大侠帮忙,问题关于asp调用dll向数据库添加或修改数据.

tanqi 2002-09-29 08:41:06
各位高手,大侠:
我有一函数用于添加,保存数据.其中通过asp调用该函数向它传递参数,参数中有字符串,数字,日期等变量,由于asp不能定义变量,可能导致函数存数据库的错误.请问应如何在dll的函数中定义传参.
请给我一个例子关于添加记录的带参数的dll函数.请大家务必帮忙,否则我不能回家了。老板要我今天就调试出来.

救命!救命!救命!救命!救命!救命!
...全文
47 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanqi 2002-09-30
  • 打赏
  • 举报
回复
abigfrog(☆★千年精灵★☆)
你还是没告诉我如何存储或添加记录。
tanqi 2002-09-30
  • 打赏
  • 举报
回复
MeXP(秦汉风)大哥:
.UpdateBatch都改为update
还是报错。
错误类型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
/chinasiec/resource/docflow/savetest.asp, 第 84 行
iStringTheory 2002-09-30
  • 打赏
  • 举报
回复
利用VB6编写通用的数据库访问组件

  数据库的连接贯穿整个软件开发的环节,是开发MIS系统必须首要考虑的问题,现在比较实用的数据库有Access、SQL Server、Oracle等,其它的一般用ODBC表示。现在接合Visual Basic强大的类开发功能,本人把ADO开发成组件使用,进行封装,方便大家的应用。方法如下:
启动Visual Basic 6.0。在新建项目中选择ActionX Dll确定,则进入组件开发环境中,把Class1换名为DataAccess.在项目菜单中加入引用,找到 Microsoft ActionX Data Object 20 Library 或更高版本确定。
在类中定义一局部连接对象变量。 Private mCnnDB As New ADODB.Connection()
然后定义连接Access数据库的过程. Access 数据库是Microsoft开发的本地数据库,用adUseClient指定。它通过Microsoft.Jet.OLEDB数据访问方式访问数据库,Microsoft.Jet.OLEDB又有多种版本,其中4.0是最高版本,它能访问ACCESS 2000,所以这里的数据提供者指定为Microsoft.Jet.OLEDB.4.0。指定了本地数据库和提供者后,就可打开一个数据库了,用open方法实现。完整的代码如下:
'作用: 连接Access数据库
'参数: DBName 数据库名
Public Sub ConnAccess(ByVal DBName As String)
Dim strDB As String
mCnnDB.CursorLocation = adUseClient
mCnnDB.Provider = "Microsoft.Jet.OLEDB.4.0"
mCnnDB.Open(DBName, "Admin")
End Sub
ODBC是一种广泛使用的连接多种数据库的方法,有万能钥匙之功效,但它需要通过ODBC先建立一个DNS,这里不作详细说明.有了DNS就可访问所连接的数据库。访问ODBC时先指明提供者,提供者只能为Microsoft 命名的MSDASQL,然后通过连接字符串指定数据源,用户名和密码,在下面的ConnectionString中指定,最后用open打开。由于ODBC分有用户名和无用户名两者,我们必须分别实现,借助类的函数名重载功能,我们编写两个同名的过程,完整的代码如下:
'作用: 连接ODBC数据库(不需指定用户和密码 )
'参数:dsnName为ODBC名
Public Sub ConnODBC(ByVal dsnName As String)
mCnnDB.Provider = "MSDASQL"
mCnnDB.ConnectionString = "Data Source='" & dsnName & "'"
mCnnDB.Open()
End Sub
'作用: 连接ODBC数据库(需指定用户和密码 )
'参数:dsnName ODBC名,UserID 用户名,UserPwd 用户密码
Public Sub ConnODBC(ByVal dsnName As String, ByVal UserID As String, ByVal UserPwd As String) mCnnDB.Provider = "MSDASQL"
mCnnDB.ConnectionString = "Data Source='" & dsnName & "'User ID='" & UserID & "';" & _
"Password='" & UserPwd & "
mCnnDB.Open()
End Sub
SQL Server数据库是Microsoft开发的一种广泛使用的后台数据库。访问SQL Server可以通过指明ODBC驱动程序为SQL Server来实现,即在连接字符串中要有driver={SQL Server},由于它是后台数据库,所以必须指明SQL Server所在的计算机名,通常把它称为服务器,下面的ServerName就说明这点,然后指明是连接哪个数据库。其它的类似上面的ODBC。SQL Server的用户分为WIN NT 和授权用户,WIN NT用户是不需要指定用户名和密码的超级用户,否则要指明用户名和密码,这责定于SQL Server数据库管理员,在此不作详细说明,完整的代码如下:
'作用: 连接SQL Server数据库
'参数:ServerName 服务器名,DBName 数据库名
Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String)
With mCnnDB
.ConnectionString = "uid=;pwd= ;driver={SQL Server};" & _
"server=" & ServerName & _
";database=" & DBName
.Open()
End With
End Sub
'作用: 连接SQL Server数据库
'参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码
Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String,ByVal UserID As String, ByVal UserPwd As String)
With mCnnDB
.ConnectionString = "uid=’” & UserID & “’;pwd=’” & UserPwd &”’;driver={SQL Server};" & _
"server=" & ServerName & _
";database=" & DBName
.Open()
End With
End Sub
Oracle数据库是目前最有影响的一种广泛使用的后台数据库。访问Oracle先指明其提供者MSDAORA。Oracle与Sql Server不同的是它不是通过数据库来管理的,所以它不需指明数据库,但它连接时必须指明用户,即使是超级用户也如此,这是它的安全性能高于Sql Server的理现之一,所以我们只须编写一个过程。其它类似。完整的代码如下:
'作用: 连接Oracle数据库
'参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码
Public Sub ConnOracle(ByVal ServerName As String, ByVal UserID As String, ByVal UserPwd As String)
With mCnnDB
.Provider = "MSDAORA"
.ConnectionString = "User ID='" & UserID & "';" & _
"Password='" & UserPwd & "';" & _
"Data Source='" & ServerName & "'"
.Open()
End With
End Sub
编写连接表的函数:传入的参数有TableName为所连接的表,缺省参数strWhere为条件。
说明:连接表在ADO中比较复杂,一般要指定光标类型,锁类型。且指定不当连接的表就不能修改数据。为避免这些麻烦,编写这个函数及为必要。
Public Function OpenTable(ByVal TableName, Optional ByVal strWhere As String) As ADODB.Recordset
Dim strSql As String
Dim rec As ADODB.Recordset
Set rec = New ADODB.Recordset
rec.CursorType = adOpenKeyset
rec.LockType = adLockOptimistic
If strWhere = "" Then
strSql = "SELECT * FROM " & TableName
Else
strSql = "SELECT * FROM " & TableName & " where " & strWhere
End If
rec.Open strSql, mCnnDB '打开记录集
If Not rec.EOF Then
rec.MoveLast
rec.Open(strSql, mCnnDB) '打开记录集
If Not rec.EOF Then
rec.MoveLast()
rec.MoveFirst()
End If
OpenTable = rec
End Function
下面是扩充上面函数的功能,可以跟据条件访问单个表。
Public Overloads Function OpenTable(ByVal TableName As String, ByVal strWhere As String) As ADODB.Recordset
Dim strSql As String
Dim rec As ADODB.Recordset
rec = New ADODB.Recordset()
rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
strSql = "SELECT * FROM " & TableName & " where " & strWhere
rec.Open(strSql, mCnnDB) '打开记录集
If Not rec.EOF Then
rec.MoveLast()
rec.MoveFirst()
End If
Return rec
End Function
我们继续扩充访问表的功能。有时要打开多个表,读写其中的数据,我们可以通过建立查询视图实现,其它类似上面的OpenTable,完整的代码如下:
'作用:连接多表
'参数:strSQL
'返回:记录集
Public Function ExecuteSQL(ByVal strSql As String) As ADODB.Recordset
Dim rec As New ADODB.Recordset()
rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
rec.Open(strSql, mCnnDB) '打开记录集
ExecuteSQL = rec
End Function

下面编写了一个用记录集填充MSFlexGrid网格的过程。其中函数RecordCount是我自己编写的求记录集中记录数据的函数。这里不能直接用ADO的RecordCount求得。如果记录集是空,则退出过程。否则求出记录集的记录数和字段数据用来确定MSFlexGrid网格的行列数据,然后读出记录集的数据直接填充到MSFlexGrid网格。要说明的是读出记录集的数据时要先判断是否为空值,由函数IsDBNull实现(函数IsDBNull来源于System.DBNull).最后记录集应该返回到记录首位,否则影响了原有的记录集,完整的代码如下:
'作用:用记录集的数据填充网格
'参数:MSGrid 网格对象,rec 记录集对象
Public Sub FillMsGrid(ByVal MSGrid As MSFlexGrid.MSFlexGrid, ByVal rec As ADODB.Recordset)
Dim i, j, RecordNum As Integer
If rec.EOF Then Exit Sub
RecordNum = RecordCount(rec)
MSGrid.Rows = RecordNum + 1
MSGrid.Cols = rec.Fields.Count + 1
For i = 0 To RecordNum - 1
For j = 0 To rec.Fields.Count - 1
If IsDBNull(rec(j).Value) Then
MSGrid.set_TextMatrix(i + 1, j + 1, "")
Else
MSGrid.set_TextMatrix(i + 1, j + 1, rec(j).Value)
End If
Next
MSGrid.set_TextMatrix(i + 1, 0, i)
rec.MoveNext()
Next
rec.MoveFrist()
End Sub
'作用:取记录集的记录数
'参数:rec 记录集对象
'返回:记录集的记录数

Public Function RecordCount(ByVal rec As ADODB.Recordset) As Integer
Dim i As Integer
If rec.EOF Then
RecordCount = 0
Exit Function
End If
With rec
.MoveFirst()
Do While Not .EOF
i += 1
.MoveNext()
Loop
.MoveFirst()
End With
RecordCount = i
End Function

以上代码编好后可直接生成为DLL组件。方法是在文件菜单中选择生成DataAccess.dll文件。系统自动生成组件并注册。可在磁盘中找到DataAccess.dll文件,即一切成功。然后,你可以直接调用该组件。
现在利用上面的数据访问组件编写测试代码如下:在Visual Basic中建立一项目,在窗口Form1中加入一MSFlexGrid网格命名为MsGrid1,布置如下


然后引用刚建立的Dll。方法是选择项目菜单的引用,找到DataAccess,勾上左边勾。没有找到可按浏览在磁盘中找到该DLL文件勾上左边勾,确定后引用完成。
tanqi 2002-09-30
  • 打赏
  • 举报
回复
MeXP(秦汉风)大哥:
请问在dll函数中创建connection对象是否也应该用 Set objtest = Server.CreateObject("xxxx.xxx"),因为我也是用函数创建数据库连接,然后在asp中调用。我在dll中是用CreateObject("abodb.connection")的,是否这样不对,还有,如何在dll中使用Server.CreateObject(“***”)创建对象。
谢谢,请教,求助。
MeXP 2002-09-29
  • 打赏
  • 举报
回复
.UpdateBatch都改为update
MeXP 2002-09-29
  • 打赏
  • 举报
回复
vbscript中变量是变体,所以由你付给变量值而变,当你给它传参数时,变量的值已经赋好了,注意对象用set赋值。直接传就行了。例如:
set conn=server.createobject("adodb.connection")
conn.open "xxxxx"
doctype="xxx"
dataurl="http://www.xxx.com"
......

Set objtest = Server.CreateObject("xxxx.xxx")
objtest.savedataurltmp conn,doctype,dataurl,......

其实我觉得还不如改成存储过程,可能效率更高
tanqi 2002-09-29
  • 打赏
  • 举报
回复
其中表能打开,但在保存时出错。
tanqi 2002-09-29
  • 打赏
  • 举报
回复
MeXP(秦汉风(Delphi初学)) ( ) 信誉:116

我的意思是asp不能这样定义 dim aa as string,这样在函数里是否会不认aa为字符串,因为,在村数据库时,变量类型是严格对应的。
函数如下:

Public Function savedataurltmp(ByRef objConn, docType, ByVal dataUrl As String, pubName, _
pubdate, title, flowName, Expireday)
Dim var1 As String
var1 = dataUrl

Dim tmpRst As ADODB.Recordset
Set tmpRst = CreateObject("ADODB.Recordset")
strSql = "select * from dataurltmp where dataUrlStr='" & var1 & "'"
tmpRst.Open strSql, objConn, 3, 3

If tmpRst.BOF And tmpRst.EOF Then
With tmpRst
.AddNew
.Fields("judPage") = CStr(docType)
.Fields("docName") = CStr(flowName)
.Fields("title") =CStr(title)
.Fields("dataUrlStr") = var1
.Fields("pubName") = CStr(pubName)
.Fields("pubDate") = Now
.Fields("expire") = CInt(Expireday)
.Fields("ifexpire") = "no"
.UpdateBatch
End With
Else
With tmpRst
.Fields("docName") = CStr(flowName)
.Fields("title") = CStr(title)
.Fields("dataUrlStr") = CStr(dataUrl)
.Fields("pubName") = CStr(pubName)
.Fields("pubDate") = Now
.Fields("expire") = CInt(Expireday)
.Fields("ifexpire") = "no"
.UpdateBatch
End With
End If
savedataurltmp = tmpRst.Fields("id")
fCloseRst tmpRst
End Function

请帮忙看看!

MeXP 2002-09-29
  • 打赏
  • 举报
回复
用存储过程不好吗?
什么叫asp不能定义变量?
下面是我自己写的组件asptreeview.tree,不是就传参了吗
<html>
<head>
<title>使用目录</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<base target="main">
<link rel="stylesheet" href="whj.css" type="text/css">
</head>
<body>
<%
Dim oTree, html
Set oTree = Server.CreateObject("asptreeview.tree")
oTree.TreeIcons_Path = "/tree"
oTree.TreeStyle_Path = "/tree/treeStyle_Explorer"
oTree.Width = 200
oTree.Height= 420
html = "<font> 收文管理 </font>"
oTree.Add "root", "a1", html, true, "folder.gif"
Response.Write oTree.HTML
Set oTree = Nothing
%>
</body>
</html>
这篇文章你好好看看http://www.aspcool.com/lanmu/browse1.asp?ID=675&bbsuser=asp
tanqi 2002-09-29
  • 打赏
  • 举报
回复
难道大家不愿帮忙吗?

28,405

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧