问题描述
CREATE TABLE Thesis
(
ThesisNo numeric(8,0) NOT NULL,AuthorID int NOT NULL,EnstituteID int NOT NULL,SupervisorID int NOT NULL,Title nvarchar(100)NOT NULL,Abstract nvarchar(500)NOT NULL,Pages int NOT NULL,SumbitDate datetime NOT NULL,[Type] nchar(30) NOT NULL,[Language] nchar(20) NOT NULL,PRIMARY KEY (ThesisNo),FOREIGN KEY (EnstituteID) REFERENCES Enstitute(EnstituteID),FOREIGN KEY (AuthorID) REFERENCES Author(AuthorID),FOREIGN KEY (SupervisorID) REFERENCES Supervisor(SupervisorID)
)
CREATE TABLE Person
(
PersonID int NOT NULL,PersonFullName nvarchar(70) NOT NULL,PRIMARY KEY (PersonID)
)
我使用用 C# 编写的 Windows 窗体应用程序。
我把作者当成一个字符串,但是在给论文添加外键时,我需要添加那个作者的主键,这样我才能访问联系表并找到那个人。怎么知道输入的人名的主键是什么?
string query = "INSERT INTO Thesis (AuthorID,EnstituteID,SupervisorID,CoSupervisorID,Title,Abstract,Pages,SubmitDate,Type,Language)" +
"VALUES (@author,@enstitute,@supervisor,@cosupervisor,@title,@abstract,@pages,@submitdate,@type,@language) ";
AuthorID
或其他 ID 成员是 int 和外键,但输入的值是字符串 @author @enstitute,@cosupervisor
解决方法
您可以在 library(tidyr)
library(dplyr)
df_1 %>%
rename_with( ~ paste(.x,"single",sep = "."),.cols = value) %>% ## changed the header because otherwise it breaks
pivot_longer(cols = starts_with("val"),names_to = c("whatevs",".value"),names_sep = "\\.")
## # A tibble: 8 x 7
## key whatevs male female red green single
## <chr> <chr> <dbl> <dbl> <lgl> <lgl> <chr>
## 1 gender values 0.5 0.5 NA NA NA
## 2 gender value NA NA NA NA NA
## 3 age values NA NA NA NA NA
## 4 age value NA NA NA NA 50
## 5 color values NA NA TRUE FALSE NA
## 6 color value NA NA NA NA NA
## 7 time_of_day values NA NA NA NA NA
## 8 time_of_day value NA NA NA NA noon
内执行 SELECT
和 JOIN
。例如,您可以说:
INSERT
如果一个值可以为空,你应该INSERT INTO Thesis
(AuthorID,EnstituteID,SupervisorID,CoSupervisorID,Title,Abstract,Pages,SubmitDate,Type,Language)
SELECT
a.PersonID,e.EnstituteID,s.PersonID,@cosupervisor,@title,@abstract,@pages,@submitdate,@type,@language
FROM Person a
JOIN Enstitute e ON e.Name = @enstitute
LEFT JOIN Person s ON s.Name = @supervisor
WHERE a.Name = @author;
。
请注意:如果名称不是唯一的,您将在插入中得到多行。
如果将两个表插入到一起,则可以在语句immediately中使用函数LEFT JOIN
,跟在第一个SCOPE_IDENTITY()
之后获取INSERT
的值.或者,您可以在表变量中使用 IDENTITY
子句。
如果您将作者姓名作为字符串,那么您可以使用简单的查询在 Person 表中进行搜索
喜欢 =>
1。 Select PersonID FROM Person Where PersonFullName Like '%Author Name%'
2. Select PersonID FROM Person Where PersonFullName='Author Name'
但是使用这些查询存在一些问题。
如果您使用第一个,那么查询可能返回多行的可能性很小。
如果你使用第二个,那么你有机会得不到任何一行。
最后,我的建议是不要把作者当成一个字符串。使用组合框并将所有作者加载到该组合框中,然后选择特定作者并保存作者 ID。
该解决方案的新更新(使用组合框):
如果您不知道如何将列表绑定到组合框以及如何使用 SelectedIndexChanged 事件,请检查给定的链接->
How to bind a List to a ComboBox?
Getting selected value of a combobox
public class Person //Your Person Class
{
public int PersonID { get; set; }
public string PersonFullName { get; set; }
}
public partial class Form1 : Form //Your form class where you use combo box
{
public Form1()
{
InitializeComponent();
loadCombo();
}
void loadCombo() //load dummy data to combo
{
//Load Combobox with List Of Persons
List<Person> persons = new List<Person>();
persons.Add(new Person() { PersonID = 1,PersonFullName = "Vikbaris" });
persons.Add(new Person() { PersonID = 2,PersonFullName = "Linker-SJNF" });
var bindingSource1 = new BindingSource();
bindingSource1.DataSource = persons;
comboBox1.DataSource = bindingSource1.DataSource;
comboBox1.DisplayMember = "PersonFullName";
comboBox1.ValueMember = "PersonID";
}
// Selected AuthorID event callback
private void comboBox1_SelectedIndexChanged(object sender,EventArgs e)
{
ComboBox cmb = (ComboBox)sender;
int selectedIndex = cmb.SelectedIndex;
Person selectedValue = (Person)cmb.SelectedValue;
int authorID = selectedValue.PersonID; //Here is your desire AuthorID
}
}