Как исправить кнопку сохранения - PullRequest
0 голосов
/ 17 февраля 2019

Я написал код для моего удовольствия.у меня есть доступ к файлу данных "MDB", и я показываю его на gridview из gridview, я выбираю строку и отображается в текстовом поле.я редактирую текстовое поле и пытаюсь нажать на кнопку Сохранить и покажу мне сообщение об ошибке.что я делаю не так?Кнопка «Сохранить» не сохраняла и не отображала сообщение об ошибке.

Добавление изображений и мой код:

Ошибка: сообщение

gridview + 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 System.Data.OleDb;

namespace Center image description hereDHW
{
    public partial class Form2 : Form
    {
        private OleDbConnection connection = new OleDbConnection();
        public Form2()
        {
            InitializeComponent();
            connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\RBA\Desktop\123\users1.mdb;
Persist Security Info=False;";
        }

        private void button9_Click(object sender, EventArgs e)
        {
            this.Close();
            Form1 f1 = new Form1();
            f1.Show();

        }


        private void btn_save_Click(object sender, EventArgs e)
        {
            try
            {
                connection.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connection;
                command.CommandText = "insert into GRL1 (NoBoard,Site,Group,Kind,Unit) values ('" + txt_noboard.Text + "','" + txt_site.Text + "','" + txt_group.Text + "','" + txt_kind.Text + "','" + txt_unit.Text + "',)";

                command.ExecuteNonQuery();
                MessageBox.Show("Data Saved");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error  " + ex);
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'users1DataSet.GRL1' table. You can move, or remove it, as needed.
            this.gRL1TableAdapter.Fill(this.users1DataSet.GRL1);

        }

        private void btn_loadGR_Click(object sender, EventArgs e)
        {
            try
            {
                connection.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connection;
                string query = "select * from GRL1";
                command.CommandText = query;

                OleDbDataAdapter da = new OleDbDataAdapter(command);
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;

                connection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error  " + ex);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                connection.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connection;
                string query = "select * from GRS1";
                command.CommandText = query;

                OleDbDataAdapter da = new OleDbDataAdapter(command);
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;

                connection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error  " + ex);
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];

                txt_noboard.Text = row.Cells[0].Value.ToString();
                txt_site.Text = row.Cells[1].Value.ToString();
                txt_group.Text = row.Cells[2].Value.ToString();
                txt_kind.Text = row.Cells[3].Value.ToString();
                txt_unit.Text = row.Cells[4].Value.ToString();
                txt_com.Text = row.Cells[5].Value.ToString();
            }
        }


    }
}

1 Ответ

0 голосов
/ 17 февраля 2019

У вас есть опечатка в тексте sql.Перед запятой стоит запятая.Но есть также ошибка, вызванная использованием зарезервированного ключевого слова в MS-Access (Group).Вам нужно заключить квадратные скобки вокруг этого имени.

Наконец, не используйте конкатенацию строк для построения команд sql, но всегда используйте параметры.
Это позволяет избежать взломов sql-инъекций и устранить проблему с анализом ваших входных данных (например,если во входном тексте есть одинарная кавычка, весь запрос снова не будет выполнен с синтаксической ошибкой)

private void btn_save_Click(object sender, EventArgs e)
{
    try
    {
        using(OleDbConnection connection = new OleDbConnection(....con string...))
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            // Notice how Group field is between square brackets.
            // If you can I suggest to change the name of this field
            string cmdText = @"insert into GRL1 (NoBoard,Site,[Group],Kind,Unit) 
                          values (@nob, @sit, @grp, @knd, @uni)";
            command.CommandText = cmdText;
            // Is NoBoard an integer? If yes you should pass an integer not a string
            command.Parameters.Add("@nob", OleDbType.Integer).Value = Convert.ToInt32(txt_noboard.Text);
            command.Parameters.Add("@sit", OleDbType.VarWChar).Value = txt_site.Text;
            command.Parameters.Add("@grp", OleDbType.VarWChar).Value = txt_group.Text;
            command.Parameters.Add("@knd", OleDbType.VarWChar).Value = txt_kind.Text;
            command.Parameters.Add("@uni", OleDbType.VarWChar).Value = txt_unit.Text;
            command.ExecuteNonQuery();
            MessageBox.Show("Data Saved");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error  " + ex);
    }
}

Коллекция параметров заполняется значениями, необходимыми для текста вашего запроса.Обратите внимание, что я не знаю точно тип данных ваших столбцов в базе данных.Параметр OleDbType должен точно соответствовать ожидаемым типам, чтобы избежать исключений несоответствия типов

Последний совет.Соединения должны быть созданы, открыты и закрыты при необходимости.Не сохраняйте глобальный объект соединения.Вы не получаете большого прироста производительности, потому что ADO.NET использует технику, называемую Connection Pooling

...