Member 13410460 Ответов: 1

Указанное приведение не является допустимым ?


Всем Привет,

Я использовал код от Создание многосерийной линейной диаграммы (графика) в приложении Windows Forms с использованием C# и VB.Net[^] для моих карт в vb.net и я изменил его в зависимости от своей потребности, и я получаю ошибку, которая говорит: "указанный бросок недопустим" в моем поле "год".

Вот этот код :


Dim query As String = "SELECT   SUM(Price) AS 'Total'
        ,CONVERT(char(7), date, 120)  AS 'year'
        ,Department as 'Department'
        FROM     [dbo].[Expenses]
        WHERE    Department IN ('Electronics' ,'Grocery','Other','Vacation','FixCost','Clothes')
        GROUP BY  Rollup (CONVERT(char(7), date, 120)), Department
        HAVING   CONVERT(char(7), date, 120) >= '" & DateTimePickerfrom.Text & "'" _
        & " And Convert(Char(7), Date, 120) <= '" & DateTimePickerto.Text & "'"

       Dim dt As DataTable = GetData(query)
       'Get the DISTINCT Countries.
       Dim countries As List(Of String) = (From p In dt.AsEnumerable()
                                           Select p.Field(Of String)("Department")).Distinct().ToList()

       'Remove the Default Series.
       If Chart1.Series.Count() = 1 Then
           Chart1.Series.Remove(Chart1.Series(0))
       End If

       For Each country As String In countries

           'Get the Year for each Country.
           Dim x As Integer() = (From p In dt.AsEnumerable()
                                 Where p.Field(Of String)("Department") = country
                                 Order By p.Field(Of Integer)("year") '---> Here i get the error
                                 Select p.Field(Of Integer)("year")).ToArray() _
           'Get the Total of Orders for each Country.
           Dim y As Integer() = (From p In dt.AsEnumerable()
                                 Where p.Field(Of String)("Department") = country
                                 Order By p.Field(Of Integer)("year")
                                 Select p.Field(Of Integer)("Total")).ToArray() _

           'Add Series to the Chart.
           Chart1.Series.Add(New Series(country))
           Chart1.Series(country).IsValueShownAsLabel = True
           Chart1.Series(country).BorderWidth = 3
           Chart1.Series(country).ChartType = SeriesChartType.Line
           Chart1.Series(country).Points.DataBindXY(x, y)


       Next
       Chart1.Legends(0).Enabled = True


Что я уже пробовал:

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

Благодарно,

Richard Deeming

Dim query As String = "SELECT   SUM(Price) AS 'Total'
        ,CONVERT(char(7), date, 120)  AS 'year'
        ,Department as 'Department'
        FROM     [dbo].[Expenses]
        WHERE    Department IN ('Electronics' ,'Grocery','Other','Vacation','FixCost','Clothes')
        GROUP BY  Rollup (CONVERT(char(7), date, 120)), Department
        HAVING   CONVERT(char(7), date, 120) >= '" & DateTimePickerfrom.Text & "'" _
        & " And Convert(Char(7), Date, 120) <= '" & DateTimePickerto.Text & "'"


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Member 13410460

Отмеченный :)
Спасибо

1 Ответов

Рейтинг:
10

CHill60

Эта часть вашего запроса

CONVERT(char(7), date, 120)  AS 'year'
не возвращается "год". Он возвращает строковое значение в формате "гггг-мм".

Если вы просто хотите год, то используйте
YEAR(date) AS 'year'
или если вы используете базу данных, которая не имеет YEAR() использование функций
SELECT CONVERT(char(4), 'date', 120) AS 'year'