【问题标题】:SQL Reader saying no values exist, query seems fineSQL 阅读器说不存在值,查询似乎很好
【发布时间】:2009-04-20 12:28:21
【问题描述】:

我正在用 VB 开发一个 ASP.NET 应用程序,并在 VB 中使用 SQL 命令和连接来获取页面的数据。我将这两个部分都初始化为这样:

travelQuery.CommandText = "SELECT [StartLoc], [EndLoc],[TravelTime], [AvgSpeed], [Distance]  FROM [TravelTimes] WHERE [TripNum] = '" + lblTrip.Text + "'"
travelConnection.ConnectionString = "..."

 eventQuery.CommandText = "SELECT [IncdntDate], [Roadway],..."

诸如此类。我省略了 eventQuery,因为它可以正常工作。旅行查询和事件查询也具有相同的连接字符串。程序执行事件查询,然后如果返回的 RdwyID 值之一符合特定范围,则执行 travelQuery。

我在代码中将 RdwyID 设置为 187 以强制它提取并发布旅行时间,当我尝试运行它时它会崩溃,说没有值。这是我使用的确切代码。我使用 eventQuery 以完全相同的方式做事,它可以正常工作。我确保正确打开和关闭连接。时间被正确地声明为一个对象数组。

我检查查询的 TripNum 是数据库中的一个常量值,数据类型为文本。

Dim rdwyID As Integer
'rdwyID = events(9) - where the value is pulled from usually'
rdwyID = 187

 If (rdwyID >= 186 And rdwyID <= 225)
     FillWithTime("2", travelReader, time, newCell)


Private Sub FillWithTime(ByVal TripNum As String, ByRef travelReader As SqlDataReader, ByRef TimeData() As Object, ByRef Cell As System.Web.UI.WebControls.TableCell)

    lblTrip.Text = TripNum
    travelReader = travelQuery.ExecuteReader()
    travelReader.Read()
    travelReader.GetValues(TimeData)

    Cell.Text += "From: " + TimeData(0).ToString().Substring(9) + "<br />"
    Cell.Text += "To: " + TimeData(1).ToString().Substring(9) + "<br />"
    Cell.Text += "Travel Time: " + TimeData(2).ToString() + " minutes <br />"
    Cell.Text += "Average Speed: " + TimeData(3).ToString() + " MPH <br />"
    Cell.Text += "Distance: " + TimeData(4).ToString() + " miles <br />"

End Sub

感谢您的任何帮助或建议。

编辑:按照您所说的进行更改,并且执行阅读器的 if 语句评估为 false。我对与读者合作一无所知,什么样的条件会使其失败?非常感谢。

编辑 2:检查计数以匹配条件返回零,并直接检查返回 15。非常感谢。是时候弄清楚为什么它不匹配了......

【问题讨论】:

    标签: sql vb.net


    【解决方案1】:

    我认为你可以尝试这样的事情

        travelQuery.CommandText = "SELECT [StartLoc], [EndLoc],[TravelTime], [AvgSpeed], [Distance]  FROM [TravelTimes] WHERE [TripNum] = @trip"
        ' Assuming trip as integer
        travelQuery.CommandParameters.Add(@trip, Convert.ToInt32(lblTrip.Text))
    

    此外,如果 lblTrip.Text 不是数字,上面的代码将引发错误,因此您将使用 int.TryParse 或类似的东西。

    另外,在阅读器中,检查阅读

    If (travelReader.Read()) Then Begin
    End If
    

    这样,如果阅读器在读取数据时遇到问题,您就不会引发错误。

    编辑 1

    出于测试目的,请先检查此

    travelQuery.CommandText = "SELECT COUNT(*) FROM [TravelTimes] WHERE [TripNum] = @trip"
    

    然后这个

    travelQuery.CommandText = "SELECT COUNT(*) FROM [TravelTimes]"
    

    第一个将为您获取满足您条件的行,第二个将为您获取表的总行数,这样您就可以确定问题是读取器还是数据源 (db)

    【讨论】:

      【解决方案2】:

      如果您使用的是 SQL Server:尝试使用 SQL Server Profiler 查看实际提交到服务器的查询。我的猜测是 lblTrip.Text 尚未设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 2021-08-27
        • 1970-01-01
        相关资源
        最近更新 更多