Как мне записать значение FK в другую таблицу? C # | SQLite

#c# #winforms #sqlite #dapper

#c# #winforms #sqlite #dapper

Вопрос:

Я работаю над школьным проектом, в котором я создаю систему управления клиентами. Из-за требования мне потребовалось изменить схему моей базы данных с использования 1 таблицы на использование 2. В настоящее время я могу выполнять запись в обе таблицы в моей базе данных, однако у меня возникают проблемы с получением понятий внешних ключей. У меня очень ограниченный опыт работы с SQL. Мои текущие инструкции execute записываются в обе мои таблицы, за исключением столбца идентификатора клиента в таблице MedicalInformation. Он показывает null, и я не уверен, как мне следует действовать дальше.

 cnn.Execute("INSERT INTO ClientInformation (FirstName, MiddleInitial, LastName, Phone, Email, Address, City, State, Zip, DateOfBirth, Occupation, Employer, EmergencyContact, EmergencyContactRelationship, EmergencyContactPhone) "  
            "VALUES (@FirstName, @MiddleInitial, @LastName, @Phone, @Email, @Address, @City, @State, @Zip, @DateOfBirth, @Occupation, @Employer, @EmergencyContact, @EmergencyContactRelationShip, @EmergencyContactPhone)", client);


cnn.Execute("INSERT INTO MedicalInformation (CurrentMedications, ChronicPain, ChronicPainWhere, OrthopedicPain, OrthopedicPainWhere, Pregnant, PreferedPressureLight, PreferedPressureMedium, PreferedPressureDeep, Allergies, AllergiesWhat, Cancer, HeadacheMigraine, Arthritis, Diabetes, JointReplacement, HighLowBloodPressure, Neuropathy, Fibromyalgia, Stroke, HeartAttack, KidneyDysfunction, BloodClots, Numbness, SprainsStrains, AreasOfDiscomfort) "  
            "VALUES (@CurrentMedication, @ChronicPain, @ChronicPainWhere, @OrthopedicPain, @OrthopedicPainWhere, @Pregnant, @PeferredPressureLight, @PeferredPressureMedium, @PeferredPressureDeep, @Allergies, @AllergiesWhat, @Cancer, @HeadacheMigraine, @Arthritis, @Diabetes, @JointReplacement, @HighLowBloodPressure, @Neuropathy, @Fibromyalgia, @Stroke, @HeartAttack, @KidneyDysfunction, @BloodClots, @Numbness, @SprainsStrains, @AreasOfDiscomfort) ", client.MedicalInfo);
  

Это часть таблиц

 CREATE TABLE "MedicalInformation" (
    "_ID"   INTEGER NOT NULL UNIQUE,
    "Client_ID" INTEGER,
    
    PRIMARY KEY("_ID" AUTOINCREMENT),
    FOREIGN KEY("Client_ID") REFERENCES "ClientInformation"("Client_Id")
);

CREATE TABLE "ClientInformation" (
    "Client_Id" INTEGER NOT NULL UNIQUE,
   
    PRIMARY KEY("Client_Id" AUTOINCREMENT)
);
  

