Grid View не принимает мою привязку данных из-за найденных имен столбцов или, возможно, с моей стороны произошла ошибка - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно выяснить, почему мой 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, должна быть определена как строка, с использованием двойных кавычек как таковых в этом случае ""' … '""

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Не ответ, используйте для предоставления «кода».

О скриншоте IDE - теперь наведите указатель мыши на красную волну и сделайте скриншот всплывающей подсказки с информацией об ошибке - что именно она говорит? : -)

Я предлагаю вам использовать другой стиль при создании списков с неизвестным заранее количеством элементов, в данном случае - мегатекстом, который состоит из еще не известного заранее числа более коротких строк. Как это:

X = "aaaaa"
  + "bbbbb"
  + "ccccc"
  + "ddddd"
;

Вместо традиционного и "книжного"

X = "aaaaaaaaaa" +
  "bbbbb" +
  "ccccccccccccc" + "ddddd";

Обратите внимание, что плюс добавляет к следующему элементу, а не скрывается где-то после него.

Также обратите внимание на то, как все плюсы находятся в одном столбце - их легко заметить и проверить их все (или нет).

Конечно, это идет вразрез с «типографикой», к которой мы привыкли, читая художественные книги и газеты, это выглядит очень странно и т. Д. Но попробуйте.

В вашем конкретном случае - вы, кажется, после многих ваших правок после правок просто теряете один из этих плюсовых символов, и именно поэтому IDE жалуется, что вы только что ввели синтаксическую ошибку, состоящую из двух строк, между которыми ничего нет.

0 голосов
/ 19 июня 2019

Столбец или псевдоним не могут начинаться с цифры, поскольку они должны соответствовать правилам, приведенным в Идентификаторы в справочнике по языку Firebird 2.5. Обычный идентификатор должен начинаться с ASCII a-z или A-Z, поэтому он не может начинаться с цифры.

Если вы хотите использовать цифры, то вы должны заключить в кавычки идентификатор и заключить в кавычки псевдоним, заключив его в двойные кавычки.

Вам нужно использовать "", чтобы избежать двойной кавычки, или, в частности, ваш код " (select 'iif(t2.ORCHARDDETAILID = ' || Field || ', t2.QUANTITY, 0) as ""' || MyField || '"" ' from tmp1) " +. Это две двойные кавычки и одинарная кавычка (""') до || MyField || и одинарная кавычка и две двойные кавычки ('"") после.

...