Веб-запрос SQL не возвращает столько же строк, сколько запрос SQL Enterprise Manager - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть головоломка, которую я пытаюсь выяснить.Моя веб-страница отправляет запрос в локальную базу данных SQL и возвращает 2 строки.Проблема в том, что когда я копирую и вставляю тот же самый запрос непосредственно в SQL Enterprise Manager, он (правильно) возвращает 3 строки!У меня вопрос - как веб-версия запроса может вернуть только 2 строки.Немного предыстории - читаемая таблица содержит поля varchar с английскими словами и поле nvarchar, которое содержит китайский эквивалент.Код, который я использую для выполнения запроса, является общим кодом из библиотеки, которую я использовал годами, поэтому я не думаю, что это обязательно код, используемый для выполнения запроса.

Вот код с моей веб-страницыкоторый загружает записи.Прямо в точке, где набор записей изначально загружен, я проверяю количество строк из набора записей, и оно возвращает значение 1 (которое начинается с нуля, поэтому в наборе записей 2).

=================================================================

public function LoadByQuery(ByVal sQueryType, ByVal sQueryValue, ByVal sSortOrder, ByVal sDatabase)
    if IsOnErrorResumeNextActive() then on error resume next
        LoadByQuery=false

    mytrace("LoadByQuery")

    ' free any existing elements
    Cleanup()
    'dbconnfix
    'dim sSQL,rsSQL
    dim SQLConn,sSQL,rsSQL,sDSN
    dim arrData,nMarketingColCount,nMarketingRowCount,x,bRet

    nMarketingColCount=-1
    nMarketingRowCount=-1

    select case sQueryType
        case MARKETINGMGR_PARMTYPE_BYCLAUSE _
                    sSQL = "SELECT id,guid,store,customerid,employeeid,filetype," & _
                                   "creationdate,filename,filesite,filesize,friendlyname,md5hash,folder,description,descriptionchinese,brand,brandchinese,productid,views,siteuploaded,approved,tags,tagschinese " & _
                   "FROM " & MARKETING_TABLE_NAME & " "
           if sQueryValue<>"" then sSQL = sSQL & " WHERE " & sQueryValue
           if sSortOrder<>"" then sSQL = sSQL & " ORDER BY " & sSortOrder
        case MARKETINGMGR_PARMTYPE_BYQUERY sSQL = sQueryValue
        case else _
            sLastErrorMsg="Error: invalid sQueryType passed to LoadByQuery: " & sQueryType
            mytrace(sLastErrorMsg)
            exit function
    end select

    err.clear
    'dbconnfix
    ' Create the ADO objects
    Set SQLConn = Server.CreateObject("ADODB.Connection")

    ' fetch the connection string to the SQL database
    select case lcase(sDatabase)
        case POWERMAX_DATABASE
            sDSN=GetPowerMaxDSNString()
        case else
            response.write("ERROR: Database not specied in CMarketingMgr::LoadByQuery")
            response.end
    end select

    ' Open the SQL database
    SQLConn.Open sDSN
    if Err.Number <> 0 then
        sLastErrorMsg = "Error opening SQL Connection using DSN " ' & sDSN & " Err.Number = " & CStrIfNull(Err.Number) & " Err.Description = " & Err.Description
        mytrace(sLastErrorMsg)
        set SQLConn=nothing
        exit function
    end if

    Set rsSQL = Server.CreateObject("ADODB.Recordset")

    mytrace(sSQL)

    rsSQL.Open sSQL,SQLConn
    ' able to open the recordset?
    if err.number<>0 then 
        sLastErrorMsg="Error: Unable to open recordset " & err.brand
        mytrace(sLastErrorMsg)
        exit function
    else
        if rsSQL.EOF=false then 
            ' items found: GetRows, and get row and column counts
            arrData = rsSQL.GetRows()
            nMarketingColCount=ubound(arrData,1)
            nMarketingRowCount=ubound(arrData,2)

        end if ' if rsSQL.EOF
    end if ' if err.number<>0

    rsSQL.close
    set rsSQL=nothing
    'dbconnfix
    SQLConn.close
    set SQLConn=nothing

    dim y

    ' customerid,employeeid, emailaddress, password
    ' Create new items from db
    dim s_id                        ' id of the db record
    dim s_guid
    dim s_store
    dim s_customerid                        ' Marketing customerid
    dim s_employeeid
    dim s_filetype
    dim s_creationdate          
    dim s_filename          
    dim s_filesite          
    dim s_filesize          
    dim s_friendlyname          
    dim s_md5hash           
    dim s_folder            
    dim s_description           
    dim s_descriptionchinese            
    dim s_brand         
    dim s_brandchinese          
    dim s_productid 
    dim s_views         
    dim s_siteuploaded          
    dim s_approved          
    dim s_tags  
    dim s_tagschinese   

    dim arr,sDate,sTime

    mytrace("nMarketingRowCount=" & nMarketingRowCount)
    ' Create new items and add to our array
    if nMarketingRowCount <>-1 then 
        ' for each record, add to our internal table
        for x = 0 to nMarketingRowCount
        ' add to internal table

            y=0

            ' globals
            s_id                        = CStrZeroIfNull(arrData(y,x)) : y=y+1 
            s_guid                      = CStrIfNull(arrData(y,x)) : y=y+1
            s_store                     = CStrIfNull(arrData(y,x)) : y=y+1
            s_customerid                = CStrZeroIfNull(arrData(y,x)) : y=y+1
            s_employeeid                = CStrZeroIfNull(arrData(y,x)) : y=y+1
            s_filetype                  = CStrIfNull(arrData(y,x)) : y=y+1
            s_creationdate              = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_filename                  = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_filesite                  = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_filesize                  = CStrZeroIfNull(arrData(y,x)) : y = y + 1 
            s_friendlyname              = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_md5hash                   = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_folder                    = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_description               = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_descriptionchinese        = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_brand                     = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_brandchinese              = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_productid                 = CStrZeroIfNull(arrData(y,x)) : y = y + 1 
            s_views                     = CStrZeroIfNull(arrData(y,x)) : y = y + 1 
            s_siteuploaded              = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_approved                  = SetDefaultBitValue(arrData(y,x)) : y = y + 1 
            s_tags                      = CStrIfNull(arrData(y,x)) : y = y + 1 
            s_tagschinese               = CStrIfNull(arrData(y,x)) : y = y + 1 

            '-----------------------------------------------
            mytrace("s_creationdate: " & s_creationdate)
            arr = split(s_creationdate," ")
            sDate = arr(0)
            sTime="00:00:00" : if ubound(arr)>0 then sTime = arr(1)
            if isnumeric(Right(sDate,4)) then sDate = ConvertMMDDYYYYToYYYYMMDD(sDate)
            s_creationdate = sDate & " " & sTime
            mytrace("s_creationdate: " & s_creationdate)

            ' add the item to the array
            mytrace("AddToMarketingArray: id=" & s_id)
            if AddToMarketingArray(s_id,s_guid,s_store,s_customerid,s_employeeid,s_filetype,_
                s_creationdate,s_filename,s_filesite,s_filesize,s_friendlyname,s_md5hash,s_folder,s_description,s_descriptionchinese,s_brand,s_brandchinese,s_productid,_
                s_views,s_siteuploaded,s_approved,s_tags,s_tagschinese)=false then
                exit function
            end if

        next
    end if ' if nMarketingRowCount <>-1 

    LoadByQuery=true


