如何找到输入值 SQL Server 的主键

问题描述

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 内执行 SELECTJOIN。例如,您可以说:

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
    }
}