Мой метод вставки в базу данных вставляет пустые значения вместо заполненных C#

#c# #sql #oop

#c# #sql #ооп

Вопрос:

У меня возникла проблема с вставкой записи в мою локальную базу данных. Он вставляет пустые значения вместо фактических заполненных значений. Я считаю, что существует проблема с моими классами и передачей значений между различными методами. Я создал библиотеку, в которой я храню свою табличную модель базы данных под названием Контакты, в которой есть такие поля, как имя, фамилия, номер телефона и т.д. Затем у меня есть мой AddContact() метод в Program.cs, который проверяет пользовательский ввод и присваивает переданные пользователем строки свойствам моей модели. Затем я, наконец, вызываю другой метод, который должен вставить запись на основе SQL-запроса.

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

Примечание: Я не вставляю значение ID, потому что я устанавливаю автоинкремент для ContactID.

Вот моя модель:

 namespace ContactsLibrary.Model
{
    public class ContactModel
    {
        string firstName, lastName, nickName, companyName, phoneNumber, emailAddress, urlAddress, birthdayDate, notes;

        public string FirstName { get => firstName; set => firstName = value; }
        public string LastName { get => lastName; set => lastName = value; }
        public string NickName { get => nickName; set => nickName = value; }
        public string CompanyName { get => companyName; set => companyName = value; }
        public string PhoneNumber { get => phoneNumber; set => phoneNumber = value; }
        public string EmailAddress { get => emailAddress; set => emailAddress = value; }
        public string UrlAddress { get => urlAddress; set => urlAddress = value; }
        public string BirthdayDate { get => birthdayDate; set => birthdayDate = value; }
        public string Notes { get => notes; set => notes = value; }
    }
}
  

Вот моя программа.cs методы:

 static void AddContact()
        {
            CheckUserAddContactInput();
            InsertToDatabase insert = new InsertToDatabase();
            insert.InsertContact();
        }

        static void CheckUserAddContactInput()
        {
            ContactsLibrary.Model.ContactModel contactModel = new ContactsLibrary.Model.ContactModel();

            Console.Write("Imię: ");
            contactModel.FirstName = Console.ReadLine();

            Console.Write("Nazwisko: ");
            contactModel.LastName = Console.ReadLine();

            Console.Write("Pseudonim: ");
            contactModel.NickName = Console.ReadLine();

            Console.Write("Firma: ");
            contactModel.CompanyName = Console.ReadLine();

            Console.Write("Numer telefonu: ");
            contactModel.PhoneNumber = Console.ReadLine();

            Console.Write("Adres e-mail: ");
            contactModel.EmailAddress = Console.ReadLine();

            Console.Write("Strona internetowa: ");
            contactModel.UrlAddress = Console.ReadLine();

            Console.Write("Data urodzin: ");
            contactModel.BirthdayDate = Console.ReadLine();

            Console.Write("Notatki: ");
            contactModel.Notes = Console.ReadLine();
        }
  

И, наконец, InsertToDatabase.cs:

 namespace ContactsConsoleApp
{
    class InsertToDatabase
    {
        public void InsertContact()
        {
            ContactsLibrary.Model.ContactModel contactModel = new ContactsLibrary.Model.ContactModel();

            string sqlQuery = $"INSERT INTO Contacts (ContactFirstName, ContactLastName, ContactNickName, ContactCompanyName, ContactPhoneNumber, ContactEmailAddress, ContactUrlAddress, ContactBirthdayDate, ContactNotes) VALUES('{contactModel.FirstName}', '{contactModel.LastName}', '{contactModel.NickName}', '{contactModel.CompanyName}', '{contactModel.PhoneNumber}', '{contactModel.EmailAddress}', '{contactModel.UrlAddress}', '{contactModel.BirthdayDate}', '{contactModel.Notes}')";

            SqlCommand sqlCommand = new SqlCommand(sqlQuery, DatabaseConnection.connection);
            SqlDataAdapter dataAdapter = new SqlDataAdapter();

            dataAdapter.InsertCommand = new SqlCommand(sqlQuery, DatabaseConnection.connection);
            dataAdapter.InsertCommand.ExecuteNonQuery();

            sqlCommand.Dispose();
        }
    }
}
  

