关于asp与数据库的一些问题,困扰了我好久 ( 积分: 100 )

T

ttxyy

Unregistered / Unconfirmed
GUEST, unregistred user!
1、在aaa.asp文件中引用了一个包含文件
<!--#include file=&quot;connDatabase.asp&quot;-->用来连接数据库,
在这个包含文件中定义了变量myconn
在aaa.asp中定义了一个rs记录集变量,当使用完rs后,是不是需要进行rs.close和set rs=nothing以及myconn.close和set myconn=nothing,这两句的意思究竟是什么?好多地方说是关闭数据表和关闭数据库,我发现如果不执行这些语句也可以啊,好像没必要执行这些语句啊.另外,是不是在一个asp文件里定义的变量在其它的ASP文件里都可以接收到变量的值,也就是相当于&quot;全局变量&quot;?比如说我在aaa.asp中定义的rs变量,是不是也相当于&quot;全局变量&quot;,可以继续在其它的asp文件中使用?
2、关于执行查询的问题:
常见到有两种查询方法,如下:
rs.open SqlString,connDataBase,1,1
set rs=connDataBase.execute(SqlString)
可是我发现这两种查询语句都不太稳定,大多数情况下使用第一种稳定些,不会出错,但是我在aaa.asp中引用一个包含文件<!--#include file=&quot;connDatabase.asp&quot;-->,以此方式来使用rs.open SqlString,connDataBase,1,1时却提示缺少对象,真不知道是怎么回事,有什么解决的方法?
set rs=connDataBase.execute(SqlString)出错的机率大些,即使在不使用包含文件而直接在asp文件中写连接代码时,也容易造成只能取出记录的一两个字段而不能取出更多的字段的情况。我想知道这是什么原因,有什么解决的办法?
 
1、在aaa.asp文件中引用了一个包含文件
<!--#include file=&quot;connDatabase.asp&quot;-->用来连接数据库,
在这个包含文件中定义了变量myconn
在aaa.asp中定义了一个rs记录集变量,当使用完rs后,是不是需要进行rs.close和set rs=nothing以及myconn.close和set myconn=nothing,这两句的意思究竟是什么?好多地方说是关闭数据表和关闭数据库,我发现如果不执行这些语句也可以啊,好像没必要执行这些语句啊.另外,是不是在一个asp文件里定义的变量在其它的ASP文件里都可以接收到变量的值,也就是相当于&quot;全局变量&quot;?比如说我在aaa.asp中定义的rs变量,是不是也相当于&quot;全局变量&quot;,可以继续在其它的asp文件中使用?
2、关于执行查询的问题:
常见到有两种查询方法,如下:
rs.open SqlString,connDataBase,1,1
set rs=connDataBase.execute(SqlString)
可是我发现这两种查询语句都不太稳定,大多数情况下使用第一种稳定些,不会出错,但是我在aaa.asp中引用一个包含文件<!--#include file=&quot;connDatabase.asp&quot;-->,以此方式来使用rs.open SqlString,connDataBase,1,1时却提示缺少对象,真不知道是怎么回事,有什么解决的方法?
set rs=connDataBase.execute(SqlString)出错的机率大些,即使在不使用包含文件而直接在asp文件中写连接代码时,也容易造成只能取出记录的一两个字段而不能取出更多的字段的情况。我想知道这是什么原因,有什么解决的办法?
 
myconn.close断开连接
RS.nothing,释放记录集
你运行的语句有问题SQLSTRING是SQL语句变量你把全部代码贴出来看看!如果集分再加100给我,我给你一段完整的代码!
 
jieking,谢谢你。
你说的我都知道,和我想要的答案相差甚远。
另外,你也太贪了啊。呵呵,我再等等看,有没有其他高手帮助我。
我还想问问,是不是在asp中不先定义变量,而直接使用,比如说不这样:
dim rs
set rs= Server.CreateObject(&quot;ADODB.Recordset&quot;)
而是直接set rs= Server.CreateObject(&quot;ADODB.Recordset&quot;)
直接用的话是不是就是定义的"局部变量"?只在这个asp文件中起作用,在其他的asp文件中不生效?
 