end function

================================================================= Вот фактический запрос, который я скопировал и вставил с дисплеязапроса на веб-странице непосредственно в SQL Enterprise Manager:

SELECT id,guid,store,customerid,employeeid,filetype,creationdate,filename,filesite,filesize,friendlyname,md5hash,folder,description,descriptionchinese,brand,brandchinese,productid,views,siteuploaded,approved,tags,tagschinese FROM MarketingCenter WHERE approved=1 AND filetype=N'C' AND (brand='Aveeno' OR brandchinese=N'艾维诺') ORDER BY filetype

Набор записей веб-сайта содержал только 2 строки, но запрос Enterprise Manager возвратил 3 строки.Версия запроса на веб-сайте не включала запись, в которой для brandchinese было установлено значение N '艾维诺', тогда как для запроса Enterprise Manager это было сделано.

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

<%@LANGUAGE="VBSCRIPT" CodePage = 65001%>
<%
Option Explicit
Session.CodePage = 65001
Response.charset ="utf-8"
Session.LCID     = 1033 'en-US
%>

Есть какие-нибудь мысли о том, почему запись с китайскими символами в ней не будет возвращена в наборе записей, вызванном моей веб-страницей, даже если Enterprise Manager возвращает запись из того же запроса?

1 Ответ

0 голосов
/ 15 февраля 2019

ОК, не уверен, что это действительно «отвечает» на вопрос - но я обнаружил, что передача китайских символов на другую страницу через Server.URLEncode каким-то образом изменила китайские символы при чтении целевой страницей и впоследствии использовалась в запросе SQL.Передавая китайские символы на целевую страницу, просто добавив их к URL-адресу (без использования Server.URLEncode), целевая страница правильно прочитала китайские символы и при использовании в запросе SQL вернула ожидаемые строки.Это первый раз, когда я сталкивался с подобной вещью, и мне было бы любопытно узнать, почему это происходит, но на данный момент обходной путь для меня состоял в том, чтобы УДАЛИТЬ Server.URLEncode из китайских символов при построении гиперссылки.

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