根据数据库的结果命名列标题

时间:2018-03-05 12:29:18

标签: vb.net datagridview

net并希望数据网格视图中的列标题文本以数据库的结果命名,例如我的代码中的查询返回四个日期,30/08 / 2017,04 / 09 / 2017,21 / 09 / 2017年和03/02/2018。我的目标是在数据网格中以这些日期命名的列标题。非常感谢您的帮助。

sql = "SELECT COUNT (ServiceDate) As NoOfServiceDates FROM  (SELECT DISTINCT ServiceDate FROM  tblattendance)"

        Using command = New OleDbCommand(sql, connection)
            Using reader = command.ExecuteReader
                reader.Read()
                ColumnNo = CInt(reader("NoOfServiceDates")).ToString
            End Using
        End Using

        DataGridView1.ColumnCount = ColumnNo

        For i = 0 To DataGridView1.Columns.Count - 1
            sql = "SELECT DISTINCT ServiceDate FROM  tblattendance"
            Using command = New OleDbCommand(sql, connection)
                Using reader = command.ExecuteReader
                    While reader.Read
                        DataGridView1.Columns(i).HeaderText = reader("ServiceDate").ToString
                    End While
                End Using
            End Using
        Next

2 个答案:

答案 0 :(得分:0)

For Next不正确。当您只需要执行一次时,就可以为每个列执行命令。 DataReader的最后一个结果将是当前写入的每列的标题。

您应该遍历DataReader并在那里增加游标变量:

Dim i As Integer = 0

Using command = New OleDbCommand(sql, connection)
    Using reader = command.ExecuteReader
        While reader.Read
            DataGridView1.Columns(i).HeaderText = reader("ServiceDate").ToString
            i += 1
        End While
    End Using
End Using

答案 1 :(得分:0)

当前代码每次通过列计数循环重新运行查询,这意味着它会将该列的列标题按顺序设置为所有日期值,因此查询中的最后值显示在所有列中。您只需运行一次查询:

Dim i As Integer = 0
sql = "SELECT DISTINCT ServiceDate FROM  tblattendance"
Using command As New OleDbCommand(sql, connection), _
      reader As OleDbDatareader = command.ExecuteReader()
    While reader.Read
        DataGridView1.Columns(i).HeaderText = reader("ServiceDate").ToString
        i+= 1
    End While
End Using

此外,这仍然导致两次单独的数据库访问,您可以去一次计数并再次获取值。这不仅对性能非常不利,还会让您对另一个用户将数据从一个查询更改为下一个查询的错误开放。

有几种方法可以将这种方法归结为一次数据库:通过List或DataTable将结果加载到内存中,更改SQL以包含计数和值,或者每次添加新列列表。以下是使用最后一个选项的示例:

DataGridView1.Columns.Clear()
Dim sql As String = "SELECT DISTINCT ServiceDate FROM  tblattendance"
Using connection As New OleDbConnection("string here"), _
      command As New OleDbCommand(sql, connection)

    connection.Open()
    Using  reader As OleDbDataReader = command.ExecuteReader()
        While reader.Read
            Dim column As String = reader("ServiceDate").ToString()
            DataGridView1.Columns.Add(column, column)
        End While
    End Using
End Using

如果你可以使用类似Sql Server的PIVOT关键字和DataBrid的DataGinding的AutoGenerateColumns功能,那么你会编写具有列信息和数据的 ONE SQL语句。 ,并简单地将结果集绑定到网格。