Member 14621280 Ответов: 2

Как сохранить, когда richtextbox1 вводит контент в мою базу данных accessa VB.NET


ПРИВЕТ,

я успешно подключил базу данных ms access она работает нормально но

1. когда edit & save что-то в richtextbox1 это говорит обновление сделано, но когда я иду в базу данных Ms access, которая не сохраняется (то, что я редактирую или набираю)

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

Provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
        dataFile = "F:\Praise\Praise\bin\Debug\Database.accdb"
        connString = Provider & dataFile
        myConnection.ConnectionString = connString
        myConnection.Open()
        Dim str As String
        str = "Update [SONGS] set [SONG_ETITLE] = '" & TextBox2.Text & "',[SONG_TTITLE] = '" & TextBox3.Text & "',[SONG_SONGS1] ='" & RichTextBox1.Text & "',[SONG_SONGL2]='" & RichTextBox1.Text & "' Where [CODE]=" & TextBox1.Text & ""
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)


        Try

            cmd.ExecuteNonQuery()
            cmd.Dispose()
            myConnection.Close()
            MessageBox.Show("Update Done")
            TextBox1.Enabled = False
            TextBox2.Enabled = False
            TextBox3.Enabled = False
            RichTextBox1.Enabled = False

        Catch ex As Exception


        End Try
    End Sub

2 Ответов

Рейтинг:
2

Patrice T

str = "Update [SONGS] set [SONG_ETITLE] = '" & TextBox2.Text & "',[SONG_TTITLE] = '" & TextBox3.Text & "',[SONG_SONGS1] ='" & RichTextBox1.Text & "',[SONG_SONGL2]='" & RichTextBox1.Text & "' Where [CODE]=" & TextBox1.Text & ""

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Member 14621280

Так что я должен делать это?

Рейтинг:
0

OriginalGriff

Не делай этого так! Никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

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

Как только вы исправите все это на протяжении всего вашего приложения - и пропустите один, и кто - то найдет его и удалит вашу БД, - и вы можете обнаружить, что ваша проблема тоже исчезла.


Member 14621280

Я очень новичок в этом деле. Vb.net можете ли вы предложить мне вместе с кодом?

Member 14621280

Потому что я не могу понять, о чем ты говоришь.

OriginalGriff

"Concatenating strings" is the "proper" term for "adding strings together to make a bigger string" and it's very, very dangerous when you start talking to databases because you hand complete control of your DB to the user. He can do anything he likes just by typing into your text boxes because the string concatenation you use lets him. And everybody who knows anything about databases knows that - to the point where the first UK census that you could submit online got complaints because it was written properly and wasn't susceptible to SQL Injection, and it was felt that government programmers shouldn't know about that stuff! Parameterised queries prevent that:

                Using con As New SqlConnection(strConnect)
                	con.Open()
                	Using com As New SqlCommand("INSERT INTO myTable (myColumn1, myColumn2) VALUES (@C1, @C2)", con)
                		com.Parameters.AddWithValue("@C1", myValueForColumn1)
                		com.Parameters.AddWithValue("@C2", myValueForColumn2)
                		com.ExecuteNonQuery()
                	End Using
                End Using

Member 14621280

Использование con в качестве нового SqlConnection(strConnect)
против.Открыть()
Используя com как новая команда sqlcommand("вставить в песни (SONG_ETITLE, SONG_TITLE) значения (@SONG_SONGS1, @SONG_SONGS2)", кон)
ком.Параметры.AddWithValue ("@SONG_SONGS1", RichTextBox1.Text)
ком.Параметры.AddWithValue ("@SONG_SONGS2", RicTextBox1.Text)
ком.Метод executenonquery()
Конец Использования


Правильно ли это?

OriginalGriff

Две вещи:
1) Почему вы вставляете один и тот же текст дважды? (Предполагая, что "RicTextBox1.Text" является ошибочным типом "RichTextBox1.Text".)
2) прекратите использовать все прописные буквы: используйте CamelCase для ваших полей и таблиц и не ставьте префикс своим полям с именем таблицы (возможно, вам придется сделать это по-настоящему позже, и тогда вы получите SONGS.SONG_TITLE что начинает становиться глупым и очень избыточным).

