Мне нужно выяснить, почему мой Grid View не принимает мою привязку данных. Первая проблема, с которой я столкнулся, заключалась в том, что ее нужно было динамически создавать, и мне пришлось переделать мою логику / структуру, чтобы она стала такой, какой она есть сейчас.
Я полагаю, что проблема заключается в фактическом наборе результатов, который передается из исходного SQL-запроса в PestList обратно BindGridView, показанном ниже. Я пробовал несколько вещей, таких как переработка выбора, несколько запросов SQL и т. Д. Я также пытался включить и CAST столбцы в строки с CAST (значение как Varchar) и т. Д.
Моя следующая идея состояла в том, чтобы попытаться добавить метод для построения строки SQL в разделах, но я не уверен, что я даже больше поступлю правильно.
Это метод, использующий исходный набор sql select, который я построил во FlameRobin (таблица заполнена тестовыми данными, а имена методов немного изменены):
Private Sub getPestList()
tempVal = "With tmp1(Field) As " +
" (select distinct t2.ORCHARDDETAILID from PESTMONITOR t2), " +
" tmp2(MyPivot) As " +
" (select 'iif(t2.ORCHARDDETAILID = ' || Field || ', t2.QUANTITY, 0) as ' || MyField || ' ' from tmp1) " +
" Select 'select t2.MONITORDATE, '||list(distinct MyPivot)||' from PESTMONITOR t2 order by 1' from PESTMONITOR cross join tmp2"
Using execSQL As New FbCommand((tempVal), con)
tempVal = execSQL.ExecuteScalar()
End Using
End Sub
Это генерирует мою динамическую строку SQL на основе информации в таблице и передает ее в tempVal со следующим результатом (2 выбора и перекрестное соединение):
Теперь да, SQL выглядит довольно забавно, и я прошу прощения за формат, поэтому я также вставлю встроенный SQL здесь:
with tmp1(MyFieldName) as (select distinct t2.ORCHARDDETAILID from PESTMONITOR t2), tmp2(MyPivotSource) as (select 'iif(t2.ORCHARDDETAILID = ' ||MyFieldName|| ', t2.QUANTITY, 0) as ' || MyFieldName || ' ' from tmp1) select 'select t2.MONITORDATE, '||list(distinct MyPivotSource)||' from PESTMONITOR t2 order by 1' from PESTMONITOR cross join tmp2
Но мне нужно сделать это таким образом, чтобы выполнить следующее:
Private Sub GridView()
Try
getPestList()
Dim sql = tempVal
Dim dt As New DataTable
Dim da As New FbDataAdapter(sql, con)
da.Fill(dt)
If dt.Rows.Count > 0 Then
Dim pivotedTable As DataTable = PivotTable(dt)
gvPCL.DataSource = pivotedTable
gvPCL.DataBind()
End If
Catch ex As System.Data.SqlClient.SqlException
Dim msg As String = "Fetch Error:"
msg += ex.Message
Throw New Exception(msg)
End Try
End Sub
Это заполняет мой GridView переменной, переданной в FbDataAdapter
Ожидаемые результаты должны быть:
исходный результат Sql:
select t2.MONITORDATE, iif(t2.ORCHARDDETAILID = 819, t2.QUANTITY, 0) as 819 ,iif(t2.ORCHARDDETAILID = 836, t2.QUANTITY, 0) as 836 ,iif(t2.ORCHARDDETAILID = 837, t2.QUANTITY, 0) as 837 from PESTMONITOR t2 order by 1
2-й результат sql, а также GridView (после привязки данных) должны отображать эту таблицу:
819 836 837
01.01.2019 0.000000 1.000000 0.000000
02.01.2019 0.000000 1.000000 0.000000
03.01.2019 0.000000 1.000000 0.000000
04.01.2019 0.000000 1.000000 0.000000
05.01.2019 0.000000 1.000000 0.000000
06.01.2019 0.000000 1.000000 0.000000
07.01.2019 0.000000 0.000000 1.000000
14.01.2019 0.000000 4.000000 0.000000
13.06.2019 2.000000 0.000000 0.000000
13.06.2019 3.000000 0.000000 0.000000
14.06.2019 1.000000 0.000000 0.000000
Есть также одна или две другие вещи, происходящие, но они не повлияют ни на что, происходящее с этой текущей проблемой. Суть в том, чтобы отображать количество всех ловушек на номерах блоков для всех дат. (может быть 1 или 1001)
ошибка, которую я получаю при выполнении da.Fill (dt), следующая:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 73
819
так вот где имя столбца erorrs устанавливается
… select t2.MONITORDATE, iif(t2.ORCHARDDETAILID = 819, t2.QUANTITY, 0) as 819 …
Почему имя моего столбца не может быть числом? Мне пришлось вручную вставлять двойные кавычки вокруг столбцов. чтобы показать таблицу результатов выше.
Я попытался возиться с "
, '
, а также с их комбинацией, чтобы попытаться избежать этого, так как я устанавливаю это как переменную tempVal = "SQL HERE", и оператор добавляется полностью, если я добавляю есть.
Я рассматриваю возможность использования функции блока и в настоящее время испытываю способы включения селекторов в exec block stmt и / или s-proc, чтобы обойти проблему ""
в IDE
Редактировать: Спасибо Марку за то, что он указал на ограничение идентификатора, о котором я, по-видимому, не знал. Я смог исправить ошибку, без какого-либо ручного вмешательства, добавив один символ до того, как столбец связался со значением строки следующим образом: `` `'|| [a-z / A-Z] || myValue || ''. Я мог бы убрать это с помощью подстроки или чего-то подобного в коде, но если это не конец света, я могу обойтись. Я принял его ответ как правильный в свете этого.
Редактировать 2: На вопрос технически дан ответ, но здесь приведен скриншот того, что я хотел помочь прояснить, как предложил пользователь в комментариях под ответом «Отметки». IDE Просмотр проблемы после добавления кавычек для указания значения как строка .
Как видите, по этой причине я немного боролся с этим. И почему я думал, что построение этого отдельно построчно вместо простого оператора SQL было бы лучшим подходом. Я пришел из C # / MySQL, и в основном я учусь, поскольку сталкиваюсь с проблемами и должен исправить это, это далеко от того места, где я хотел бы, но это происходит.
За что стоит, ребята, спасибо, что нашли время, чтобы прочитать его и попытаться выяснить, что к чему.
Final Edit / Note: Теперь он полностью работает, 100%, как и ожидалось.Ошибка произошла из-за неполного понимания ограничений идентификатора столбца / переменная, заданная для имен столбцов в SQL, должна быть определена как строка, с использованием двойных кавычек как таковых в этом случае ""' … '""