Мой класс clientinfo

 public class ClientInformation
    {
        //Client Information
        public int Client_ID { get; set; }
        public string FirstName { get; set; }
        public string MiddleInitial { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        public string DateOfBirth { get; set; }
        public string Occupation { get; set; }
        public string Employer { get; set; }
        public string EmergencyContact { get; set; }
        public string EmergencyContactRelationship { get; set; }
        public string EmergencyContactPhone { get; set; }
        public MedicalInformation MedicalInfo { get; set; }
        public ClientInformation(string firstname, string middleinitial, string lastname, string phone, string email, string address, string city, string state, string zip, string dateofbirth, string occupation, string employer,
        string emergencycontact, string emergencycontactrelationship, string emergencycontactphone, MedicalInformation clientMedicainfo)
        {
            this.FirstName = firstname;
            this.MiddleInitial = middleinitial;
            this.LastName = lastname;
            this.Phone = phone;
            this.Email = email;
            this.Address = address;
            this.City = city;
            this.State = state;
            this.Zip = zip;
            this.DateOfBirth = dateofbirth;
            this.Occupation = occupation;
            this.Employer = employer;
            this.EmergencyContact = emergencycontact;
            this.EmergencyContactRelationship = emergencycontactrelationship;
            this.EmergencyContactPhone = emergencycontactphone;
            this.MedicalInfo = clientMedicainfo;
        }

    }
  

Ответ №1:

Поскольку ваш ClientInformation.Client_Id ключ автоматически генерируется SQLite, вам нужно будет как-то извлечь его перед вставкой в MedicalInformation таблицу.

У меня нет опыта работы с SQLite, но из беглого просмотра документации SQLite я узнал, что вы можете использовать last_insert_rowid() функцию для получения идентификатора последней вставки строки.

Вам понадобится это Client_ID значение внутри вашего client.MedicalInfo объекта для последующей обработки, поэтому я думаю, что можно сделать что-то вроде этого:

 client.MedicalInfo.Client_ID = cnn.ExecuteScalar<int>("INSERT INTO ClientInformation (FirstName, MiddleInitial, LastName, Phone, Email, Address, City, State, Zip, DateOfBirth, Occupation, Employer, EmergencyContact, EmergencyContactRelationship, EmergencyContactPhone) "  
            "VALUES (@FirstName, @MiddleInitial, @LastName, @Phone, @Email, @Address, @City, @State, @Zip, @DateOfBirth, @Occupation, @Employer, @EmergencyContact, @EmergencyContactRelationShip, @EmergencyContactPhone);"  
            "SELECT last_insert_rowid();", client);

cnn.Execute("INSERT INTO MedicalInformation (Client_ID, CurrentMedications, ChronicPain, ChronicPainWhere, OrthopedicPain, OrthopedicPainWhere, Pregnant, PreferedPressureLight, PreferedPressureMedium, PreferedPressureDeep, Allergies, AllergiesWhat, Cancer, HeadacheMigraine, Arthritis, Diabetes, JointReplacement, HighLowBloodPressure, Neuropathy, Fibromyalgia, Stroke, HeartAttack, KidneyDysfunction, BloodClots, Numbness, SprainsStrains, AreasOfDiscomfort) "  
            "VALUES (@Client_ID, @CurrentMedication, @ChronicPain, @ChronicPainWhere, @OrthopedicPain, @OrthopedicPainWhere, @Pregnant, @PeferredPressureLight, @PeferredPressureMedium, @PeferredPressureDeep, @Allergies, @AllergiesWhat, @Cancer, @HeadacheMigraine, @Arthritis, @Diabetes, @JointReplacement, @HighLowBloodPressure, @Neuropathy, @Fibromyalgia, @Stroke, @HeartAttack, @KidneyDysfunction, @BloodClots, @Numbness, @SprainsStrains, @AreasOfDiscomfort); ", client.MedicalInfo);
  

Просто убедитесь client.MedicalInfo.Client_ID , что свойство существует в вашем классе DTO.

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

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

2. Попробуйте второй вариант. Я не уверен, как SQLite работает внутри, но, вероятно, он отбрасывает сохраненное значение первой вставки, потому что вы выполняете два отдельных оператора Execute, поэтому вам нужно сохранить его в своем объекте. Я удалил первый вариант из своего ответа, чтобы вы не запутались

3. То же самое. Он записывает 0. Я добавил свой класс clientinfo выше

4. О, извините, я неправильно понял вашу структуру классов. Поскольку вы передаете client.MedicalInfo в качестве параметра во вторую вставку, возвращаемое значение ExecuteScalar должно храниться в свойстве внутри вашего MedicalInformation класса. Вы будете присваивать возвращаемое значение ExecuteScalar to client.MedicalInfo.Client_ID вместо client.Client_ID . Я снова обновил свой ответ. Скажите мне, работает ли это, наконец, сейчас. 🙂

5. Вы помогли мне больше, чем думаете =)