2008-12-11 147 views
0

嗯,我正在查询我的数据库,一个名为bookBilling的表,以获取billingID列下的值。经典ASP数据库错误

在我的第一个查询中,我根据cookie保存的值从表中获取客户ID。 在我的第二个查询中,我获取了该custID值,并希望获取与它关联的billingID。

query = "SELECT custID FROM bookSession WHERE session='"&theCookie&"'" 
'--Connect to DB' 
Set objConn = ConnectDB() 
'--Query to DB' 
Set objRS = objConn.Execute(query) 
custID = objRS.Fields("custID") 

    query = "SELECT billingID FROM bookBilling WHERE custID="&custID&"" 
    objConn.Execute(query) 

这是它成为问题的地方。我试着用这个来获得值:

billingID = objRS.Fields("billingID") 

当没有工作我打印查询到我的浏览器,以确保它的工作和它回来好,我检查了它在SQL Server Management Studio中进行当然。之后,我决定玩一下,发现使用“0”作为参考作品,因为它是我的表中的第一项。

billingID = objRS.Fields(0) 

这样工作,我知道我的表列标题是正确的我已经看过它,并在之前的其他查询中使用它。有谁知道为什么会发生这种情况?这是否是由于未清除我的连接或关闭后的结果?

谢谢

回答

2

嘿,这是一个错字,你没有这个?

查询= “SELECT BILLINGID FROM bookBilling WHERE CUSTID =” & CUSTID & “”

objRS = objConn.Execute(查询)

要重新加载与所述记录数据和第二查询的定义.....

只是想一想,试试Setting/Insta ntiating的ObjRS的记录,再后query.execute适用于它,而不是最初都在一个与第一CUSTID查询

2

无论如何,运行两个单独的查询是缓慢的。将它们组合成一个语句几乎总是更快:

SELECT billingID 
FROM bookBilling bb 
INNER JOIN bookSession bs ON bs.custID=bb.custID 
WHERE bs.session= @theCookie 

此外:cookies只是文本文件,任何人都可以编辑文本文件。如果你直接在你的查询中替换一个cookie值,那么sql注入是有潜力的。这不是正常的攻击矢量,但它仍然是可能的。

至于您的特定错误,你直接从连接执行第二个查询,而不是在记录集打开它:

objConn.Execute(query) 

我很惊讶你得到任何东西,我所期望的价值您在objRS.Fields(0)中看到的可能只是上一个查询中的custID。但是,如果像我推荐的那样整合查询,这一切都将变得毫无意义。

0
query = "SELECT billingID FROM bookBilling WHERE custID="&custID&"" 
objConn.Execute(query) 

你不打开resordset对于第二个查询。 而且,不知道这是否有任何影响,但我从来没有将我的询问命名为相同。可以肯定,我猜。

编辑,这就是我上面的人说的,我是一个Slowpoke。

0

该死的,是的,这是一个错字。我不确定我是否理解为什么它仍然使用列编号,但不是列名,即使我没有打开记录集。

@Joel Coehoorn 感谢有关内部加入查询的信息。我的老师一直告诉我们要这样做,但直到我看到这一点时,我才真正理解这一点。

对于我的表我不能真正使用它,因为注册时不一定有billingID,所以偶尔会遇到一些“EOF”。

谢谢大家!

+0

如果您使用像Access一样的程序来处理数据库,那么可以让它为您编写SELECT查询,这对于大量的连接来说非常简单。 :) – Kablam 2008-12-11 15:00:15