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
当前代码每次通过列计数循环重新运行查询,这意味着它将按顺序将该列的列标题设置为所有日期值,因此查询中的最后一个值显示在所有列中。您只需运行一次查询:
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关键字和DataGridView的DataBinding的AutoGenerateColumns功能,那么您将编写具有列信息和数据的ONE SQL语句,并简单地将结果集绑定到网格。
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