INSERT INTO Songs (ETitle, Title) VALUES (@ETITLE, @TITLE)

Member 14621280

На самом деле у меня есть два разных столбца, таких как Title1 и Title2 (SONGS_ETITLE и SONGS_TTITLE в столбце базы данных Ms access), и у меня есть в SONG_SONGS1 и SONG_SONGS2, который является longtext ....

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

OriginalGriff

Почему вы сохраняете одни и те же данные дважды? Никогда не храните избыточную информацию - если поля ETITLE и TITLE загружаются данными из одного источника, вы дублируете информацию, и это всегда плохая идея!

Member 14621280

Использование con в качестве нового SqlConnection(strConnect)
кон.Открыть()
Используя com как новая команда sqlcommand("вставить в песни (SONG_ETITLE, SONG_TITLE) значения (@ETITLE, @раздел)", кон)
com.параметры.AddWithValue ("@SONG_SONGS1", RichTextBox1.Text)
ком.Метод executenonquery()
Конец Использования

Надеюсь, это coreect

OriginalGriff

Перестаньте гадать и начинайте думать!
Да ладно, это совсем не сложно ... но вы просто бросаете вещи вместе и надеетесь, что это сработает, и это не жизнеспособная стратегия развития.

Member 14621280

Импортирует System.Data.Для oledb

Публичный Список Песен Класса
Дим Поставщика Как Строку
Dim файл данных в виде строки
Dim ds как новый набор данных
Dim da как новый OleDb.OleDbDataAdapter
Dim Sql Как Строка
Тусклый Путь Как Строка
Dim connString как строка
Dim con как новое OleDbConnection

Dim myConnection As OleDbConnection = New OleDbConnection

Частная собственность cmd As OleDbCommand

Частная суб SongsList_Load(отправителя как объект, а равно EventArgs) обрабатывает ключевое слово mybase.Загрузить
против.Параметр ConnectionString = "Поставщика=Майкрософт.Туз.Oledb для.12.0;Источник данных=Ф:\хвалить\хвалить\бин\отладки\базе.# то # "
'TODO: эта строка кода загружает данные в таблицу 'DatabaseDataSet.SONGS'. Вы можете переместить или удалить его, если это необходимо.

Я.SONGSTableAdapter.Заполните(Me.DatabaseDataSet.SONGS)
Me.KeyPreview = True
Меня.DataGridView1.Обновить()


Конец Подводной Лодки

Частная суб TextBox4_TextChanged(отправителя как объект, а равно EventArgs) обрабатывает TextBox4.Очередь textchanged
против.Открыть()
Дим ДТ в качестве нового объекта DataTable
Dim ds как новый набор данных
ДС.столы.Добавить(dt)
Дим да как новый OleDbDataAdapter
da = New OleDbDataAdapter("Select * from SONGS where CODE like ?", con)
да.Команды selectcommand.Параметры.AddWithValue("код", "%" &амп; TextBox4.Текст и усилитель; "%")
да.Заполнить(ДТ)



DataGridView1.Источник данных = ДТ.DefaultView

против.Закрывать()
Конец Подводной Лодки

Частная суб TextBox5_TextChanged(отправителя как объект, а равно EventArgs) обрабатывает TextBox5.Очередь textchanged
против.Открыть()
Дим ДТ в качестве нового объекта DataTable
Dim ds как новый набор данных
ДС.столы.Добавить(dt)
Дим да как новый OleDbDataAdapter
da = New OleDbDataAdapter("Select * from SONGS where SONG_ETITLE like ?", con)
да.Команды selectcommand.Параметры.AddWithValue("код", "%" &амп; TextBox5.Текст и усилитель; "%")
да.Заполнить(ДТ)


DataGridView1.Источник данных = ДТ.DefaultView


против.Закрывать()
Конец Подводной Лодки

Частная суб TextBox6_TextChanged(отправителя как объект, а равно EventArgs) обрабатывает TextBox6.Очередь textchanged
против.Открыть()
Дим ДТ в качестве нового объекта DataTable
Dim ds как новый набор данных
ДС.столы.Добавить(dt)
Дим да как новый OleDbDataAdapter
da = New OleDbDataAdapter("Select * from SONGS where SONG_TTITLE like ?", con)
да.Команды selectcommand.Параметры.AddWithValue("код", "%" &амп; TextBox6.Текст и усилитель; "%")
да.Заполнить(ДТ)