myconn 既然是公共变量,不仅要定义,还应该在 connDatabase.asp 中就进行初始化(rs 在 aaa.asp 中也是一样),不然等着在哪初始化?
给你一个我的 JavaScript 的例子。
//==============================================================================
//
// utils.js 公用变量和函数
//
// 2005.07.20
//
//==============================================================================
var adOpenDynamic = 0x00000002;
var adOpenStatic = 0x00000003;
var adLockReadOnly = 0x00000001;
var adLockOptimistic = 0x00000003;
var adLockBatchOptimistic = 0x00000004;
var adConnectUnspecified = 0xFFFFFFFF;
var adAsyncConnect = 0x00000010;
var adStateClosed = 0x00000000;
var adStateOpen = 0x00000001;
var adStateConnecting = 0x00000002;
var adStateExecuting = 0x00000004;
var adStateFetching = 0x00000008;
var adCmdText = 0x00000001;
var adCmdTable = 0x00000002;
var adCmdStoredProc = 0x00000004;
var cnn = new ActiveXObject(&quot;ADODB.Connection&quot;);
var rst = new ActiveXObject(&quot;ADODB.Recordset&quot;);
//连接数据库
function connect_db(cnn, srv, uid, pwd, db)
{
if (cnn.State != adStateClosed)
{
return true;
}
cnn.ConnectionString = &quot;driver={SQL Server};server=&quot;
+ srv + &quot;;uid=&quot;
+ uid + &quot;;pwd=&quot;
+ pwd + &quot;;database=&quot;
+ db;
try
{
cnn.Open;
}
catch(e)
{
alert(e);
return false;
}
return true;
}
//执行 SQL 语句
function exec_sql(cnn, rst, sql)
{
if (cnn.State == adStateClosed)
{
return false;
}
if (rst.State != adStateClosed)
{
rst.Close;
}
try
{
rst.Open(sql, cnn, adOpenStatic, adLockOptimistic, adCmdText);
}
catch(e)
{
alert(e);
return false;
}
return true;
}
 
vvyang,谢谢你。
可能是我讲得不太清楚,
我是想问,是不是在asp中不先定义变量,而直接使用,比如说不这样:
dim rs
set rs= Server.CreateObject(&quot;ADODB.Recordset&quot;)
而是直接set rs= Server.CreateObject(&quot;ADODB.Recordset&quot;)
直接用的话是不是就是定义的"局部变量"?只在这个asp文件中起作用,在其他的asp文件中不生效?
 
没错,这样生成的是局部变量,这样的变量一般用在函数体内。
 
我的rs是不是一定要rs.close和set rs=nothing呢,好像不这样也可以啊,是不是隐藏着什么危险?
还有就是“包含文件”嵌套的问题:
我在一个叫<!--#include file=&quot;check.asp&quot;-->的包含文件中
对<!--#include file=&quot;connDatabase.asp&quot;-->进行了引用。
那么当我在aaa.asp中引用了<!--#include file=&quot;check.asp&quot;-->时,按照理论上讲应该在connDatabase.asp中定义的变量connDataBase应该也可以使用吧,可是当我在aaa.asp中执
行rs.open SqlString,conn,1,1时,电脑却提示说找不到对象,真不知是怎么回事?
 
1、rs.close 和 set rs=nothing 基本没必要,再说谁知道什么他们没用了呢?
2、这个还用说,当然不行了。打个比方,你在 Delphi 中创建一个单元,它把所有已知的单元都引用上,按照你的推理我今后编程就只引用这一个单元好了,可实际情况根本不是这样啊。
 
哦,明白了。还有个问题想麻烦你:
我想在asp中调用sql2000sever中的存储过程,代码如下
'查找当前用户所在的部门
set command1=Server.CreateObject(&quot;ADODB.command&quot;)
set command1.activeconnection=conn
command1.commandtype=4
command1.commandtext=&quot;Get_bmInfo&quot;
command1.parameters(1)=rs(&quot;rydm&quot;)
command1.parameters(2)='2005-7-1'
set rs2=command1.execute()
为什么rs2中没有返回存储过程执行的结果呢?有什么办法解决吗?
 
Recordset 一样能执行存储过程,像你这种情况不一定非用 Command:
'查找当前用户所在的部门
Str sql = &quot;Get_bmInfo &quot;
+ rs(&quot;rydm&quot;) + &quot;, '2005-7-1'&quot;
Set rst = Server.CreateObject(&quot;ADODB.Recordset&quot;)
rst.Open sql, conn, adOpenStatic, adLockOptimistic, adCmdText
'这时 rst 存储的就是返回的数据集
...
rst.Close
Set rst = Nothing
 
我的asp代码如下 :
'前面的初始代码略...........
'循环遍历所有的用户,使用存储查询查找用户所在的部门
do
While Not rs.EOF
'逐笔查找当前用户所在的部门
' set command1=Server.CreateObject(&quot;ADODB.command&quot;)
' set command1.activeconnection=conn
' command1.commandtype=4
' command1.commandtext=&quot;Get_bmInfo&quot;
' command1.parameters(1)=rs(&quot;rydm&quot;)
' command1.parameters(2)=GetCurrDate
' set rs2=command1.execute()

