Ошибка переполнения ExecuteNonQuery? - PullRequest
0 голосов
/ 25 ноября 2011

Я пытался выяснить, что не так с кодом.

Я пытаюсь сделать так, чтобы было две радиокнопки для пола, мужской и женский ...

Я хочу, чтобы при щелчке по мужской кнопке радиосвязи текст MALE сохранялся в базе данных в поле рода, которое имеет тип text, но вместо этого я получаю ошибку переполнения ...

Перед добавлением радиокнопоки поле [GENDER], все работало нормально ...

Так что, с этим можно помочь?

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace OfflineRF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string gender;

        private void button1_Click(object sender, EventArgs e)
        {
            string ORF1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\\OfflineRF.mdb";
            OleDbConnection conn = new OleDbConnection(ORF1);
            conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO OFFRF([Fname], [Lname], [NIC], [Gender], [HomeTel], [Cellphone], [Passengers], [From], [To])VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + textBox7.Text + textBox8.Text +"','"+gender+"','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + comboBox1.Text + "','" + comboBox2.Text + "')";
            cmd.ExecuteNonQuery();
            conn.Close();
            System.Windows.Forms.MessageBox.Show("Form Saved Successfully !", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            textBox6.Text = "";
            textBox7.Text = "";
            textBox8.Text = "";
            comboBox1.SelectedIndex = -1;
            comboBox2.SelectedIndex = -1;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.Text == "Karachi")
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("Sukkur");
                comboBox2.Items.Add("Hyderabad");
            }
            else if (comboBox1.Text == "Sukkur")
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("Karachi");
                comboBox2.Items.Add("Hyderabad");
            }
            else
            {
                comboBox2.Items.Clear();
                comboBox2.Items.Add("Karachi");
                comboBox2.Items.Add("Sukkur");
            }
        }

        private void Male_CheckedChanged(object sender, EventArgs e)
        {
            if (Male.Checked)
                gender = "Male";
            else
                gender = "Female";
        }

    }
}

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Помимо возможности SQL-инъекции путем добавления ваших значений в объединенную строку, вы также можете потерпеть неудачу, если кто-то введет значение имени, например «O'Conner», где кавычка в имени завершит строкуи сбросьте все остальное.

Просмотрите объект OleDbParameter и установите их.Без точного синтаксиса вы бы сделали что-то вроде

string ORF1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\\OfflineRF.mdb";
OleDbConnection conn = new OleDbConnection(ORF1);
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO OFFRF( Fname, Lname, NIC, Gender, HomeTel, "
           + "Cellphone, Passengers, [From], [To] ) VALUES "
           + "(  ?, ?, ?, ?, ?, ?, ?, ?, ? )";
// Add parameters in same ordinal position as the "?" place-holders
// the first parameter is more of generic description of WHAT it is for and 
// does NOT have to exactly match the column name, the second parameter is
// the actual value that should be put into the database.  This same context
// is used for performing other SQL actions (select, delete, update, etc)
// to help prevent SQL injection.
cmd.Parameters.Add( "valForFName", textBox1.Text );
cmd.Parameters.Add( "valForLName", textBox2.Text );
cmd.Parameters.Add( "valForNIC", textBox3.Text + textBox7.Text + textBox8.Text );
// Not sure of syntax here, but get proper text from your radio choice of gender into string
gender = YourForm.RadioForGender.SelectedItem.Text;  
cmd.Parameters.Add( "valForGender", gender );
cmd.Parameters.Add( "valHomePhone", textBox4.Text );
cmd.Parameters.Add( "valCell", textBox5.Text );
cmd.Parameters.Add( "howmany", textBox6.Text );
cmd.Parameters.Add( "forFromValue", comboBox1.Text );
cmd.Parameters.Add( "forToValue",  comboBox2.Text );
cmd.ExecuteNonQuery();
conn.Close();
1 голос
/ 25 ноября 2011

У вас есть бесконечный цикл. Когда поле со списком изменяет событие selectedindex, возникает изменение поля со списком, и событие запускается снова.

Edited ...

В конце обработчика событий кнопки вы снова изменяете поле со списком Indexes, снова вызывая бесконечный цикл запуска событий и последующий стекопоток

...