【问题标题】:Retrieve data using DataReader from multiple tables in mySQL使用 DataReader 从 mySQL 中的多个表中检索数据
【发布时间】:2013-02-07 16:28:26
【问题描述】:

如何从“DAILY_CALCULATIONS”表中检索数据

  Dim SqlQuery As String = "SELECT WEEKLY_TIMECARD.*,DAILY_CALCULATIONS.*,EMPLOYEE_PROFILES.EMPLOYEE_NUMBER "
    SqlQuery = SqlQuery + " FROM WEEKLY_TIMECARD, DAILY_CALCULATIONS, employee_profiles WHERE employee_profiles.employee_number"
    SqlQuery = SqlQuery + " = WEEKLY_TIMECARD.employee_number AND EMPLOYEE_PROFILES.EMPLOYEE_NUMBER = DAILY_CALCULATIONS.EMPLOYEE_NUMBER AND"
    SqlQuery = SqlQuery + " WEEKLY_TIMECARD.WEEK_NUMBER = DAILY_CALCULATIONS.WEEK_NUMBER AND WEEKLY_TIMECARD.EMPLOYEE_NUMBER ="
    SqlQuery = SqlQuery + "'" + txtENumber.Text + "' AND WEEKLY_TIMECARD.WEEK_NUMBER = '" + CBWeekNum.SelectedItem + "'"

    Try

        con.Open()

        If con.State = ConnectionState.Open Then
            con.ChangeDatabase("shopclocksoftware")
            Command = New MySqlCommand(SqlQuery, con)
            Data = Command.ExecuteReader()

            While Data.Read
                txtHUnits.Text = Data(2).ToString
                txtOUnits.Text = Data(3).ToString
            End While

我查看了 Data.NextResult 方法,但我无法正确实现它,有什么想法吗?

【问题讨论】:

  • 你没有调用上面的方法那么你的问题到底是什么?
  • 您也可以使用上述代码进行 SQL 注入攻击。您应该参数化您的 SQL 以避免这种情况。
  • 我不明白你的意思,我的 while Data.Read 部分从我的 'WEEKLY_TIMECARD' 表中返回值.. 我也想从 'DAILY_CALCULATIONS' 调用
  • 据我所知,您有 1 个查询将返回包含许多列的单个结果集。 NextResult 适用于您有多个选择和多个结果集的场景。您的 Data.Read 将返回每一列。
  • 那么,如果我从 'weekly_timecard' 4 列和 'daily_calculations' 7 列中检索,我的数据(数字)将是什么......假设我只想从每天检索第三个数据项计算会是 (data(7).ToString) 吗?

标签: mysql sql vb.net sqldatareader


【解决方案1】:
Dim SqlQuery As String = "SELECT wtc.A, wtc.B, wtc.C, dc.D, dc.E, ep.F, ep.G"
SqlQuery = SqlQuery + " FROM WEEKLY_TIMECARD wtc, DAILY_CALCULATIONS dc, employee_profiles ep "
SqlQuery = SqlQuery + " WHERE ep.employee_number"
SqlQuery = SqlQuery + " = wtc.employee_number AND ep.EMPLOYEE_NUMBER = dc.EMPLOYEE_NUMBER AND"
SqlQuery = SqlQuery + " wtc.WEEK_NUMBER = dc.WEEK_NUMBER AND wtc.EMPLOYEE_NUMBER ="
SqlQuery = SqlQuery + "@ENumber AND wtc.WEEK_NUMBER = @CBWeekNum"

Try
    con.Open()

    If con.State = ConnectionState.Open Then
        con.ChangeDatabase("shopclocksoftware")
        Command = New MySqlCommand(SqlQuery, con)
        Command.Parameters.AddWithValue("@ENumber", txtENumber.Text);
        Command.Parameters.AddWithValue("@CBWeekNum", CBWeekNum.SelectedItem);

        Data = Command.ExecuteReader()

        Dim aOrdinal As Integer = reader.GetOrdinal("a")
        Dim bOrdinal As Integer = reader.GetOrdinal("b")

        While Data.Read
            txtHUnits.Text = Data.GetString(aOrdinal)
            txtOUnits.Text = Data.GetString(bOrdinal)
        End While
....
Exit Try

需要注意的几点:

  1. 我将您的 SQL 更改为使用别名,并返回明确的字段名称。使用 * 通常是个坏主意,尤其是当您实际上只需要列的子集时。
  2. 查询现已参数化,因此您不会受到 SQL 注入攻击
  3. 我使用GetOrdinal 来定位结果集中任何列的位置。这是一个小优化。
  4. 如果您返回的列是字符串,请调用GetString。否则,您可以像以前一样调用。

显然我现在不知道你的列名,所以 SQL 将无法工作,但你应该明白了。

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2017-03-23
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多