ArronLawy Ответов: 1

Метода executereader: свойство Connection не инициализировано в C#


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.SqlClient;

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

        
        String cnStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDB.mdf;Integrated Security=True;Connect Timeout=30";

        
        private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnection cn = new SqlConnection(cnStr);           
            SqlDataAdapter da = new SqlDataAdapter("SELECT * From Employee", cn);
            DataSet ds = new DataSet();    
            da.Fill(ds);                       
            dataGridView1.DataSource = ds.Tables[0]; 
        }

        
        private void BtnAdd_Click(object sender, EventArgs e)
        {
            try
            {               
                SqlConnection cn = new SqlConnection(cnStr);
                cn.Open();
                SqlCommand cmd = new SqlCommand();  
                                                    
                cmd.CommandText =
                  "INSERT INTO Employee(Employee id,Name,Sex,Salary)VALUES(N'" +
                  TxtId.Text.Replace("'", "''") + "',N'" +
                  TxtName.Text.Replace("'", "''") + "',N'" +
                  CboSex.Text + "'," +
                  TxtSalary.Text + ")";
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();       
                Form1_Load(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        
        private void BtnUpdate_Click(object sender, EventArgs e)
        {
            try    
            {
                SqlConnection cn = new SqlConnection(cnStr);
                cn.Open();
                SqlCommand cmd = new SqlCommand();
               
                cmd.CommandText = "UPDATE Employee SET Name=N'" +
                  TxtName.Text.Replace("'", "''") + "', Sex=N'" +
                  CboSex.Text + "', Salary=" +
                  TxtSalary.Text + " WHERE Employee id=N'" +
                  TxtId.Text.Replace("'", "''") + "'";
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                Form1_Load(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

       
        private void BtnDel_Click(object sender, EventArgs e)
        {
            try    
            {
                SqlConnection cn = new SqlConnection(cnStr);
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                
                cmd.CommandText = "DELETE FROM Employee WHERE Employee id=N'" +
                  TxtId.Text.Replace("'", "''") + "'";
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                Form1_Load(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 private void BtnSelect_Click(object sender, EventArgs e)
        {
            string sql = "SELECT * From Employee where Employee id = @Employee id";
            try
            {
                using (SqlConnection cn = new SqlConnection(cnStr))
                    cn.Open();
                {
                    using (SqlCommand cmd = new SqlCommand(sql,cn))
                    {
                        cmd.Parameters.AddWithValue("@Employee", TxtId.Text);
                        cmd.ExecuteReader();
                        Form1_Load(sender, e);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }



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

Hi, 
so this error popped-up after I compiled my sql database code when I trying to use a button_click event to search for employee data
(I'm using C# windows form application)

I've been sitting here for 2 hours without a solution,and I don't know what's wrong with it.

Thanks in advance!

1 Ответов

Рейтинг:
11

OriginalGriff

Две вещи:

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

2) Ваш cn.Open должно быть заключено в фигурные скобки:
using (SqlConnection cn = new SqlConnection(cnStr))
    cn.Open();
{
    using (SqlCommand cmd = new SqlCommand(sql,cn))
    {
        cmd.Parameters.AddWithValue("@Employee", TxtId.Text);
        cmd.ExecuteReader();
        Form1_Load(sender, e);
    }
}
Как бы то ни было, cn вы создаете в using блок происходит автоматически Closed и Disposed сразу же это происходит Opened.

using (SqlConnection cn = new SqlConnection(cnStr))
{
    cn.Open();
    using (SqlCommand cmd = new SqlCommand(sql,cn))
    {
        cmd.Parameters.AddWithValue("@Employee", TxtId.Text);
        cmd.ExecuteReader();
        Form1_Load(sender, e);
    }
}