Оператор INSERT, не добавляющий никаких данных без ошибки - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь добавить объекты поездов в базу данных, чтобы сохранить их данные для сохранения.

У меня это работает, поэтому я могу добавить поезда в список.Но когда я пытаюсь настроить оператор INSERT, чтобы добавить детали объектов поезда в базу данных.ничего не добавляется в мою базу данных, когда я проверяю это после.Я нигде не получаю никаких ошибок.

Кто-нибудь может увидеть что-то не так с моим INSERT заявлением?

        //If the type combobox has Express selected
        if (cbxType.Text == "Express")
        {
            //Create a new train with its specific details
            Train train = trainFactory.TFactory("Express");
            //Checks for error when making train
            if (train == null)
                MessageBox.Show("Can't Create Train");
            else //Executes adding a new Express Train
            {
                //Stores the details of the textboxes/Combo boxes into the train details for each Train object
                train.Type = cbxType.Text;
                train.Departure = cbxDepartStation.Text;
                train.Destination = cbxDepartStation.Text;
                //Converts the time into DateTime format before passing to variable
                train.DepartureTime = TimeSpan.Parse(txtDepartureTime.Text);
                //Converts the date into DateTime format before passing to variable
                train.DepartureDay = DateTime.Parse(txtDepartureDay.Text);
                //If intermediate stops are selected. Throw exception
                if (chbPeterborough.IsChecked == true || chbDarlington.IsChecked == true ||
                            chbYork.IsChecked == true || chbNewcastle.IsChecked == true)
                {
                    throw new Exception();
                }
                //If first class radio button is checked, sets first class to true, else false
                if (chbFirstClass.IsChecked == true)
                {
                    train.FirstClass = true;
                }
                else
                {
                    train.FirstClass = false;
                }

                //Adds a train object to the train list with its specific details
                trains.add(train);

                //String to hold all the Intermediate stops together in one for displaying to user
                string intStops = string.Join(", ", train.IntermediateStop.Where(s => !string.IsNullOrEmpty(s)));

                //Sql sequence to connect to database and insert details of each train
                SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Trains.mdf;Integrated Security=True");
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "INSERT train (id, departure, destination, type, intermediate, departure_time, departure_date, sleeperBerth, firstClass) " +
                                  "VALUES ( @trainID , @departure, @destination, @type, @intermediate, @dep_time, @dep_date, @sleep, @first)";
                cmd.Parameters.AddWithValue("@trainID", train.TrainID);
                cmd.Parameters.AddWithValue("@departure", train.Departure);
                cmd.Parameters.AddWithValue("@destination", train.Destination);
                cmd.Parameters.AddWithValue("@type", train.Type);
                cmd.Parameters.AddWithValue("@intermediate", intStops);
                cmd.Parameters.AddWithValue("@dep_time", train.DepartureTime);
                cmd.Parameters.AddWithValue("@dep_date", train.DepartureDay);
                cmd.Parameters.AddWithValue("@sleep", train.SleeperBerth);
                cmd.Parameters.AddWithValue("@first", train.FirstClass);

                cmd.Connection = con;

                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Попробуйте изменить этот код

 cmd.CommandText = "INSERT train (id, departure, destination, type, intermediate, departure_time, departure_date, sleeperBerth, firstClass) " +
                              "VALUES ( @trainID , @departure, @destination, @type, @intermediate, @dep_time, @dep_date, @sleep, @first)";

на

 cmd.CommandText = "INSERT INTO train (id, departure, destination, type, intermediate, departure_time, departure_date, sleeperBerth, firstClass) " +
                              "VALUES ( @trainID , @departure, @destination, @type, @intermediate, @dep_time, @dep_date, @sleep, @first)";

Я только добавил INTO в ваш INSERT текстовый запрос

0 голосов
/ 25 ноября 2018

Весь AttachDbFileName = подход ошибочен - в лучшем случае!При запуске приложения в Visual Studio оно будет копироваться вокруг файла .mdf (из вашего каталога App_Data в выходной каталог - обычно .\bin\debug - там, где работает ваше приложение) и , наиболее вероятно ,ваш INSERT работает просто отлично - но вы просто смотрите неправильный файл .mdf в конце!

Если вы хотите придерживаться этого подхода, попробуйте поставить точку останова на вызове myConnection.Close() - и затем проверить файл .mdf в SQL Server Management Studio - я почти уверен, что ваши данные там

Реальное решение , на мой взгляд, заключается в

  1. установке SQL Server Express (и вы уже сделали это в любом случае)
  2. установить SQL Server Management Studio
  3. создать базу данных в SSMS, дать ей логическое имя (например, Trains)
  4. подключиться к ней, используя ее логическое имя базы данных (указывается при его создании на сервере) - и не связывайтесь с физическими файлами базы данных и пользовательскими экземплярами.В этом случае строка подключения будет выглядеть примерно так:

    Data Source=.\\SQLEXPRESS;Database=Trains;Integrated Security=True
    

    , а все остальное точно так же, как и раньше ...

Также см. Отличный пост в блоге Аарона Бертрана Вредные привычки: использовать AttachDbFileName для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...