Member 13737256 Ответов: 1

Как исправить нулевые элементы в списке хотя есть элементы на ASP.NET и еще VB.NET


Привет
Я новичок в веб-разработке. Я создаю новое веб-приложение с помощью asp.net и еще VB.net-да.

на странице, с которой я работаю, есть несколько полей, но меня беспокоит то, что я добавил код с помощью Javascript для добавления и удаления элементов из списка и в него. значения поступают из выпадающего списка.

но когда я запускаю код позади, чтобы добавить элементы списка в БД, он всегда дает мне "индекс находится вне диапазона", хотя там больше 2 элементов.

Мне действительно нужна твоя помощь.

Спасибо.

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

VB codebehind-это : ошибка возникает в цикле for.

Private Sub CmdSave_Click(sender As Object, e As EventArgs) Handles CmdSave.Click
        Try
            If RecSet.State = 1 Then RecSet.Close()
            SQL1 = "SELECT * FROM REF_Committees WHERE CommitteeId = " & Trim(TxtId.Text)
            RecSet.Open(SQL1, Conn, ADODB.CursorTypeEnum.adOpenKeyset)
            If Not RecSet.EOF Then
                SQL1 = "DELETE FROM REF_Committees WHERE CommitteeId = " & Trim(TxtId.Text) : Conn.Execute(SQL1)
            End If
            'GET VARIABLES
            Call GetValues(2) : Call GetValues(3)
            'INSERT RECORD
            SQL1 = "INSERT INTO REF_Committees VALUES ("
            SQL1 = SQL1 & Trim(TxtId.Text) & ",'" & Trim(TxtDesc.Text) & "','False'," & YearIdVar & "," & SemesterIdVar & ",'True','True'," & Application("SysUserIdVar") & ",'"
            SQL1 = SQL1 & Format(DateValue(Now.Date), "MM/dd/yyyy") & " " & Format(TimeValue(TimeOfDay), "hh:mm:ss tt") & "')"
            Conn.Execute(SQL1)
            Dim i As Integer = 0
            For i = 0 To LstMembers.Rows - 1
                If RecSet.State = 1 Then RecSet.Close()
                LstMembers.SelectedIndex = i : LstTitles.SelectedIndex = i
                SQL1 = "SELECT MemberId FROM REF_Members WHERE MemberDesc = '" & LstMembers.SelectedItem.Text & "'"
                RecSet.Open(SQL1, Conn, ADODB.CursorTypeEnum.adOpenKeyset)
                If Not RecSet.EOF Then
                    SQL1 = "INSERT INTO REF_Committees_Mem VALUES ("
                    SQL1 = SQL1 & Trim(TxtId.Text) & "," & RecSet(0).Value & ",'" & LstTitles.SelectedItem.Text & "','True','True'," & Application("SysUserIdVar") & ",'"
                    SQL1 = SQL1 & Format(DateValue(Now.Date), "MM/dd/yyyy") & " " & Format(TimeValue(TimeOfDay), "hh:mm:ss tt") & "')"
                    Conn.Execute(SQL1)
                End If
            Next
            Call CleanScreen()
        Catch ex As Exception

        End Try
    End Sub()

Javascript to add and remove items is :


        function AddMember() {
            var txtValue = document.getElementById("");
            var listBox = document.getElementById("");
            var option = document.createElement("OPTION");
            option.innerHTML = txtValue.value;
            option.value = txtValue.value;   
            var i;
            for (i = listBox.options.length - 1; i >= 0; i--) {
                if (listBox.options[i].value == txtValue.value) {
                    alert("This Member Is Already In The List");
                    return false;
                }
            }
            listBox.appendChild(option);
            txtValue.value = "";
            return AddTitle();
            return false;
        }
        function AddTitle() {
            var txtValue = document.getElementById("");
            var listBox = document.getElementById("");
            var option = document.createElement("OPTION");
            option.innerHTML = txtValue.value;
            option.value = txtValue.value;
            listBox.appendChild(option);
            txtValue.value = "";
            return false;
        }
        function DeleteMember() {
            var MemberList = document.getElementById("");
            var TitlesList = document.getElementById("");
            var i;
            for (i = MemberList.options.length - 1; i >= 0; i--) {
                if (MemberList.options[i].selected == true) {
                    MemberList.remove(i);
                    TitlesList.remove(i);
                }
            }
            return;
        }

Richard Deeming

Раз уж ты употребляешь .NET, вам следует отказаться от древнего и давно умершего "классического" ADO и переключиться на ADO.NET[^] вместо.

1 Ответов

Рейтинг:
0

OriginalGriff

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

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

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


И сделайте себе большое одолжение: не делайте код базы данных таким образом! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?