DataGridView1.Источник данных = ДТ.DefaultView


против.Закрывать()
Конец Подводной Лодки

Private Sub Button10_Click(sender As Object, e As EventArgs) обрабатывает Button10.Щелчок
SONGSBindingSource.MovePrevious()

Конец Подводной Лодки

Private Sub Button12_Click(sender As Object, e As EventArgs) обрабатывает Button12.Click
SONGSBindingSource.метод MoveNext()

Конец Подводной Лодки

Private Sub Button11_Click(sender As Object, e As EventArgs) обрабатывает Button11.Click
SONGSBindingSource.MoveFirst()
Конец Подводной Лодки

Private Sub Button13_Click(sender As Object, e As EventArgs) обрабатывает Button13.Click
SONGSBindingSource.MoveLast()

Конец Подводной Лодки

Private Sub DataGridView1_CellContentDoubleClick(отправитель как объект, e Как DataGridViewCellEventArgs) обрабатывает DataGridView1.CellContentDoubleClick
Тусклая форма как новые песни.
Форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(0).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(1).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(2).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(3).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(0).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(1).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(2).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(3).Значение.Метод toString()
form.RichTextBox3.Text = DataGridView1.CurrentRow.Ячейки(4).Значение.Метод toString()


Меня.Обновление()
Освежить()
form.Sh

OriginalGriff

:вздыхать:
Посмотри на этот код. Пожалуйста, взгляните на него.
Как вы думаете, что это делает?
Форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(0).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(1).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(2).Значение.Метод toString()
форма.Richtextbox1 отображение.Текст = DataGridView1.CurrentRow.Ячейки(3).Значение.Метод toString()
Или вот это?
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(0).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(1).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(2).Значение.Метод toString()
form.RichTextBox2.Text = DataGridView1.CurrentRow.Ячейки(3).Значение.Метод toString()

И это игнорирование того, что делает все остальное ... Вы знаете, что можно фильтровать представление вместо того, чтобы каждый раз возвращаться к базе данных? И что это на целый груз быстрее?

Серьезно, вам нужно перестать гадать, что вы делаете - и перестать использовать имена VS по умолчанию для всего! Возможно, вы помните, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...

А ваш пользовательский интерфейс ... по крайней мере 12 кнопок? 6 текстовых полей? Ваш пользовательский интерфейс - и помните, что я его не вижу - уже звучит как полный беспорядок. Когда вы видели такой пользовательский интерфейс в "реальном приложении"?

Member 14621280

На самом деле это церковные песнопения программного обеспечения... и richtextbox1 отображение будет показывать один lanugange т. е. тамильском и Richtextbox2 покажет один язык, т. е. английский

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

Member 14621280

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) обрабатывает btnUpdate.Щелчок
про = поставщик = "поставщика=Майкрософт.Туз.Oledb для.12.0;Источник данных=Ф:\хвалить\хвалить\бин\отладки\базе.# то # "
connString = pro
myConnection.ConnectionString = connString
myConnection.Открыть()
команда = "песни обновление комплект [SONG_ETITLE]='" &амп; поле textbox2.Текст &ампер; "',[SONG_TTITLE]='" &амп; поле textbox2.Текст &ампер; "',[SONG_SONGS1]='" &амп; richtextbox1 отображение.Текст &ампер; "', где [код]=" &амп; текстовое поле textbox1.Текст и усилитель; ""
Дим УМК как объект oledbcommand = новый объект oledbcommand(команда, myConnection)
MsgBox("Обновление Успешно")
Попробуй
УМК.Метод executenonquery()
УМК.Располагать()
myConnection.Закрывать()
Текстовое поле textbox1.Включен = Ложь
Поле textbox2.Включен = Ложь
Textbox3 и.Включен = Ложь
Richtextbox1 отображение.Включен = Ложь

Поймать ex как исключение
С помощью MsgBox(исх.Сообщение)

Конец Попытки
Конец Подводной Лодки

Я пробовал это сделать, но безрезультатно....


Дополнительная погрешность говорит: свойство connectionString не инициализировано