经典的ASP SQL查询返回十列中的两列

经典的ASP SQL查询返回十列中的两列,sql,asp-classic,Sql,Asp Classic,我希望有人能帮我解决一个问题…我不从事任何与编程相关的工作,但我们非常需要一些资产跟踪,所以在我的业余时间(不太多,我们平均10小时天)和手头的工具(运行winXP的600mhz堆)我建立了一个小的经典ASP站点来处理所有跟踪和订单 一切都很好,直到我决定我有更多的空闲时间,并决定升级一点。整个过程相当混乱,但最糟糕的是速度太慢了。所以我决定放弃access db和JET驱动程序,选择MS SQL Server 2000 Express(别忘了,600mhz,内存也不多)。我开始重建,一切似乎都

我希望有人能帮我解决一个问题…我不从事任何与编程相关的工作,但我们非常需要一些资产跟踪,所以在我的业余时间(不太多,我们平均10小时天)和手头的工具(运行winXP的600mhz堆)我建立了一个小的经典ASP站点来处理所有跟踪和订单

一切都很好,直到我决定我有更多的空闲时间,并决定升级一点。整个过程相当混乱,但最糟糕的是速度太慢了。所以我决定放弃access db和JET驱动程序,选择MS SQL Server 2000 Express(别忘了,600mhz,内存也不多)。我开始重建,一切似乎都运转良好(而且速度更快),直到我开始出错。我发现对于某些查询,只有几列会返回任何数据

例如:我有一个shopitems表,带有gID(唯一标识)、iDesc(描述)、ILENGHT、iQty、colID(交叉引用)。我执行一个查询以获取特定类别中的所有内容:
Select*from shopitems,其中catID=22 order by gID asc
。然后我开始一步一步地浏览并显示所有内容

问题是,只有gID和colID字段有数据,其他所有字段都没有数据。我打开了Web数据管理员应用程序并在其中运行查询,它返回的一切都很好。于是我决定在某个地方有一个bug,所以我写了一个快速测试页面和相同的问题(除了这次返回数据的gID和ilelength)。它是各种数据类型的混合体,iDesc是nText,iLength是int。我已经找到了所有我能找到的东西,但我想这是我在SQL中缺少的东西……有人有什么想法吗?
另外,我在家里的一次性电脑上复制了这个,它实际上有一个现代化的处理器和相当数量的RAM,所以它根本不是机器

谢谢你的帮助…我听了播客,现在好像已经是服务器/sql周了,我想我应该问问这里的人

----编辑--
更改了代码…此代码的一个版本在一秒钟内有效,现在没有那么多…如果我注释掉

gID=rs1("gID")
然后我得到了iDesc的值,但不是别的

<%@ Language=vbscript %>

该死的

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
Set db1=Server.CreateObject(“ADODB.Connection”)
“db1.Open”Provider=MSDASQL;Driver={SQL Server};Server=Phsion;Database=master
db1.Open“Provider=MSDASQL;DSN=SHOPWEB
'sqltxt=“从catID=45的shopitems中选择gID、ILENGHT、iDesc(按类型排序)(iDesc为varchar)”
sqltxt=“按gID asc从ShopItems订单中选择iDesc、gID”
设置rs1=db1.execute(sqltxt)
rs1.1首先
直到rs1.eof为止
gID=rs1(“gID”)
'iLength=rs1(“iLength”)
iDesc=rs1(“iDesc”)
响应。写入(“
gID:&gID&”
”) 响应。写入(“
ilelength:&ilelength&”
”) 回答。写(“
iDesc:&iDesc&”
”) rs1.movenext 环 rs1.close 设置rs1=无 db1.close set db1=nothing
如果您没有选择所有内容(*),而是选择了所需的列-您是否仍有相同的问题?即:

SELECT gID, iDesc, iLength, iQty 
FROM shopitems
WHERE catID = 22

在顶部(内)添加
Option Explicit
以进行所需的变量声明,然后使用
Dim variable name来声明所有变量,瞧,您将立即看到问题。

这是一个令人困惑的问题。如前所述,请确保启用OptionExplicit以帮助查找任何变量名问题。如果使用了“下一步继续出错时,则可以使用“下一步出错时”转到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
%>

我不知道您是否已经解决了这个问题,但是如果没有,那么您应该尝试更改您选择列的顺序,以便nText字段位于末尾。对此有一个技术解释(与记录的最大字节长度有关,iirc)。

对不起,就这样……是的,这是我第一次使用该网站,不是,我不知道为什么它会选择以这种方式为我格式化代码。从您发布的代码来看,似乎您已将shopitems表添加到主数据库中。您应该创建自己的数据库并将表放入其中。还可以考虑使用OLeDB提供程序连接字符串,而不是使用ODBC连接THOND。看:-+1,我没看到你的答案。我认为这是一个比像我那样马上给出解决方案好得多的解决方案,所以我删除了我的答案。没关系,我是个白痴,我想我试过了,但我在《意外》中留下了一些调试代码,这对我来说是个谎言……这有什么原因可以修复它吗?首先,现在你已经删除了调试代码,把*放回去,确认它再次被破坏,然后把特定字段放进去确认它被修复了(这是正确的方法)。不,它又坏了……我试着在实际的应用程序中更改为sqltxt,但它仍然坏了,所以我再次尝试了测试页面,现在它也坏了……所以我慢慢地从SELECT语句中删除了一个字段,当我减到两个字段时,它工作(有点)正常……所以我现在有了“SELECT iDesc,gID from ShopItems order by gID asc”。如果我注释掉{gID=rs1(“gID”)},那么我会得到一个iDesc的值。如果我没有注释掉gID行,那么我就得不到iDesc。好吧……是的,这是有效的……顺便说一句,当我过于沮丧时,我从sql 2000升级到了2005。我仍然有这个问题…那么我的代码在做什么,这很奇怪?当我说我想从数据库中获取所有信息时,SQL不相信我吗?谢谢哦,是的,你的代码很好…除了选项显式仍然是个麻烦,因为'i'和'j'并没有声明我不太确定。我不得不猜测这是循环之前使用的变量之间的冲突。你的代码没有给我任何问题,我可以说,所以它一定是其他东西。