2008-12-11 3 views
0

Ну, я обращаюсь к моей БД, таблице bookBilling, чтобы получить значение под столбцом billingID.Ошибка базы данных ASP в ASP.NET

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

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) 

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

Thanks

ответ

2

Эй, это опечатка, что у вас ее нет?

запрос = "SELECT BILLINGID ОТ bookBilling ГДЕ CustID =" & CustID & ""

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

Для перезагрузки записей с данные и определение второго запроса .....

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

2

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

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
query = "SELECT billingID FROM bookBilling WHERE custID="&custID&"" 
objConn.Execute(query) 

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

Редактировать, это то, о чем говорили люди выше меня, я Slowpoke.

0

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

@Joel Coehoorn Благодарим за информацию о внутреннем присоединении запросов. Мой учитель говорил нам об этом, но я этого недостаточно понимал, пока не увидел это.

Для моей таблицы я не могу использовать его, хотя из-за того, что при регистрации нет необходимости в биллинге, я иногда сталкивался с некоторыми «EOF».

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

+0

Если вы используете такую ​​программу, как Access для своих баз данных, вы можете позволить вам писать ваши запросы SELECT для вас, очень просто, когда дело доходит до огромного количества объединений. :) – Kablam 2008-12-11 15:00:15

Смежные вопросы