Member 13410460 Ответов: 1

Как исправить этот код ?


Привет всем, у меня есть этот код, который работает отлично, и нет никакой ошибки, просто он показывает мне неправильную информацию, на самом деле, это не так, он просто показывает мне больше, чем должно быть, у меня есть datachart, который показывает мне данные в месяцах, например, я вижу datachart августа, но когда я отправил свою мышь в точку, она показывает мне информацию о сентябре также, моя дата в SQL формируется в DATETIME, а затем в VB.net я сформировал в "гггг-мм", это мой код для аннотации

Public Sub (day as String, Username as String) as String 
Dim data As String = ""
Dim constr As String = ";"
Dim query As String = "SELECT Date,Description,Price,Quantity,Username FROM [dbo].[ShareCost] WHERE DATEPART(DAY,Date) = @Day AND LTRIM(RTRIM(Username)) = @UserName"
Dim dt As DataTable = New DataTable()
Using con As SqlConnection = New SqlConnection(constr)
Using command As New SqlCommand(query, con)
command.CommandType = CommandType.Text
 
command.Parameters.AddWithValue("@Day", day.Trim())
command.Parameters.AddWithValue("@UserName", userName.Trim())
Using sda As SqlDataAdapter = New SqlDataAdapter(command)
sda.Fill(dt)
End Using
End Using
End Using
 
For Each row As DataRow In dt.Rows
Dim [date] As String = Convert.ToDateTime(Row("Date")).ToString("dd/MM/yyyy")
Dim Username1 As String = Row("Username")
Dim description As String = Row("Description")
Dim price As String = If(Row("Price").ToString = "", 0, Row("Price").ToString)
Dim quantity As String = If(Row("Quantity").ToString = "", 0, Row("Quantity").ToString)
data = data & [date] & " - " & Username1 & " - " & description & " - " & price & " - " & quantity & Environment.NewLine
Next
Return data
end sub
End Function


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

Я попытался изменить эту часть кода :

"SELECT Date,Description,Price,Quantity,Username FROM [dbo].[ShareCost] WHERE (Date BETWEEN @Day AND DATEADD(MONTH,1,@Day)) AND LTRIM(RTRIM(Username)) = @UserName"

command.Parameters.AddWithValue("@Day", day.Trim() & "-" & DateTime.Now.Day.ToString())
но это дает мне ошибку в этой строке
sda.Fill(dt)

Conversion failed when converting date and/or time from character string.

Спасибо Вам за вашу помощь,
с уважением
Е

Richard MacCutchan

Вы преобразуете @Day в строку, где она должна быть датой и временем.

Member 13410460

Я конвертирую в строку, потому что моя дата сформирована таким образом "2020-09". Я не знаю, есть ли в этом смысл.

Michael Hulthin

Что делать, если вы передадите в функцию year и month (вместо "<year>-<month>") и измените часть where на
... Функция datepart(Год,Дата) = @год и datepart(месяц,дата) = @месяц ...

Member 13410460

Спасибо за ваш ответ, это было бы хорошо, если бы у меня была дата в обычном формате ("ДД-ММ-гггг"), но в этом случае у меня есть дата, подобная этой "гггг-мм", так как я использую для своих диаграмм и различных результатов на приборной панели.

Richard MacCutchan

Нет, это не имеет смысла. Даты в базах данных должны быть всегда храниться как DateTime или Date типы. Преобразование их в строки просто усложняет ситуацию (как вы уже обнаружили).

Member 13410460

Спасибо за ваш ответ, в SQL они хранятся как DateTime, но когда я привожу их в Vb.net приборная панель я конвертирую их в этот формат, потому что мне нужно, чтобы в моей приборной панели были показаны месяцы года , а не дни. Но теперь, когда я хочу увидеть всю информацию, хранящуюся в определенный день года, мне как бы нужно добраться до дней месяца.

Richard MacCutchan

Ну, вы все еще делаете это неправильно. Единственный раз, когда он вам нужен в виде строки, - это когда вы хотите отобразить его (или его часть) в интересах пользователя. Все внутренние манипуляции и вычисления должны выполняться с использованием объектов DateTime.

Member 13410460

Спасибо за ваш ответ, но в этом случае, как я могу использовать datetime вместо String, я просто пишу это : command.Параметры.AddWithValue ("@Day", день.&Ампер обивка () и усилитель; " -"; дату-время.Сейчас() ?

Richard MacCutchan

Нет, прекратите использовать строки там, где вам нужны объекты DateTime. Это действительно сделает вашу жизнь намного проще.

Member 13410460

Спасибо за ваш совет, но в этом случае как мне исправить эту проблему, изменив строку на datetime ?

Richard MacCutchan

Предполагая, что День = "12", то выражение day.Trim() & "-" & DateTime.Now() дать вам: "12-22 Sep 2020" или что-то подобное , что вообще не имеет смысла.

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

Member 13410460

Спасибо за ваш ответ.

1 Ответов

Рейтинг:
0

Richard Deeming

Цитата:
command.Parameters.AddWithValue("@Day", day.Trim() & "-" & DateTime.Now.Day.ToString())
Вы передаете строку в запрос, который не может быть интерпретирован как допустимый datetime по SQL. Например, если day является "2"- ты проходишь мимо "2-21", что, очевидно, не является действительной датой.

Передайте параметры даты в виде дат:
command.Parameters.AddWithValue("@Day", DateTime.Today)
Из вашего вопроса не ясно, какой диапазон дат вы на самом деле пытаетесь просмотреть. Например, если это текущий месяц, начинающийся в указанный день:
Dim dayNumber As Integer
If Not Integer.TryParse(day, dayNumber) Then
    ' TODO: Display an error to the user
    Return
End If

Dim today As DateTime = DateTime.Today
Dim dayValue As New DateTime(today.Year, today.Month, dayNumber)
command.Parameters.AddWithValue("@Day", dayValue)


Member 13410460

Спасибо за ваш ответ, сэр, я попробую сделать это сегодня, когда вернусь домой. Это не для текущего месяца, у меня есть текст Datetimepicker, который имеет значения типа "гггг-мм", и я могу выбрать месяцы в течение года, чтобы показать мне диаграммы данных со значениями.