CHill60
Никогда не объединяйте строки для создания SQL-запроса-вместо этого используйте параметризованные запросы. Этот код должен быть
Cmd.CommandText = "Select * From Daybookcash Where PersonName = @tbdbkname"
Cmd.Parameters.AddWithValue("@tbdbkname",Tbdbkname.Text)
Также не используйте
Select * From
- перечислите столбцы, которые вы хотите явно
Select [PersonName], [Date], Credit, Debit From ...
Вероятно, самый простой способ получить баланс - это запросить базу данных с помощью
select [Personname], sum(Credit) - sum(Debit) as balance from Daybookcash GROUP BY [PersonName]
Используйте то же самое предложение Where, что и выше, если вам это нужно.
Другой вариант - посмотреть на результаты запроса, который у вас есть, так, как вы это делаете. Беда в том, что у вас есть
null
данные в вашей таблице, так что вы, вероятно, получаете исключение
Цитата:
Оператор ' - 'не определен для типа 'Decimal' и типа 'DBNull'.
Ты можешь
любой проверьте наличие нулевых элементов перед их использованием, например:
Dim y As Decimal
If Not Decimal.TryParse(Rd.Item("Debit").ToString(), y) Then
y = 0
End If
Dim x As Decimal
If Not Decimal.TryParse(Rd.Item("Credit").ToString(), x) Then
x = 0
End If
Tbamtcashih.Text = (x - y).ToString()
Или оставьте вычисление более или менее таким, как оно есть, и измените запрос так, чтобы значения NULL не возвращались, например так:
Select [PersonName], [Date], ISNULL(Credit,0) as Credit, ISNULL(Debit,0) as Debit From ...
.Не забудьте использовать .Метод ToString (), как указано выше.
[РЕДАКТИРОВАТЬ]
Как и было запрошено здесь есть полное решение:
Using con As New SqlConnection
con.ConnectionString = constring
con.Open()
Using cmd As New SqlCommand
cmd.Connection = con
cmd.CommandText = "select [Personname], sum(Credit) as Credit, sum(Debit) as Debit from Daybookcash where [PersonName] = @tbdbkname GROUP BY [PersonName]"
cmd.Parameters.AddWithValue("@tbdbkname", "Deepak")
Dim rd As SqlDataReader = cmd.ExecuteReader
If rd.HasRows Then
rd.Read()
Dim y As Decimal
If Not Decimal.TryParse(rd.Item("Debit").ToString(), y) Then
y = 0
End If
Dim x As Decimal
If Not Decimal.TryParse(rd.Item("Credit").ToString(), x) Then
x = 0
End If
Tbamtcashih.Text = (x - y).ToString()
End If
End Using
End Using
Или вот так (что я предпочитаю)
Using con As New SqlConnection
con.ConnectionString = constring
con.Open()
Using cmd As New SqlCommand
cmd.Connection = con
cmd.CommandText = "select [Personname], sum(Credit) - sum(Debit) as Balance from Daybookcash where [PersonName] = @tbdbkname GROUP BY [PersonName]"
cmd.Parameters.AddWithValue("@tbdbkname", "Deepak")
Dim rd As SqlDataReader = cmd.ExecuteReader
If rd.HasRows Then
rd.Read()
Tbamtcashih.Text = rd.Item("Balance").ToString()
End If
End Using
End Using