rs2.Open &quot;Exec Get_czryInfo '&quot;
&amp;
rs(&quot;rydm&quot;) &amp;
&quot;','&quot;
&amp;
GetCurrDate &amp;
&quot;'&quot;,conn
%>
<tr>
<td><%=rs(&quot;rymc&quot;)%></td>
<!--显示用户的部门名称-->
<% if not rs2.Eof then
%><td><%=rs2(&quot;bmName&quot;)%> </td> <%end if %>
</tr>
<%
rs.MoveNext
Loop

采用command1的方式,在rs2中测得Eof为真,即rs2中没有返回结果;
采用rs2.open的方式,电脑提示“对象打开时,不允许操作。”
请问该如何解决啊。
 
哎呀,你的 rst2 没关闭,如果是打开状态先关闭再执行:
If rst.State <> adStateClosed then
rst.Close
End If
Do While Not rs.EOF
......
 
哦,我先试试
 
......
If rs2.State <> adStateClosed then
rs2.Close
End If
rs2.Open &quot;Exec Get_CzryInfo '&quot;
&amp;
rs(&quot;czry_dm&quot;) &amp;
&quot;','&quot;
&amp;
GetCurrDate &amp;
&quot;'&quot;,conn
...
行了么?
 
使用
......
If rs2.State <> adStateClosed then
rs2.Close
End If
rs2.Open &quot;Exec Get_CzryInfo '&quot;
&amp;
rs(&quot;czry_dm&quot;) &amp;
&quot;','&quot;
&amp;
GetCurrDate &amp;
&quot;'&quot;,conn
...
虽然不出错,可是和采用command1的方式一样,在rs2中测得Eof为真,即rs2中没有返回结果。网上的资料一大堆,可是好像没有能够顺利运行的啊。该怎么办?
 
发现原因了。原来是在参数中不能使用当前的记录集中的字段变量,也不能使用其它函数,只能够使用常量,我想要使用字段变量作为参数啊,要怎么办?
'循环显示所有的用户数据,同时画出表格
do
While Not rs.EOF
'逐笔查找当前用户所在的部门
set command1=Server.CreateObject(&quot;ADODB.command&quot;)
set command1.activeconnection=conn
command1.commandtype=4
command1.commandtext=&quot;Get_CzryInfo&quot;
' dim vCzry_dm
' vCzry_dm=rs(&quot;czry_dm&quot;)
' command1.parameters(1)=CStr(vCzry_dm)
' command1.parameters(1)=CStr(rs(&quot;Czry_dm&quot;))
' command1.parameters(2)=CDate(GetCurrDate)
command1.parameters(1)=CStr(&quot;1001&quot;)
command1.parameters(2)=CDate(&quot;2005/10/01&quot;)
set rs2=command1.execute()
.略..........................
 
你的数据库中有符合条件的记录么,根本不是 rs2 中没有数据集,就是没有符合条件的记录。
你那句 rs2.Open... 写的对么
 
前面不对,现在终于找到真正的原因了。是我的自定义函义不被电脑识别!而不是存储过程不能接受变量作为参数。
我在asp前面的开头定义了一个GetCurrDate的函数,用于返回今天的日期,如'2005/10/01',用在其它地方都好好的,可是用在Do while循环中把这个函数传递给存储过程作为参数,却发生了问题,这害得我浪费了整整半天的时间。我这个自定义函数在其它SQL语句里用得好好的,怎么用在这里就不行呢。
 
我现在使用command1这种方式来使用存储过程,那种rs2.open ...的方式我试了好久不能成功。
'循环显示所有的用户数据,同时画出表格
do
While Not rs.EOF
'逐笔查找当前用户所在的部门
set command1=Server.CreateObject(&quot;ADODB.command&quot;)
set command1.activeconnection=conn
command1.commandtype=4
command1.commandtext=&quot;Get_CzryInfo&quot;
command1.parameters(1)=CStr(rs(&quot;Czry_dm&quot;))
' command1.parameters(2)=CDate(GetCurrDate)
command1.parameters(2)=CDate(&quot;2005/10/01&quot;)
set rs2=command1.execute()
........................
现在的问题是怎么让我的自定义函数能够成为存储过程的参数呢?
 

Similar threads

S
回复
0
查看
660
SUNSTONE的Delphi笔记
S
S
回复
0
查看
650
SUNSTONE的Delphi笔记
S
S
回复
0
查看
958
SUNSTONE的Delphi笔记
S
S
回复
0
查看
779
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部