2013-08-30 4 views
-1

Я получил запрос, используя SQL в ASP Classic, и синтаксис, который я получил, как показано ниже:ASP Классический SQL Query Error Message - Неверный номер

mQry = "SELECT name FROM finals WHERE invoice_num = " &request.querystring("num") & " AND name LIKE '&" & request.querystring("nam") & "%'" 
    response.write("Operating Unit") 
    for each x in TestRally.fields 
    response.write(": ") 
    response.write(x.value) '-- got error in this area... 
    response.write("<br>") 
    next 
    response.write("<br>") 
    TestRally.MoveNext 

Основываясь на выше синтаксис, что будет лучшее возможное средство для этого .. ???

Сообщение об ошибке я получил до сих пор это:

Microsoft OLE DB Provider для ошибки Oracle '80040e07' ORA-01722: недействительный номер

+0

Распечатайте 'mQry'. По моему опыту, просмотр строки запроса после замены переменных делает ошибку очевидной примерно в 95% случаев. –

+1

Я бы подумал '& request.querystring (" num ")' не число. – FrankPl

+0

Или, может быть, мой SQL-запрос неверен ... так что я получил это сообщение об ошибке –

ответ

2

Ваш код широко открыт для Атаки SQL-инъекций, и это отчасти является причиной вашей проблемы: вы не проверяете (не говоря уже о дезинфекции) свои данные, которые вы используете для формулировки запросов.

Смотреть это ОК, прежде чем продолжить: What is SQL injection?

Мы не можем сказать вам, как правильно решить, не зная, что СУБД вы используете, но быстрый обходной путь заключается в следующем:

Dim invoiceNum 
invoiceNum = CInt(Request.QueryString("num")) 
Dim name 
name = Request.QueryString("nam") 
name = Replace(name, "'", "''") 

Dim sql 
sql = "SELECT name FROM finals WHERE invoice_num = " & invoiceNum & " AND name LIKE '&" & name & "%'" 
+0

В настоящее время я использую Oracle 12c для СУБД –

+0

Код, который вы мне дали, не работает вообще –

+0

@RallyCautiverio, как он не работает? – Dai

0
invoiceNum = CInt(Request.QueryString("num")) 

, вероятно, вызывает переполнение.

Номер счета, который вы передаете, слишком велик для целого числа. Сохраните номер счета как строку.

Использование кода Дая, попробуйте это:

Dim invoiceNum 
invoiceNum = Request.QueryString("num") 
invoiceNum = Replace(invoiceNum, "'", "''") 

Dim name 
name = Request.QueryString("nam") 
name = Replace(name, "'", "''") 

sql = "EXEC sp_executesql N'SELECT name FROM finals WHERE invoice_num = @invoice_num AND name LIKE ''&'' + @name + ''%'''" 
sql = sql & ",N'@invoice_num varchar(20),@name varchar(255)',@invoice_num = '" & invoiceNum & "',@name = '" & name & "'" 
+0

Вы не ошибаетесь в построении запроса, связывающего значения параметров с командной строкой вместо использования параметров. Это неверно и угрожает безопасности вашей базы данных. –

0

Включить трассировку SQL или более 10046 трассировку до выполнения выше заявление, и вы увидите, какое значение передается в для invoice_num. Это создаст файл трассировки, в котором будут описаны все инструкции и как они выполняются.

Кроме того, опубликовано, как определяется таблица.

0

"SELECT название от финала, где invoice_num = '& Request.QueryString ("Num") & "' и имя =" & Request.QueryString ("NAM") & "'"

Это правильный синтаксис SQL для запроса внутри ASP Classic вместо вышеупомянутого SQL-запроса, который у меня есть в моем вопросе.