powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Не удается присвоить элементу массива значение переменной
5 сообщений из 5, страница 1 из 1
Не удается присвоить элементу массива значение переменной
    #38605828
Сатир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
      
Dim sum_mas As Integer()
...
  If reader.HasRows Then
            Do While reader.Read
                i = 0
                plan_value = reader.GetInt32(0)
                param_cost = reader("param_cost")
                If plan_value <= CInt(param_value) Then

                    sum_mas(i) = param_cost
                    i = i + 1
                End If
            Loop
        Else
            Console.WriteLine("ERROR NO DATA FOUND")
        End If

        reader.Close()



Хочу в цикле присвоить значение полученное ридером из БД элементу массива. Выдает ошибку

Ссылка на объект не указывает на экземпляр объекта.

Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Ошибка источника:


Строка 31: i = 0
Строка 32: plan_value = reader.GetInt32(0)
Строка 33: param_cost = reader("param_cost")
Строка 34: If plan_value <= CInt(param_value) Then
Строка 35:

Исходный файл: I:\Salary\base\zarplata\zarplata\buble.aspx.vb Строка: 33


В чем ошибка?
...
Рейтинг: 0 / 0
Не удается присвоить элементу массива значение переменной
    #38605847
Сатир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведу еще раз все функцию

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
    Public Function ad_serv_check(ByVal emp_id As Integer, ByVal param_id As Integer, ByVal param_value As String) As Double
        Dim plan_value, i, tmp As Integer, param_cost As Integer
        Dim sum As Double
        Dim sum_mas As Integer()
        Dim sql_string As String = "Data Source=.\SQLEXPRESS;Initial Catalog=zarplata;Integrated Security=True"
        Dim select_str As String = "SELECT param_condition, param_cost FROM dbo.SalaryParam WHERE salary_param_id=" & param_id
        Dim conn As System.Data.SqlClient.SqlConnection
        conn = New System.Data.SqlClient.SqlConnection(sql_string)

        Dim cmd As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(select_str, conn)
        conn.Open()
        Dim reader As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader


        If reader.HasRows Then
            Do While reader.Read
                i = 0
                plan_value = reader.GetInt32(0)
                param_cost = reader("param_cost")
                If plan_value <= CInt(param_value) Then

                    sum_mas(i) = param_cost
                    i = i + 1
                End If
            Loop
        Else
            Console.WriteLine("ERROR NO DATA FOUND")
        End If

        reader.Close()
        conn.Close()
        For i = 0 To sum_mas.GetUpperBound(0)

            If sum_mas(i) > sum_mas(i + 1) Then
                tmp = sum_mas(i)
                sum_mas(i) = sum_mas(i + 1)
                sum_mas(i + 1) = tmp
                sum = sum_mas(i)
            End If
        Next

        Debug.WriteLine(sum)
        Return sum
    End Function



Ругается на строку sum_mas(i) = param_cost , что мол "System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта."
...
Рейтинг: 0 / 0
Не удается присвоить элементу массива значение переменной
    #38605897
Кавказ-сила
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
Код: vbnet
1.
2.
3.
        If reader.HasRows Then
                i = 0
            Do While reader.Read



2)
Код: vbnet
1.
param_cost = reader.GetInt32(1)

?
...
Рейтинг: 0 / 0
Не удается присвоить элементу массива значение переменной
    #38605939
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сатир, ты объявил массив, но не выделил под него память. И так как массив это ссылочный тип, то разумеется ты получил NullReferenceException. Для выделения памяти под массив нужно знать кол-во элементов. Ты читаешь заранее неизвестное кол-во строк из БД и значит массив здесь не подходит и надо использовать List(Of Integer):
Код: vbnet
1.
2.
3.
4.
5.
Dim sum_mas As New List(Of Integer)
...
sum_mass.Add(param_cost)
...
For i = 0 To sum_mas.Count



Кавказ-сила уже обратил твое внимание, что переменная i должна инициализироваться до цикла While, а не внутри его. Правда при использовании List(Of Integer) тебе эта переменная уже не нужна.

Ну и в целом код очень ужасный.
1) Почему param_value имеет тип String хотя используется как Integer?
2) Если ты заранее знаешь что тебе нужны только строки где колонка param_condition меньше или равна param_value, то почему не добавить соотвествующее условие в SQL запрос?
3) Обращаться к колонкам по индексам плохая идея. Используй метод GetOrdinal() класса SqlDataReader
4) Открой для себя диретивку Imports чтобы не писать полные имена типов.
5) В VB.NET не надо объявлять все переменные в начале функции. Лучше это делать ближе к месту использования
6) Обработка ошибок в виде Console.WriteLine() это плохой механизм. Разве что ты это просто для отладки используешь.
7) В sum_mas ты хочешь хранить Integer, а результат заносишь в переменную sum типа Double. Зачем?
8) Я так и не понял сути твоего цикла с перестановками элементов.

В общем метод можно переписать хотя бы так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Imports System.Data.SqlClient
...
Public Function ad_serv_check(ByVal emp_id As Integer, ByVal param_id As Integer, ByVal param_value As Integer) As Integer
	Dim sum_mas As New List(Of Integer)
	Dim sqlQuery As String = "SELECT param_cost FROM dbo.SalaryParam WHERE salary_param_id=" & param_id & " AND param_condition<=" & param_value
	
	Using conn As New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=zarplata;Integrated Security=True")
		Dim cmd As New SqlCommand(sqlQuery, conn)
		
		conn.Open()
		Using reader As SqlDataReader = cmd.ExecuteReader()
			If reader.HasRows Then
				Do While reader.Read()
					Dim param_cost As Integer = reader.GetInt32(reader.GetOrdinal("param_cost"))
					sum_mas.Add(param_cost)
				Loop
			Else
				Console.WriteLine("ERROR NO DATA FOUND")
			End If
		End Using
	End Using
	
	Dim sum As Integer
	For i = 0 To sum_mas.Count
		If sum_mas(i) > sum_mas(i + 1) Then
			Dim tmp As Integer = sum_mas(i)
			sum_mas(i) = sum_mas(i + 1)
			sum_mas(i + 1) = tmp
			sum = sum_mas(i)
		End If
	Next
	
	Debug.WriteLine(sum)
	Return sum
End Function
...
Рейтинг: 0 / 0
Не удается присвоить элементу массива значение переменной
    #38606942
Сатир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile, большое спасибо. Особенно за замечания к коду. Все учту.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Не удается присвоить элементу массива значение переменной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]