ASP查询返回

时间:2013-12-17 19:05:00

标签: asp.net sql

我有这个ASP页面。我正在尝试显示metalquery的结果,列出所有订单号。当我现在这样做时,它只显示第一个订单号。有没有办法显示查询中的所有订单号?

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data.Odbc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<!-- webkit5 includes --!>
<!-- <meta content="yes" name="apple-mobile-web-app-capable" /> --!>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta content="minimum-scale=1.0, width=device-width, maximum-scale=0.6667, user-scalable=no" name="viewport" />
<link href="css/style.css" rel="stylesheet" media="screen" type="text/css" />
<script src="javascript/functions.js" type="text/javascript"></script>
<title>Open Inkjet Orders</title>
<meta content="keyword1,keyword2,keyword3" name="keywords" />
<meta content="Description of your page" name="description" />
</head>

<body>
<div id="topbar" class="transparent">
    <div id="leftnav">
        <a href="Home.aspx">
            <img alt="home" src="images/home.png">
        </a>
        <a href="OpenOrders.aspx">Open Orders</a>
    </div>
</div>

<div id="content">
<%
OdbcConnection cn;
OdbcCommand cmd;

String canvasQuery = "select count(distinct(info.orderid)) from orderinfo info, orderiteminfo item where info.orderstatus = 'Open' and info.orderid = item.orderid and item.deptcode in (35) and info.duedate = DATE(NOW())";
String wallWrapQuery = "select count(distinct(info.orderid)) from orderinfo info, orderiteminfo item where info.orderstatus = 'Open' and info.orderid = item.orderid and item.deptcode in (41) and info.duedate = DATE(NOW())";
String fineartQuery = "select count(distinct(info.orderid)) from orderinfo info, orderiteminfo item where info.orderstatus = 'Open' and info.orderid = item.orderid and item.deptcode in (03) and info.duedate = DATE(NOW())";
String metalQuery = "select distinct(info.orderid) from orderinfo info, orderiteminfo item where info.orderstatus = 'Open' and info.orderid = item.orderid and item.deptcode in (48) and info.duedate = DATE(NOW())";

int canvasOpen, wallWrapOpen, fineartOpen, metalOpen;


cn= new OdbcConnection("dsn=xxxx;UID=xxxx;PWD=xxxx");

cmd=new OdbcCommand(canvasQuery,cn);
cn.Open();
OdbcDataReader DbReader = cmd.ExecuteReader();

DbReader.Read();
canvasOpen = DbReader.GetInt32(0);

cmd=new OdbcCommand(wallWrapQuery,cn);
DbReader = cmd.ExecuteReader();
DbReader.Read();
wallWrapOpen = DbReader.GetInt32(0);

cmd=new OdbcCommand(fineartQuery,cn);
DbReader = cmd.ExecuteReader();
DbReader.Read();
fineartOpen = DbReader.GetInt32(0);

cmd=new OdbcCommand(metalQuery,cn);
DbReader = cmd.ExecuteReader();
DbReader.Read();
metalOpen = DbReader.GetInt32(0);

DbReader.Close();
cn.Close();

%>
    <span class="graytitle">Due Inkjet Orders</span>
        <ul class="pageitem">
            <li class="menu">

                    <span class="name">Canvas Dept: <%=canvasOpen%></span>

            </li>
            <li class="menu">
                <span class="name">Wall Cling Dept: <%=wallWrapOpen%></span>
            </li>
            <li class="menu">
                    <span class="name">Fine Art Dept: <%=fineartOpen%></span>
            </li>
            <li class="menu">
                    <span class="name">Metal Dept: <%=metalOpen%></span>
            </li>
            <li>
            </li>
        </ul>
</div>
</body>

</html>

3 个答案:

答案 0 :(得分:1)

你必须继续调用Read()方法,直到它返回false。

每次Read()调用只返回一条记录。

试试这个:

while(DbReader.Read())
{
   metalOpen = DbReader.GetInt32(0);

%>
    <span class="graytitle">Due Inkjet Orders</span>
        <ul class="pageitem">
           <li class="menu">
                <span class="name">Canvas Dept: <%=canvasOpen%></span>
            </li>
            <li class="menu">
                <span class="name">Wall Cling Dept: <%=wallWrapOpen%></span>
            </li>
            <li class="menu">
                <span class="name">Fine Art Dept: <%=fineartOpen%></span>
            </li>
            <li class="menu">
                <span class="name">Metal Dept: <%=metalOpen%></span>
            </li>
            <li>
        </li>
        </ul>
    </span>
%>
}
DbReader.Close();
cn.Close();

答案 1 :(得分:1)

以下查询位于代码块的开头,指定的查询可能返回零,一个或多个记录 - 更确切地说是orderid字段:

String metalQuery = "select distinct(info.orderid) from orderinfo info, orderiteminfo item where info.orderstatus = 'Open' and info.orderid = item.orderid and item.deptcode in (48) and info.duedate = DATE(NOW())";

此块正在针对您的源数据库执行此查询:

cmd=new OdbcCommand(metalQuery,cn);
DbReader = cmd.ExecuteReader();

现在您需要遍历每个结果。您可以使用.Read()方法完成此操作。整洁的事情是,.Read()只要在ResultSet上有记录就可以使用。

然后,您可以将.Read()次迭代封装在While块上:

while(DbReader.Read())
{
    //Here goes your code
}

在你的情况下,它可能看起来像这样:

while(DbReader.Read())
{
    metalOpen = DbReader.GetInt32(0);
%>
    <span class="name">Metal Dept: <%=metalOpen%></span>
<%
}

当然,根据需要调整输出。

答案 2 :(得分:0)

您需要添加一个循环来读取多个记录(并将metalOpen更改为List<int>以存储多个值:

List<int> metalOpen = new List<int>();
cmd=new OdbcCommand(metalQuery,cn);
DbReader = cmd.ExecuteReader();
while(DbReader.Read())
{
   metalOpen.Add(DbReader.GetInt32(0));
}

然后决定如何显示它们 - 最简单的方法是显示以逗号分隔的列表:

        <li class="menu">
                <span class="name">Metal Dept: <%=string.Join(", ",metalOpen)%></span>
        </li>