Liu Lily Ответов: 1

C# как вставлять и искать данные в testbox в базе данных


Здравствуйте, я создаю интерфейс, который позволяет пользователю вводить или искать имя субъекта.

 SubjectName
Accounting
Biology
Bussiness
Computer Science
Computing
English
Law
Maths


Проблема в том, что если я попытаюсь ввести новое имя субъекта, то появится ошибка
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.' on program.cs



и еще один вопрос-как вставить новое имя субъекта в базу данных, добьюсь ли я этого на кнопке btnNext? как textbox может выполнить поиск имени из базы данных или вставить новое имя субъекта

Есть идеи? Спасибо

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;


namespace ProjectInterface
{
    public partial class Concept : Form
    {

        MySqlConnection con = new MySqlConnection("server=localhost;Database=databse;Port = 3306; User ID = root; Password = password123");
        MySqlCommand cmd = new MySqlCommand();

        public Concept()
        {
            InitializeComponent();
        }



        private void btnNextC_Click(object sender, EventArgs e)
        {
            con.Open();

      

            string newcon = "Insert into tutorials(TutorialName) VALUES ('" + txtTuName.Text + " ')";

            MySqlCommand cmd = new MySqlCommand(newcon, con);
            cmd.ExecuteNonQuery();



            this.Hide();
            Home home = new Home();
            home.Show();

            //next - go t oquestionnaire page
            //this.Hide();
            //Questionnaire q = new Questionnaire();
            //q.Show();

        }
        private void btnCancelC_Click(object sender, EventArgs e)
        {
            //cancel button - go back to home page.
            this.Hide();
            Home home = new Home();
            home.Show();
        } 

        private void Concept_Load(object sender, EventArgs e)
        {

        }

        private void txtSubject_TextChanged(object sender, EventArgs e)
        {
            con.Open();
  
            
            MySqlCommand cmd = new MySqlCommand("SELECT  SubjectName From databse.subject WHERE SubjectName LIKE @name",con);
            cmd.Parameters.Add(new MySqlParameter("@name", "%" + txtSubject.Text + "%"));

            MySqlDataReader dr = cmd.ExecuteReader();

            AutoCompleteStringCollection subjectColl = new AutoCompleteStringCollection();

            while (dr.Read()) { 
                subjectColl.Add(dr.GetString(0));
             }
            
            txtSubject.AutoCompleteCustomSource = subjectColl;
            con.Close();


        }

   }

j snooze

Эта ошибка может быть вызвана платформой, которую вы выбрали для компиляции приложения как. x86, 64 или любой другой процессор. Кроме того, я бы рекомендовал использовать параметризованный запрос для вашей вставки, как вы это делаете в операторе select.

Richard Deeming

string newcon = "Insert into tutorials(TutorialName) VALUES ('" + txtTuName.Text + " ')";


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Вы уже знаете, как использовать параметры, так как вы делаете это правильно в txtSubject_TextChanged метод.

1 Ответов

Рейтинг:
0

saimanisha

у меня есть вопрос, Хотите ли вы выполнить оба действия над одним и тем же текстовым полем .например, вы пытаетесь вставить имя sub и в то же время пытаетесь искать предметы, которые есть в базе данных .вы должны проанализировать, какой сценарий подходит для вашего приложения.
ошибка заключается в том, что при попытке вставить данные в базу данных вы написали cimmand для выбора субъекта, который есть в базе данных.я предлагаю вам выполнить это только тогда, когда действие будет сделано.
сначала вы пытаетесь выполнить выбор данных из базы данных n check for match .

если (совпадение)
{
//здесь вы показываете совпадающие предметы
}
иначе если(!матч)
{
//здесь вы позволяете пользователю добавить конкретный предмет и сохранить любую кнопку или что-то для выполнения действия по вставке .когда совпадения не происходит, если вы хотите вставить эту функцию, она будет работать.отобразите элемент управления, например кнопку или флажок, и нажмите на него, а затем напишите код для вставки.когда вставка будет выполнена успешно.сделай его невидимым.
}


Liu Lily

да, я хочу, чтобы оба действия были выполнены в текстовом поле. Спасибо!! Я воспользовался доктором.Есть что проверить

MySqlDataReader dr = cmd.Метода executereader();
если (dr.HasRows)
{
AutoCompleteStringCollection subjectColl = новый AutoCompleteStringCollection();

в то время как (dr.Read())
{
subjectColl.Add(dr.GetString(0));
}
txtSubject.AutoCompleteCustomSource = subjectColl;
}
еще
{
// вставить новое имя в базу данных

}

В графическом интерфейсе у меня была кнопка "Далее", это означает, что когда пользователь нажмет кнопку, имя субъекта будет сохранено в таблице субъекта, я знаю, как вставить новый метод subject on Button, но я понятия не имею, как написать код на else(!match). Спасибо!

CHill60

То if(!match) после else быть бессмысленным.