Классический ASP SQL-запрос возвращает два столбца из десяти - PullRequest
2 голосов
/ 19 марта 2009

Я надеюсь, что кто-то может помочь с проблемой ... Я не работаю ни с чем, связанным с программированием, но нам нужно было немного отслеживать ресурсы, поэтому в свободное время (не очень, у нас в среднем 10 часов в сутки) ) и с инструментами (600 МГц, работающий под WinXP), я создал небольшой классический ASP-сайт для обработки всех трекингов и заказов.

Все было хорошо, пока я не решил, что у меня есть немного свободного времени, и решил немного модернизировать. Все это довольно грязно, но худшее из этого ужасно медленно. Поэтому я решил перебрать свои драйверы доступа к БД и JET и перейти на MS SQL Server 2000 Express (не забудьте, 600 МГц и не так много оперативной памяти). Я начал перестраивать, и все, казалось, работало отлично (и намного быстрее), пока я не начал получать ошибки. Я выяснил, что для некоторых запросов только пара столбцов будет возвращать какие-либо данные.

Например, : у меня есть таблица shopitems с gID (uniqueID), iDesc (описание), iLength, iQty, colID (перекрестная ссылка). Я делаю запрос, чтобы получить все в определенной категории: Select * from shopitems where catID=22 order by gID asc. Затем я начинаю шагать и показывать все это.

Проблема в том, что только поля gID и colID имеют данные, все остальное - ничто. Я открыл приложение Web Data Administrator и запустил там запрос, и он возвращает все отлично. Итак, я решил, что где-то есть ошибка, поэтому я пишу страницу быстрого теста и ту же проблему (за исключением этого времени его gID и iLength, которые возвращают данные). Все это типы данных: iDesc - это nText, а iLength - это int. Я прошел через все, что я могу найти, но я думаю, что это то, чего мне не хватает в SQL ... У кого-нибудь есть идеи?
Кроме того, я повторил это на своем домашнем компьютере, который на самом деле имеет современный процессор и приличное количество оперативной памяти, так что это вовсе не машина.

Спасибо за помощь ... Я слушаю подкаст, и кажется, что это была неделя сервера / sql некоторое время, подумал, что я бы попросил кого-то здесь ...

---- EDIT ----
Изменил код ... версия этого кода работала в течение горячей секунды, теперь не так много ... если я закомментирую

gID=rs1("gID")

тогда я получаю значение iDesc, но не иначе.

<%@ Language=vbscript %>

Damnit

Set db1 = Server.CreateObject("ADODB.Connection")
'db1.Open "Provider=MSDASQL;Driver={SQL Server};Server=Phsion;Database=master;"
db1.Open "Provider=MSDASQL;DSN=SHOPWEB;"
'sqltxt="select gID, iLength, iDesc from shopitems where catID=45 order by CAST(idesc as varchar)"

sqltxt="select iDesc, gID from ShopItems order by gID asc"
set rs1=db1.execute(sqltxt)
rs1.movefirst
do until rs1.eof
  gID=rs1("gID")
  'iLength=rs1("iLength")

  iDesc=rs1("iDesc")

  response.write("<br>gID: " & gid & "<br>")

  response.write("<br>iLength: " & iLength & "<br>")

  response.write("<br>iDesc: " & iDesc & "<br>")
  rs1.movenext
loop
rs1.close
set rs1=nothing
db1.close
set db1=nothing

Ответы [ 4 ]

3 голосов
/ 19 марта 2009

Добавьте Option Explicit вверху (в пределах <% и%>), чтобы сделать объявление переменных обязательным, затем объявите переменные, используя Dim variable-name-goes-here для всех ваших переменных, и вуаля, вы сразу увидите проблему.

2 голосов
/ 19 марта 2009

Если вы вместо того, чтобы выбирать все (*), выбираете нужные столбцы - у вас все еще остается та же проблема? То есть:

SELECT gID, iDesc, iLength, iQty 
FROM shopitems
WHERE catID = 22
1 голос
/ 19 марта 2009

Это запутанная проблема. Как уже упоминалось, не забудьте включить явный параметр, чтобы помочь найти любые проблемы с именами переменных. Если вы использовали On Error Resume Next , тогда вы можете использовать On Error Goto 0 , чтобы убедиться, что вы не подавляете ошибки

Вот мой дубль. Разбейте это на собственный файл, если можете, для отладки. Если мой цикл выдает результат, мы можем отследить ситуацию.

<%
Option Explicit
On Error Goto 0

Dim db1, sqltxt, rs1
Dim gID, iLength, iDesc, arrRS

Set db1 = Server.CreateObject("ADODB.Connection")
'db1.Open "Provider=MSDASQL;Driver={SQL Server};Server=Phsion;Database=master;"
db1.Open "Provider=MSDASQL;DSN=SHOPWEB;"
'sqltxt="select gID, iLength, iDesc from shopitems where catID=45 order by CAST(idesc as varchar)"


'   sqltxt="select iDesc, gID from ShopItems order by gID asc"
'   set rs1=db1.execute(sqltxt)
'   rs1.movefirst
'   do until rs1.eof
'       gID = rs1("gID")
'       'iLength=rs1("iLength")
'       iDesc = rs1("iDesc")
'       response.write("gID: " & gid & "")
'       response.write("iLength: " & iLength & "")
'       response.write("iDesc: " & iDesc & "")
'       rs1.movenext
'   loop
'   rs1.close : set rs1=nothing

sqltxt="select iDesc, gID from ShopItems order by gID asc"
set rs1=db1.execute(sqltxt)
'//Dump the recordset into an array
arrRS = rs1.GetRows()
'//We can close the rs now since we don't need it anymore
rs1.close : set rs1=nothing

'//We are going to basically dump a HTML table that should look like you SQL viewer
Response.Write("<table>")
'//Loop through all the rows
For i = 0 To UBound(arrRS,2)
    Response.Write("<tr>")
    '//Loop through all the columns
    For j = 0 To UBound(arrRS,1)
            '//write out each column in the row
            Response.Write("<td>" & arrRS(j,i) & "</td>")
            '//Look I will be honest, I can't test this so your might have to swap the i and the j to get a full output
    Next
    Response.Write("</tr>")
Next
Response.Write("</table>")

db1.close : set db1=nothing
%>
0 голосов
/ 31 марта 2009

Я не знаю, исправили ли вы это, но если нет, попробуйте изменить порядок, в котором вы выбираете столбцы, чтобы поле nText было в конце. Этому есть техническое объяснение (что-то связанное с максимальной длиной байта записи, iirc).

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