#mysql #vb.net #datatable #datagridview #inner-join
#mysql #vb.net #datatable #datagridview #внутреннее соединение
Вопрос:
Я хочу добавить столбцы для ОБЪЕКТОВ, а затем использовать их fac_id, чтобы найти их производство воды из другой таблицы, которая будет отображаться в виде одной строки под заголовками столбцов.
Do While tableRetrieve.Read = True
table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))
Dim newDate As DateTime = DateTime.ParseExact(dtpFrom.Value, "MM/dd/yyyy h:m:s tt",
System.Globalization.DateTimeFormatInfo.InvariantInfo)
Dim myDate As String = newDate.ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo)
If myDate = tableRetrieve("sentDate") Then
If tableRetrieve("prod_id") = tableRetrieve("fac_id") Then
table.Rows.Add(tableRetrieve("facility_produce"))
End If
End If
Loop
Я могу добавить заголовки столбцов, но не удалось в строках.
Ниже приведено изображение выходных данных. Отображаются заголовки столбцов, но объемы производства воды отображаются только в одной строке. Для каждого соответствующего столбца должны быть объемы производства воды на основе prod_id, равного fac_id.
Обновить:
Вот как выглядит мой код сейчас. Это хорошо работает, если есть только одна строка. ошибки отображаются, если есть другая строка.
Do While tableRetrieve.Read = True
table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))
If tableRetrieve("facility_id") = tableRetrieve("fac_id") Then
newDate = tableRetrieve("sentDate")
If prevDate = newDate Then
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
If row = 0 Then
col = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
col = 0
row = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
col = 1
End If
End If
End If
Loop
dgvFacility.DataSource = table
Ответ №1:
Для каждого цикла вы пишете tableRetrieve("facility_produce")
новую строку. Вместо этого вы должны записать ее в следующий столбец.
Dim col As Integer = 0
Do While tableRetrieve.Read = True
table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))
Dim newDate As DateTime = DateTime.ParseExact(dtpFrom.Value, "MM/dd/yyyy h:m:s tt",
System.Globalization.DateTimeFormatInfo.InvariantInfo)
Dim myDate As String = newDate.ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo)
If myDate = tableRetrieve("sentDate") Then
If tableRetrieve("prod_id") = tableRetrieve("fac_id") Then
If col = 0 Then
table.Rows.Add(tableRetrieve("facility_produce"))
Else
table.Rows(0)(col) = tableRetrieve("facility_produce")
End If
col = 1
End If
End If
Loop
Комментарии:
1. Большое вам спасибо! Работает как шарм! Я не знал, что вы можете кодировать table.rows подобным образом. Так много поиска в Google, а такого примера кода нет. Ты гений! 🙂
2. Я попытался добавить строки для новых значений, но я получаю сообщение об ошибке, что столбец 1 или 2 или 3 не найден. 🙁 Я также получаю сообщение об ошибке из-за повторяющегося имени столбца.
3. Вы должны добавить столбцы (таблица. Столбцы.Добавить …) только при заполнении первой строки столбцы готовы для всех строк.
4. Я выполнил внутреннее объединение, и я могу добавлять столбцы только после Do while tableRetrieve. Read = True. Могу ли я каким-либо образом добавить столбцы, даже если таблицы были объединены внутри?
5. Я также получаю сообщение об ошибке System. Исключение IndexOutOfRangeException: «Не удается найти столбец 2». когда я пытаюсь добавить оператор if, чтобы проверить, существует ли имя столбца.
Ответ №2:
Прежде всего. Я добавил Dim countColumns As Integer
в начале формы, которая будет вызвана позже для подсчета столбцов.
Я вставил countColumns = 1
в ту часть, где я отображаю пустую строку datagridview, но с заголовками столбцов в ней. Там столбцы, зарегистрированные в базе данных, уже подсчитаны. Поэтому я могу использовать его позже, чтобы вызвать количество столбцов.
Затем я разместил table.Columns.Count <= countColumns
так, чтобы количество столбцов увеличивалось по мере отображения столбцов, а затем прекратил добавлять столбцы, как только количество столбцов, зарегистрированных в базе данных, стало равным, чтобы избежать ошибок при дублировании.
Это часть моей программы, в которой я отображаю заголовки столбцов и значения строк:
Try
SQLConnection.Open()
tableRetrieve = sqlCommand.ExecuteReader
table.Columns.Add("Date", Type.GetType("System.String"))
Do While tableRetrieve.Read = True
If table.Columns.Count <= countColumns Then
table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))
End If
newDate = tableRetrieve("sentDate")
If prevDate = newDate Then
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
If col = 0 Then
col = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
col = 1
row = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
End If
End If
Loop
dgvFacility.DataSource = table
tableRetrieve.Close()
sqlCommand.ExecuteNonQuery()
Catch ex As MySqlException
MsgBox(ex.Message.ToString)
Finally
SQLConnection.Close()
End Try
Эта часть программы проверяет, совпадают ли даты с помощью этого кода: prevDate = newDate
, если они совпадают, программа добавит facility_produceна той же строке в соответствующем столбце. Если дата не совпадает, программа проверяет, равен ли col нулю, если ноль, то datagridview по-прежнему пуст, и программа введет первую строку с ее произведенной суммой. И если col не равен нулю, это означает, что уже есть новая дата и что уже есть существующая строка, тогда программа должна ввести следующую строку значений ниже.
If prevDate = newDate Then
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
If col = 0 Then
col = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
Else
col = 1
row = 1
table.Rows.Add(tableRetrieve("sentDate"))
table.Rows(row)(col) = tableRetrieve("facility_produce")
prevDate = newDate
col = 1
End If
End If
Извините за длинный пост, но я надеюсь, что это поможет и поможет всем, кто использует inner join, а затем использует значения строк в качестве заголовков столбцов. Мне было трудно решить эту проблему. Не использовал программирование на VB с 2010 года. Я все еще использовал VB 6 еще в 2010 году, и я очень устарел с VB.Теперь чистая. Есть чему поучиться, и мне это нравится.
Спасибо @milda за помощь. Ваш код помог мне разместить мои значения в правильных позициях.
Комментарии:
1. О да, вы сами поняли! Это лучший способ изучить его.
2. Большое вам спасибо! Надеюсь, что мой код здесь также поможет другим программистам. 🙂