ExecuteNonQuery работает, но изменения не сохраняются

вот код, над которым я работаю;

 public partial class Form2 : Form
{
    SqlConnection sc = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True");
    SqlDataAdapter sda;
    SqlCommand command;
    SqlCommand commands;
    public Form2()
    {
        InitializeComponent();
    }

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

    private void button1_Click(object sender, EventArgs e)
    {
        command = new SqlCommand(@"SELECT * FROM [Table] WHERE email='" + textBox4.Text + "'", sc);
        sda = new SqlDataAdapter(command);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        int i = ds.Tables[0].Rows.Count;
        if (i == 1)

            MessageBox.Show("Email Already Taken");
        else
        {
            sc.Open();
            command = new SqlCommand("INSERT INTO [Table](name,surname,yearofbirth,adress_home_city,adress_home_block,adress_home_street,adress_work_city,adress_work_block,adress_work_street,email,password) VALUES('"+textBox1.Text+"','"+textBox2.Text+ "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox7.Text + "','" + textBox10.Text + "','" + textBox11.Text + "','" + textBox8.Text + "','" + textBox9.Text + "','" + textBox6.Text + "') ", sc);

            command.ExecuteNonQuery();
            sc.Close();
            MessageBox.Show("Success");

        }

он работает, когда я отлаживаю его, это форма регистрации, и я могу войти в систему с информацией, которую я даю в этой форме.

но при закрытии эта команда вставки, которую я делаю, не сохраняется в моей базе данных.

// Дополнительная информация ;

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


person M.Karavural    schedule 17.05.2017    source источник
comment
я надеюсь, что вы проверяете правильную базу данных, Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True, это не та база данных, которая открывается из студии управления напрямую.   -  person Abhimanyu Ghei    schedule 17.05.2017
comment
Используйте параметры, чтобы избежать ошибок SQL-инъекций и форматирования. У вас действительно есть таблица с именем Table? ExecuteNonQuery вернет количество затронутых строк в случае успеха. Вы, вероятно, смотрите на копию базы данных — посмотрите на настройки свойства подключения.   -  person LarsTech    schedule 17.05.2017
comment
как это работает, но не сохраняет?. Это просто не работает?   -  person NicoRiff    schedule 17.05.2017
comment
я действительно назвал свою таблицу table: D и это правильная база данных. я сделал несколько тестовых строк в своей базе данных, и они также работают на моем экране входа в систему.   -  person M.Karavural    schedule 17.05.2017
comment
AttachDbFilename=|DataDirectory|\Database1.mdf; это ваше фактическое имя базы данных, которое вам нужно прикрепить к студии управления сервером sql, чтобы проверить значения в таблице, или вы можете изменить источник базы данных на некоторую базу данных, которая уже подключена к SSMS   -  person Abhimanyu Ghei    schedule 17.05.2017
comment
я не использую ssms, я напрямую создал базу данных на основе службы, добавив параметр файла, создал там свои столбцы и подключился к моему коду. и @NicoRiff, он работает так, как я хотел, прямо сейчас, когда работаю, регистрирую пользователя, и с этой информацией о новых пользователях я могу войти в систему. но когда я закрываю и снова открываю свое приложение, эти новые пользователи не сохраняются.   -  person M.Karavural    schedule 17.05.2017
comment
В VS 2015 проверяются исключения времени выполнения Commom Language? вы можете проверить его, перейдите к Отладка ›› Windows › › Настройки исключений ››, если Исключения среды выполнения Commom Language не отмечены, поэтому проверьте его и попробуйте отладить, есть ли какие-либо исключения?   -  person jonathana    schedule 17.05.2017
comment
@jonathana проверено, никаких исключений, никаких ошибок не получено.   -  person M.Karavural    schedule 17.05.2017
comment
Можно ли использовать профилировщик, чтобы проверить, отправляется ли какая-либо команда удаления при перезапуске приложения? Используете ли вы фреймворк сущностей?   -  person Abhimanyu Ghei    schedule 17.05.2017
comment
@LarsTech хорошо, возможно, я просто копирую базу данных, использую ее, когда она работает, и уничтожаю ее при закрытии, в этом есть смысл. но что я должен написать в своем sqlconnection?   -  person M.Karavural    schedule 17.05.2017
comment
@AbhimanyuGhei я новичок и не могу использовать, извините. но я думаю, что это ничего не удаляет, возможно, я просто ошибся в строке подключения, но не могу решить :(   -  person M.Karavural    schedule 17.05.2017
comment
Вы говорите, что когда я пытаюсь снова, я получаю ту же информацию, что и уже принятое сообщение. Со второй попытки запись находится в базе данных с первой попытки для того же письма с уже принятым сообщением. Извините, если я читаю это неправильно.   -  person Johnny Fitz    schedule 17.05.2017
comment
@JohnnyFitz да, точно. электронная почта, уже принятая сообщение, является доказательством сохранения. но когда он закрыт, он не отображается в моей базе данных.   -  person M.Karavural    schedule 17.05.2017
comment
Вы можете повторно зарегистрироваться, используя тот же идентификатор электронной почты после закрытия и перезапуска приложения?   -  person Abhimanyu Ghei    schedule 17.05.2017
comment
@AbhimanyuGhei да, я могу зарегистрироваться с той же информацией   -  person M.Karavural    schedule 17.05.2017
comment
SqlConnection не должен быть полем. Это должна быть локальная переменная, и вы должны следовать одному из двух правильных шаблонов для IDisposable объект.   -  person mason    schedule 17.05.2017
comment
@ М.Каравурал, пожалуйста, проверьте ответ   -  person Abhimanyu Ghei    schedule 17.05.2017


Ответы (1)


Проблема заключается в том, что ваш файл mdf заменяется пустым при перестроении, т. е. ваш файл mdf копируется в папку отладки каждый раз, когда вы перестраиваете приложение и, таким образом, удаляете все данные, которые были вставлены ранее.

Решение

  1. Не включайте файл mdf в решение.
  2. Укажите полный путь (например, AttachDbFilename=C:\Database1.mdf;) или относительный путь к файлу mdf в строке подключения.

SqlConnection sc = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Database1.mdf;Integrated Security=True");

  1. Если вы включаете файл mdf в решение, измените свойство «Копировать в выходной каталог» на «Не копировать».
  2. Используйте базу данных с вашего локального экземпляра сервера MSSQL вместо указания на файл mdf, если это возможно (MS SQLExpress бесплатен).

Эта проблема возникнет только в том случае, если вы запустите свое приложение из визуальной студии, если вы запускаете приложение несколько раз из папки отладки/выпуска напрямую, приложение будет работать нормально, поскольку оно не перестраивается, и поэтому файл mdf не заменяется.

person Abhimanyu Ghei    schedule 17.05.2017
comment
Хорошо, это работает прямо сейчас: D, это был ответ, спасибо, чувак - person M.Karavural; 18.05.2017
comment
Рад помочь, не могли бы вы отметить ответ как правильный. :) - person Abhimanyu Ghei; 19.05.2017