проблема с передачей аргументов функции vbscript

У меня есть небольшая проблема с vbscript. Я объявил некоторую функцию с передачей набора результатов из запроса sql в качестве аргумента, и проблема в том, что функция showData принимает аргумент как объект, а не как набор результатов.

function get_count(conn)
    dim query, size
    Set query = Server.CreateObject("ADODB.Recordset")
    set query = conn.Execute("select count(*) as size from doctor")
    size = query.Fields("size")
    get_count = size
end function
function get_rows_from_to(from,size,conn)
    dim result
    Set result = Server.CreateObject("ADODB.Recordset")
    set result = conn.Execute("SELECT name, surname,family,egn,citizenship FROM doctor limit "&from&","&size&"")
    get_rows_from_to = result
end function
Sub showData(objRS)
    dim isEven
    isEven = false
    Response.Write "<table>"
    Response.Write "<tr>"
    Response.Write "<th >Име</th><th >Презиме</th><th >Фамилия</th><th >ЕГН</th><th >Гражданство</td>"
    Response.Write "</tr>"
    While Not objRS.EOF
        Response.Write "<tr>"
        if isEven then
            Response.Write "<td style = 'background-color :#e9ebf2'>"&objRS.Fields("name")&"</td>"&_
                "<td style = 'background-color :#e9ebf2'>"&objRS.Fields("surname")&"</td>"&_
                "<td style = 'background-color :#e9ebf2'>"&objRS.Fields("family")&"</td>"&_
                "<td style = 'background-color :#e9ebf2'>"&objRS.Fields("egn")&"</td>"&_
                "<td style = 'background-color :#e9ebf2'>"&objRS.Fields("citizenship")&"</td>"
            isEven = false
        else
            Response.Write "<td>"&objRS.Fields("name")&"</td><td>"&objRS.Fields("surname")&"</td><td>"&objRS.Fields("family")&"</td><td>"&objRS.Fields("egn")&"</td><td>"&objRS.Fields("citizenship")&"</td>"
            isEven = true
        end if
        Response.Write "</tr>"
        objRS.MoveNext
    Wend 
    Response.Write "</table>"
    objRS.Close
end sub
const ROWS_PER_PAGE = 10
Dim sConnection, conn , result,pages,selPage,from,lenght,pos,size

from = 0
lenght = 10
pos = 1
size = 0
sConnection = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=docunion; UID=root;PASSWORD=root; OPTION=3" 

Set conn = Server.CreateObject("ADODB.Connection") 
Set result = Server.CreateObject("ADODB.Recordset")
conn.Open sConnection

size = get_count (conn)
size = CInt(size)
if size  > 0 then
    pages = size / 10
    lenght = (ROWS_PER_PAGE*pos)
    set result = get_rows_from_to(from,lenght,conn)
    from = lenght + 1
    pos = pos + 1
    showData(result)
else
    Set result = Nothing
    conn.Close
    Set conn = Nothing
end if

Может ли кто-нибудь сказать мне, где здесь проблема. Я новичок в vbscript. Это ошибка в функции showData с объектом objRS

Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'EOF'
/index.asp, line 57

person Jordan Borisov    schedule 12.06.2011    source источник


Ответы (1)


Основная проблема заключается в том, что функции, возвращающие ссылку на объект, должны использовать Set в качестве возвращаемого значения:

function get_rows_from_to(from,size,conn)
    ' ...
    set get_rows_from_to = result
end function

Несколько других советов:

Нет необходимости объявлять функции перед их использованием. Вы можете поместить все свои объявления функций в конец скрипта и оставить основной текст скрипта вверху.

Это излишне избыточно:

function get_rows_from_to(from,size,conn)
    dim result
    Set result = Server.CreateObject("ADODB.Recordset")
    set result = conn.Execute("SELECT name, surname,family,egn,citizenship FROM doctor limit "&from&","&size&"")
    set get_rows_from_to = result
end function

и эквивалентен этому

function get_rows_from_to(from,size,conn)
    set get_rows_from_to = conn.Execute("SELECT name, surname,family,egn,citizenship FROM doctor limit " & from & "," & size &"")
end function 

conn.Execute() уже возвращает ADODB.RecordSet. Нет смысла создавать пустой через Server.CreateObject() раньше. Фактически, все ваши Set xyz = Server.CreateObject("ADODB.Recordset") строк лишние.

Нет смысла создавать отдельную переменную для возвращаемого значения в функциях. Функция является возвращаемым значением:

function getFoo()
    getFoo = "foo"
end function

Два заключительных совета:

  • Всегда используйте Option Explicit.
  • Всегда используйте Server.HtmlEncode() для всех данных, которые вы выводите на страницу. Это даже важнее, чем все остальные советы.
person Tomalak    schedule 12.06.2011
comment
Намек на использование Set спас жизнь... +1 - person Dabbler; 18.11.2012