none
Visual Studio выдает сообщения при добавления новой записи в таблицу?? RRS feed

  • Вопрос

  • Здравствуйте, мне при добавления новой записи в таблицу, выпадает сообщения:

    Вот код:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MessageSender
    {
        public partial class MembersInfo : Form
        {
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ms.accdb");
    
            public MembersInfo()
            {
                InitializeComponent();
    
                LoadMembersInfo();
            }
            OleDbCommand com;
            OleDbDataAdapter adp;
            DataTable dt;
            
            public void LoadMembersInfo()
            {
                try
                {
                    dt = new DataTable();
    
                    com = new OleDbCommand("Select*from MembersInfo", con);
                    adp = new OleDbDataAdapter(com);
                    adp.Fill(dt);
    
                    dgv_MembersInfo.DataSource = dt.DefaultView;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        dt = new DataTable();
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "'))", con);
                        adp = new OleDbDataAdapter(com);
                        adp.Fill(dt);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btn_AddRecord_Click(object sender, EventArgs e)
            {
                AddRecord();
            }
    
            private void btn_Regions_Load_Click(object sender, EventArgs e)
            {
                LoadMembersInfo();
            }
    
            private void MembersInfo_Load(object sender, EventArgs e)// Подключения Combobox-a к данным таблице Regions
            {
                // TODO: данная строка кода позволяет загрузить данные в таблицу "msDataSet.Regions". При необходимости она может быть перемещена или удалена.
                this.regionsTableAdapter.Fill(this.msDataSet.Regions);
    
            }
          
           }
       }
    

    Подскажите, что в запросе не так?

    15 марта 2013 г. 17:30

Ответы

  • Вот как я на конец-то все сделал! Из помощь нашего любимого Форума :)

    1. Заполнил ComboBox:

    private void MembersInfo_Load(object sender, EventArgs e)
            {
    
                OleDbDataAdapter adap = new OleDbDataAdapter("select*from Regions", conn);
                dt = new DataTable();
                adap.Fill(dt);
                cbx_IdRegion.DataSource = dt;
                cbx_IdRegion.DisplayMember = "RegionName";
                cbx_IdRegion.ValueMember = "Region_ID";
            }

    Создал запрос:

    public void AddRecord()
            {
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectionString);
                conn.Open();
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
    
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES(@MI_ID,@Group_ID,@region_ID)", conn);
                        com.Parameters.Add("@MI_ID", OleDbType.Integer).Value = Convert.ToInt32 (txbx_MI_ID.Text);
                        com.Parameters.Add("@Group_ID", OleDbType.Integer).Value = Convert.ToInt32(txbx_Group_ID.Text);
                        com.Parameters.Add("@Region_ID", OleDbType.Integer).Value = Convert.ToInt32(cbx_IdRegion.SelectedValue.ToString());
    
                        com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                conn.Close();
            }

    Результат:






    22 марта 2013 г. 19:55

