【问题标题】:How can I find primary key of entered value SQL Server如何找到输入值 SQL Server 的主键
【发布时间】:2021-04-09 19:33:10
【问题描述】:
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, @supervisor, @cosupervisor

【问题讨论】:

  • 您需要执行另一个查询以根据名称检索 id。您可以在保存论文之前在 c# 中执行此操作。您可以将主键查询作为“插入”语句的一部分进行,但我建议在 c# 应用程序中进行,以明确创建论文的依赖项。
  • ThesisNo / PersonID 是 IDENTITY 列吗?如果是这样,docs.microsoft.com/en-us/sql/t-sql/functions/… .
  • 您的问题主要与您的应用程序和您用来允许人们输入此信息的 GUI 有关。通常使用某种下拉列表来选择与 FK 列对应的值。无论哪种方式,您都需要检索与输入的“字符串”关联的 ID。有点奇怪,您为 Person 显示 DDL,但没有为任何实际的 FK 表显示 DDL。也许您需要有关编写有效应用程序及其 GUI 的指导?
  • 我不知道您为什么使用相同的旧技术,现在您可以使用像 EntityFrame Work 这样的 ORM。

标签: c# sql-server database windows-forms-designer


【解决方案1】:

您可以在INSERT 中使用SELECTJOIN。所以你可以说例如:

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;

如果一个值可以为空,你应该LEFT JOIN

注意:如果名称不是唯一的,您将在插入中获得多行。


如果您将两个表插入在一起,您可以在第一个INSERT 之后的语句立即 中使用函数SCOPE_IDENTITY() 来获取IDENTITY 的值。或者,您可以在表变量中使用OUTPUT 子句。

【讨论】:

    【解决方案2】:

    如果您将作者姓名作为字符串,那么您可以使用简单查询在 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
        }
    }
    

    【讨论】:

    • 实际上我使用了组合框,但我不知道如何知道我的选定项的 id 是什么。
    • 嗨@vikbaris 请检查该解决方案的新更新。请尝试并让我知道它是否有效。谢谢
    猜你喜欢
    • 2018-07-11
    • 2011-10-11
    • 2019-02-16
    • 2021-01-05
    • 2010-09-10
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多