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
答案 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语句。 ,并简单地将结果集绑定到网格。