Все ответы

  • Здравствуйте, мне при добавления новой записи в таблицу, выпадает сообщения:

    Вот код:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MessageSender
    {
        public partial class MembersInfo : Form
        {
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ms.accdb");
    
            public MembersInfo()
            {
                InitializeComponent();
    
                LoadMembersInfo();
            }
            OleDbCommand com;
            OleDbDataAdapter adp;
            DataTable dt;
            
            public void LoadMembersInfo()
            {
                try
                {
                    dt = new DataTable();
    
                    com = new OleDbCommand("Select*from MembersInfo", con);
                    adp = new OleDbDataAdapter(com);
                    adp.Fill(dt);
    
                    dgv_MembersInfo.DataSource = dt.DefaultView;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        dt = new DataTable();
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "'))", con);
                        adp = new OleDbDataAdapter(com);
                        adp.Fill(dt);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btn_AddRecord_Click(object sender, EventArgs e)
            {
                AddRecord();
            }
    
            private void btn_Regions_Load_Click(object sender, EventArgs e)
            {
                LoadMembersInfo();
            }
    
            private void MembersInfo_Load(object sender, EventArgs e)// Подключения Combobox-a к данным таблице Regions
            {
                // TODO: данная строка кода позволяет загрузить данные в таблицу "msDataSet.Regions". При необходимости она может быть перемещена или удалена.
                this.regionsTableAdapter.Fill(this.msDataSet.Regions);
    
            }
          
           }
       }

    Подскажите, что в запросе не так?

    Решил проблему, убрал  ")" 

     OleDbCommand com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID)VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "')",con);

    Ну теперь новое сообщение возникает:

    ComboBox  настроен так в свойствах указано следующие:

    DataSource regionsBindingSource // таблица откуда берутся данные

    DisplayMember RegionName // отображает название регионов

    ValueMember Region_ID //соответствующее ему значение ID

    Может, я что не так настроил??

    15 марта 2013 г. 18:10
  • А почему вы при сборке insert команды два раза указали закрывающую скобку?

    И вообще, это очень плохой и опасный способ выполнять Sql-команды.  

    • Предложено в качестве ответа Naomi N 18 марта 2013 г. 17:37
    15 марта 2013 г. 21:21
  • А почему вы при сборке insert команды два раза указали закрывающую скобку?

    И вообще, это очень плохой и опасный способ выполнять Sql-команды.  

    Указал по ошибке, я уже исправил, и у меня появилось сообщения. Несоответствие типов данных в выражении условия отбора, подскажите на моем примере как правильно сделать??
    16 марта 2013 г. 11:48
  • Попробуйте поменять ваш метод на следующий

     public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "'))", con);
                        var rowcount = com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

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

    16 марта 2013 г. 17:48
  • Попробуйте поменять ваш метод на следующий

     public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "'))", con);
                        var rowcount = com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

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

    Выпадает  вот такое сообщение:


    18 марта 2013 г. 14:27
  • В коде который я скопировал и поменял была ваша изначальная ошибка, уберите закрывающийся скобку в конце запроса
    18 марта 2013 г. 16:16
  • Теперь вот это сообщение


    18 марта 2013 г. 17:27
  • Didn't we already discuss this issue in your other threads where I showed you how to use parameters? Why you're still using this wrong method?

    Please go back to that thread and use parameters.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    18 марта 2013 г. 17:38
  • public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "')", con);
                        var rowcount = com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    18 марта 2013 г. 18:17
  • public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID + "', '" + txbx_Group_ID + "' , '" + cbx_IdRegion + "')", con);
                        var rowcount = com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

    Вот как я сделал сообщения пропало:

    public void AddRecord()
            {
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        con.Open();
                        string com = string.Format("Insert INTO MembersInfo ([MI_ID], [Group_ID], [Region_ID]) VALUES('{0}','{1}','{2}')", txbx_MI_ID, txbx_Group_ID, cbx_IdRegion);
                       
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                con.Close();
            }    
           

    Ну в таблицу не чего не записалось

    18 марта 2013 г. 20:33
  • Did you now miss ExecuteNonQuery? And why you don't want to use parameters? With concatenating values directly you're opening yourself to injection attacks.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    18 марта 2013 г. 20:52
  • Did you now miss ExecuteNonQuery? And why you don't want to use parameters? With concatenating values directly you're opening yourself to injection attacks.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    Вот как я переписал метод:

    public bool AddRecord(string MI_ID, string Group_ID, string Region_ID) // Метод добавления нового дебитора в БД
    {
    bool comResult = false;

    string query = string.Format("Insert INTO MembersInfo ([MI_ID], [Group_ID], [Region_ID]) VALUES('{0}','{1}','{2}')", txbx_MI_ID, txbx_Group_ID, cbx_IdRegion);


    com = new OleDbCommand (query, con);
    try
    {
    con.Open();
    if (com.ExecuteNonQuery() == 1) // Передача новых записей в БД

    comResult = true;
    }
    catch
    {

    }

    return comResult;

    p.s  помогите мне теперь его прописать на кнопку

    18 марта 2013 г. 22:28
  • 1. Why do you need to pass parameters to the method if you don't use them?

    2. Simply add call to that method in the button's click

    3. Change that code to use OleDb parameters! Do not use String.Format for your command - this is very very bad approach!


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog


    • Изменено Naomi N 18 марта 2013 г. 22:37
    18 марта 2013 г. 22:37
  •  Вот как я сделал  выходит  сообщения:  

     private void MembersInfo_Load(object sender, EventArgs e)
            {
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connStr);
                con.Open();
    
    
                System.Data.OleDb.OleDbCommand com = new System.Data.OleDb.OleDbCommand("Select RegionName from Regions", con);
                System.Data.OleDb.OleDbDataReader myReader = com.ExecuteReader();
                while (myReader.Read())
                // Тут точка останова останавливается и дальше не проходит
                { 
                    cbx_IdRegion.Items.Add(myReader.GetString(0));
                } 
                con.Close();
    
            }
            public string GetRegionIdByRegionName(string RegionName)
            {
                string res = "";
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(connStr);
                System.Data.OleDb.OleDbCommand comm = new System.Data.OleDb.OleDbCommand("Select Region_ID from regions where RegionName = '" + RegionName + "'", con);
                con.Open();
                System.Data.OleDb.OleDbDataReader myReader = com.ExecuteReader();
                myReader.Read();
                res = myReader.GetString(0);
                con.Close();
                return res;
            }
            public void AddRecord()
            {
    
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        con.Open();
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID.Text + "', '" + txbx_Group_ID.Text + "' , '" + GetRegionIdByRegionName(cbx_IdRegion.Text) + "')", con);
                        
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                con.Close();
            }
    
            private void btn_AddRecord_Click(object sender, EventArgs e)
            {
                AddRecord();
            }
        }
    }

    Вот в этом месте точка останова не продвигается дальше

     
    // Тут точка останова останавливается и дальше не проходит
                { 
                    cbx_IdRegion.Items.Add(myReader.GetString(0));
                } 

     

    19 марта 2013 г. 17:00
  • Somehow your while Reader.Read() does not work - it usually means that the command returned 0 rows.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    19 марта 2013 г. 17:34
  • Общения возникает при этом методе

     public string GetRegionIdByRegionName(string RegionName)
            {
                string res = "";
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(connStr);
                System.Data.OleDb.OleDbCommand comm = new System.Data.OleDb.OleDbCommand("Select Region_ID from regions where RegionName = '" + RegionName + "'", con);
                con.Open();
                System.Data.OleDb.OleDbDataReader myReader = com.ExecuteReader();
                myReader.Read();
                res = myReader.GetString(0);
                con.Close();
                return res;


    19 марта 2013 г. 17:57
  • Somehow your while Reader.Read() does not work - it usually means that the command returned 0 rows.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    Вот какая записал параметры, ну не чего в таблицу не заполняется

      
     public void AddRecord()
            {
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectionString);
                conn.Open();
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
    
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES('" + txbx_MI_ID.Text + "', '" + txbx_Group_ID.Text + "' , '" + cbx_IdRegion + "')", conn);
                        //System.Data.OleDb.OleDbDataReader myReader = com.ExecuteReader();
                        com.Parameters.Add("@MI_ID", OleDbType.Integer).Value = txbx_MI_ID;
                        com.Parameters.Add("@Group_ID", OleDbType.Integer).Value = txbx_Group_ID;
                        com.Parameters.Add("@Region_ID", OleDbType.Integer).Value = cbx_IdRegion;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                conn.Close();
            }

    21 марта 2013 г. 12:01
  • Your parameters seem OK (I am not sure about the values, but that's your problem), but you forgot to change the INSERT command itself to use parameters. So, right now the above is supposed to return an error, but it doesn't since you're not calling ExecuteNonQuery method - you're not even doing that insert.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    21 марта 2013 г. 19:20
  • Вот как я на конец-то все сделал! Из помощь нашего любимого Форума :)

    1. Заполнил ComboBox:

    private void MembersInfo_Load(object sender, EventArgs e)
            {
    
                OleDbDataAdapter adap = new OleDbDataAdapter("select*from Regions", conn);
                dt = new DataTable();
                adap.Fill(dt);
                cbx_IdRegion.DataSource = dt;
                cbx_IdRegion.DisplayMember = "RegionName";
                cbx_IdRegion.ValueMember = "Region_ID";
            }

    Создал запрос:

    public void AddRecord()
            {
                String DBName = Application.StartupPath + "\\" + "ms.accdb";
                String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DBName;
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectionString);
                conn.Open();
                try
                {
                    if (MessageBox.Show("Ви дійсно хочете додати запис?", "Увага", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
    
                        com = new OleDbCommand("Insert INTO MembersInfo (MI_ID, Group_ID, Region_ID) VALUES(@MI_ID,@Group_ID,@region_ID)", conn);
                        com.Parameters.Add("@MI_ID", OleDbType.Integer).Value = Convert.ToInt32 (txbx_MI_ID.Text);
                        com.Parameters.Add("@Group_ID", OleDbType.Integer).Value = Convert.ToInt32(txbx_Group_ID.Text);
                        com.Parameters.Add("@Region_ID", OleDbType.Integer).Value = Convert.ToInt32(cbx_IdRegion.SelectedValue.ToString());
    
                        com.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                conn.Close();
            }

    Результат:






    22 марта 2013 г. 19:55
  • Glad I could help :) 

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    22 марта 2013 г. 20:16