Проблема с вставкой MySQL / C #

#c# #mysql

#c# #mysql

Вопрос:

Не уверен, что с этим не так

 //Setup MySQL
    private MySqlConnection datconnection = new MySqlConnection();
    //private MySqlDataAdapter datdata = new MySqlDataAdapter();
    DataGrid datgridInfo = new DataGrid();
    int connect;
    private Form_NewEnquiry frm_parent;

    public Form_AddVenue(Form_NewEnquiry frm1)
    {
        InitializeComponent();
        frm_parent = frm1;
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        connect = 0;
        try
        {
                datconnection.ConnectionString =
                "server=127.0.0.1;"
                  "database=as;"
                  "uid=a;"
                  "password=a;";
                connect = 1;
        }
        catch (Exception)
        {
            MessageBox.Show("Connection Unavailable");
        }


        //INSERT SQL Code to Insert Venue
        if (connect == 1)
        {
            try
            {
                datconnection.Open();
                MySqlCommand command = new MySqlCommand("INSERT INTO venues (venue_name,venue_address1,venue_address2,venue_town,venue_county,venue_postcode,venue_telephone,venue_fax,venue_email,venue_web,venue_maxguests) VALUES (?,?,?,?,?,?,?,?,?,?,?)", datconnection);
                command.Parameters.Add("name", MySqlDbType.VarChar, 45, tbName.Text.ToString());
                command.Parameters.Add("address1", MySqlDbType.VarChar, 45, tbAddress1.Text.ToString());
                command.Parameters.Add("address2", MySqlDbType.VarChar, 45, tbAddress2.Text.ToString());
                command.Parameters.Add("town", MySqlDbType.VarChar, 45, tbTown.Text.ToString());
                command.Parameters.Add("county", MySqlDbType.VarChar, 45, tbCounty.Text.ToString());
                command.Parameters.Add("postcode", MySqlDbType.VarChar, 10, tbPostcode.Text.ToString());
                command.Parameters.Add("telephone", MySqlDbType.VarChar, 15, tbTelephone.Text.ToString());
                command.Parameters.Add("fax", MySqlDbType.VarChar, 15, tbFax.Text.ToString());
                command.Parameters.Add("email", MySqlDbType.VarChar, 255, tbEmail.Text.ToString());
                command.Parameters.Add("web", MySqlDbType.VarChar, 255, tbWeb.Text.ToString());
                command.Parameters.Add("maxguests", MySqlDbType.Int32, 11, nudNoOfGuests.Value.ToString());
                command.ExecuteNonQuery();
                //datdata.InsertCommand = command;
            }
            catch (Exception eea)
            {
                MessageBox.Show("Error storing data");
                MessageBox.Show(eea.ToString());
                connect = 0;
            }
            finally
            {
                datconnection.Close();
            }
        }
        if (connect == 1)
        {
            MessageBox.Show("Data Saved");

            //Print

            //Close Window
            frm_parent.reloadVenue();
            this.Close();
        }
    }
  

Это выдает мне системную ошибку.Исключение FormatException: Индекс (основанный на нуле) должен быть больше или равен нулю и меньше размера списка аргументов.

Комментарии:

1. какая строка выдает исключение?

2. На command.ExecuteNonQuery();

3. Я исправил это, просто закодировав строку SQL без команды. Параметры. Добавить (вместо этого строка SQL содержит объединенные значения. Я знаю, что при этом существует риск внедрения SQL, однако это всего лишь небольшая внутренняя система.

Ответ №1:

Похоже, что размер некоторых данных больше, чем размер указанного вами параметра. например

 command.Parameters.Add("name", MySqlDbType.VarChar, 45, tbName.Text);
  

это размер tbName.Текстовая строка меньше 45. как насчет использования

 command.Parameters.Add("name", MySqlDbType.VarChar, tbName.Text.Length, tbName.Text);
  

Комментарии:

1. Здравствуйте, спасибо за это — однако при изменении выдается та же ошибка. Я использовал здесь статические длины, поскольку это длина MySQL, поэтому генерирую правильное исключение, когда значения длиннее, чем примет MySQL.

Ответ №2:

Вам не нужен toString() в свойстве Text, это уже строка, пожалуйста, избегайте этого.

Также

 command.Parameters.Add("maxguests", MySqlDbType.Int32, 11, nudNoOfGuests.Value.ToString())
  

Ожидается ввод параметра int, и вы передаете строку, пожалуйста, используйте Convert.ToInt32 для передачи значения.

Обычно эти ошибки возникают из-за разницы в количестве объявленных и переданных команде параметров, но в вашем случае все в порядке. Какой тип элемента управления — nudNoOfGuests, возможно, это вызывает ошибку формата

Комментарии:

1. Привет, спасибо за вашу помощь — однако значение . toString () должен быть там в качестве параметров. Add всегда ожидает, что 4-й параметр будет строкой. Изменение этого на command.Parameters.Add("maxguests", MySqlDbType.Int32, 11, 10); выдает «Аргумент 4 не удается преобразовать из int в string», однако я согласен, что toString () не требуется для текстового свойства — сила habbit

2. Итак, nudNoOfGuests возвращает допустимое значение?

3. Да — Однако даже при жестком кодировании строка целого числа в этом не выполняется

4. Можете ли вы попробовать то же самое, изменив параметры как ?name,?address1,?address2 … и так далее