Может кто-нибудь сказать мне, что я делаю не так?

С уважением

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

1. (1) включение строковых литералов в текстовую переменную команды требует использования параметров . (2) вы создаете новый пустой экземпляр contactModel в InsertContact методе. Вместо этого используйте то, которое вы заполнили CheckUserAddContactInput . (3) синтаксис свойств в модели не является неправильным, но устарел. используйте автоматические свойства.

Ответ №1:

Это очень распространенная ошибка, которую вы допустили. Что вы сделали, вы инициировали новую переменную для класса «ContactModel». Это означает, что он не использует тот, с которым вы сейчас работаете, вместо этого он создает новый класс и, следовательно, имеет пустые значения.

Что вы, возможно, захотите сделать, так это :

Обязательно верните созданный вами экземпляр ContactModel :

 static ContactsLibrary.Model.ContactModel CheckUserAddContactInput()
{
      ContactsLibrary.Model.ContactModel contactModel = new ContactsLibrary.Model.ContactModel();

      Console.Write("Imię: ");
      contactModel.FirstName = Console.ReadLine();

      Console.Write("Nazwisko: ");
      contactModel.LastName = Console.ReadLine();

      Console.Write("Pseudonim: ");
      contactModel.NickName = Console.ReadLine();

      Console.Write("Firma: ");
      contactModel.CompanyName = Console.ReadLine();

      Console.Write("Numer telefonu: ");
      contactModel.PhoneNumber = Console.ReadLine();

      Console.Write("Adres e-mail: ");
      contactModel.EmailAddress = Console.ReadLine();

      Console.Write("Strona internetowa: ");
      contactModel.UrlAddress = Console.ReadLine();

      Console.Write("Data urodzin: ");
      contactModel.BirthdayDate = Console.ReadLine();

      Console.Write("Notatki: ");
      contactModel.Notes = Console.ReadLine();

      return contactModel;
}
  

Добавьте параметр для передачи текущей «ContactModel», которую вы используете :

 namespace ContactsConsoleApp
{
    class InsertToDatabase
    {
        public void InsertContact(ContactsLibrary.Model.ContactModel contactModel)
        {
            string sqlQuery = $"INSERT INTO Contacts (ContactFirstName, ContactLastName, ContactNickName, ContactCompanyName, ContactPhoneNumber, ContactEmailAddress, ContactUrlAddress, ContactBirthdayDate, ContactNotes) VALUES('{contactModel.FirstName}', '{contactModel.LastName}', '{contactModel.NickName}', '{contactModel.CompanyName}', '{contactModel.PhoneNumber}', '{contactModel.EmailAddress}', '{contactModel.UrlAddress}', '{contactModel.BirthdayDate}', '{contactModel.Notes}')";

            SqlCommand sqlCommand = new SqlCommand(sqlQuery, DatabaseConnection.connection);
            SqlDataAdapter dataAdapter = new SqlDataAdapter();

            dataAdapter.InsertCommand = new SqlCommand(sqlQuery, DatabaseConnection.connection);
            dataAdapter.InsertCommand.ExecuteNonQuery();

            sqlCommand.Dispose();
        }
    }
}
  

Затем передайте его при вызове функции :

 static void AddContact()
{
       ContactsLibrary.Model.ContactModel contactModel = CheckUserAddContactInput();
       InsertToDatabase insert = new InsertToDatabase();
       insert.InsertContact(contactModel);
}
  

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

1. и остерегайтесь когда-либо вводить данные о людях по имени О’Мэлли в эту базу данных 🙂

2. Это сработало, спасибо! К сожалению, то, как работают эти классы и экземпляры, для меня сейчас немного сложно. Мне определенно нужно потратить гораздо больше времени на его изучение.