簡體   English   中英

想要使用 C# 和 Windows Forms 將兩個不同表中的 ID 添加到一個關聯表中

[英]Want to add IDs from two different tables into one associative table using C# and Windows Forms

我想使用 Windows Forms 和 C# 來實現一個由下表組成的數據庫應用程序:

學生表:

CREATE TABLE [dbo].[Student] (
    [Id]   INT           NOT NULL,
    [Name] NVARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Class 表:

CREATE TABLE [dbo].[Class] (
    [Id]      INT           NOT NULL,
    [Teacher] NVARCHAR (50) NOT NULL,
    [Grade]   INT           NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

學生班級組合:

CREATE TABLE [dbo].[StudentClassCombo] (
    [ClassID]   INT NOT NULL,
    [StudentID] INT NOT NULL,
    CONSTRAINT [ClassFK] FOREIGN KEY ([ClassID]) REFERENCES [dbo].[Class] ([Id]),
    CONSTRAINT [StudentFK] FOREIGN KEY ([StudentID]) REFERENCES [dbo].[Student] ([Id])
);

我創建了一個 Windows 表格,我想通過該表格將學生分配到班級:

在此處輸入圖像描述

正如您在上面的表格中看到的,我可以成功地使用預期值填充我的組合框和列表視圖。 但是,我正在努力實現“添加”按鈕的功能,該按鈕必須將列表視圖(學生姓名)中的選中值分配給組合框(類)中的項目,並將映射添加到表StudentClassCombo

我的按鈕單擊事件代碼如下:

private void student2class_Click(object sender, EventArgs e)
        {
            

            string insertCommand = "INSERT INTO dbo.StudentClassCombo (ClassID, StudentID) "
    + "(SELECT Id FROM dbo.Class "
    + "WHERE Grade = @Grade)"
    + "(SELECT Id FROM dbo.Student "
    + "WHERE Name = @StudentName)";

            using (connection = new SqlConnection(connectionString))
            using (SqlCommand Insertcmd = new SqlCommand(insertCommand, connection))
            {
                Insertcmd.Parameters.Add("@Grade", SqlDbType.Int);
                Insertcmd.Parameters.Add("@StudentName", SqlDbType.NVarChar, 50);

                connection.Open();

                foreach (ListViewItem eachItem in StudentsList.CheckedItems)
                {
                    //string Selected = eachItem.SubItems[0].Text; //directly access "eachItem"

                    Insertcmd.Parameters["@Grade"].Value = int.Parse(ClassNames.Text);
                    Insertcmd.Parameters["@StudentName"].Value = eachItem.SubItems[0].Text;

                    Insertcmd.ExecuteNonQuery();
                }

                connection.Close();
            }
            
        }
    }

但是當我運行上面的代碼時,我遇到了以下異常:

INSERT 語句的 select 列表包含的項目少於插入列表。 SELECT 值的數量必須與 INSERT 列的數量匹配。

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

我的查詢中有兩個SELECT語句。 我不明白為什么程序不能同時識別它們?

我快速查看了插入語句,似乎不正確。

更改自:

string insertCommand = "INSERT INTO dbo.StudentClassCombo (ClassID, StudentID) "
    + "(SELECT Id FROM dbo.Class "
    + "WHERE Grade = @Grade)"
    + "(SELECT Id FROM dbo.Student "
    + "WHERE Name = @StudentName)";

至:

string insertCommand = @"INSERT INTO dbo.StudentClassCombo (ClassID, StudentID) VALUES ((SELECT Id FROM dbo.Class WHERE Grade = @Grade), (SELECT Id FROM dbo.Student WHERE Name = @StudentName))";

第一個 Select 語句后缺少逗號

其他兩個答案解決了您遇到的錯誤,但就我們通常如何構建應用程序而言,您將同時下載 Id 和 Grade(以及 Id 和 StudentName),並將兩者都存儲在本地方法。 當用戶選擇“John”時,您將已經知道它與哪個 ID 相關,您只需插入即

INSERT INTO dbo.StudentClassCombo (ClassID, StudentID) VALUES ( @GradeId, @StudentId )

您不會有這種“根據用戶在 ui 中選擇的名稱查找 ID”過程,特別是如果有兩個具有相同名稱的條目很容易失敗

大多數可以綁定到項目列表的 windows 列表類型控件都具有聲明哪個屬性保存要顯示的文本以及哪個保存用作 ID 的值的功能。 例如一個列表框設置如下:

lb.DisplayMember = "StudentName";
lb.ValueMember = "Id";
lb.DataSource = someStudentDataTable;

將與數據表中的一堆學生行相關聯,顯示名稱,但每當要求列表框提供 SelectedValue 時,都會返回所選學生的 ID

試試這個查詢字符串:

 string insertCommand = "INSERT INTO dbo.StudentClassCombo (ClassID, StudentID) "
+ "SELECT Class.ID as ClassId, Student.Id as StudentId from dbo.Class,dbo.Student"+ 
" where Class.Grade=@Grade and Student.Name = @StudentName";

並修復參數

 Insertcmd.Parameters.Add("@Grade", SqlDbType.Int).Value=0;
Insertcmd.Parameters.Add("@StudentName", SqlDbType.NVarChar).Value=string.Empty;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM