#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. Это сработало, спасибо! К сожалению, то, как работают эти классы и экземпляры, для меня сейчас немного сложно. Мне определенно нужно потратить гораздо больше времени на его изучение.