Классическая ошибка базы данных ASP - PullRequest
0 голосов
/ 11 декабря 2008

Что ж, я запрашиваю мою базу данных, таблицу с именем bookBilling, чтобы получить значение в столбце billingID.

В моем первом запросе я получаю идентификатор клиента из таблицы, основываясь на том, какое значение имеет cookie. Во втором запросе я принимаю это значение 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)

Так что это сработало, я знаю, что мой заголовок столбца таблицы правильный, я смотрел на него и использовал его в других запросах раньше. Кто-нибудь знает, почему это может произойти? Это результат того, что я не очистил свое соединение или не закрыл его потом?

Спасибо

Ответы [ 4 ]

2 голосов
/ 11 декабря 2008

Эй, это опечатка, у тебя этого нет?

query = "ВЫБЕРИТЕ billingID ИЗ БИЛЛИНГА, ГДЕ custID =" & custID & ""

objRS = objConn.Execute (запрос)

Чтобы перезагрузить набор записей с данными и определением второго запроса .....

Просто подумайте, попробуйте сначала установить / создать ObjRS для набора записей, затем применить к нему query.execute после, а не начальное все в одном с первым запросом CustId

2 голосов
/ 11 декабря 2008

Выполнение двух отдельных запросов в любом случае происходит медленно. Почти всегда быстрее объединить их в одно утверждение:

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

Также: куки - это просто текстовые файлы, и любой может редактировать текстовый файл. Если вы подставите значение cookie прямо в свой запрос, то это может привести к внедрению sql. Это не обычный вектор атаки, но это все же возможно.

Что касается вашей конкретной ошибки, вы выполняете 2-й запрос непосредственно из соединения, а не открываете его в наборе записей:

objConn.Execute(query)

Я удивлен, что вы вообще что-то получаете, и я ожидаю, что значение, которое вы видите в objRS.Fields(0), вероятно, просто custID из предыдущего запроса Но это все становится спорным, если вы объединяете запросы, как я рекомендовал.

0 голосов
/ 11 декабря 2008

Блин, да, это была опечатка. Я не уверен, что понимаю, почему он работал, используя номер столбца, но не имя столбца, хотя я не открывал набор записей.

@ Джоэл Коухорн Спасибо за информацию о внутреннем присоединении к запросам. Мой учитель велел нам сделать это, но я не понял этого достаточно, чтобы сделать это, пока не увидел это.

Для моей таблицы я не могу его использовать, потому что при регистрации не обязательно указывается идентификатор биллинга, поэтому я иногда сталкиваюсь с некоторыми "EOF".

Спасибо всем!

0 голосов
/ 11 декабря 2008
query = "SELECT billingID FROM bookBilling WHERE custID="&custID&""
objConn.Execute(query)

Вы не открываете resordset для этого второго запроса. И, не уверен, оказывает ли это какое-либо влияние вообще, но я никогда не называю свои запросы одинаковыми. Чтобы быть уверенным, я думаю.

Отредактируйте, ну, это вроде того, что говорили люди, стоящие выше меня, я медленный. 1004 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...