【问题标题】:How to check if ID of one table is equal to ID of another table, if equal assign new value to another column in the table in asp.net如何检查一个表的ID是否等于另一个表的ID,如果相等,则将新值分配给asp.net中表中的另一列
【发布时间】:2017-05-19 16:05:13
【问题描述】:

我正在尝试构建一个测验应用程序。我创建了两个表:

CREATE TABLE [dbo].[Answers] (
       [AID]           INT            NOT NULL,
       [QID]           INT            NOT NULL,
       [Answer]        NVARCHAR (200) NOT NULL,
       [CorrectAnswer] NVARCHAR (200) NULL,
       PRIMARY KEY CLUSTERED ([AID] ASC),
       CONSTRAINT [FK_Answers_Question] FOREIGN KEY ([QID]) REFERENCES [dbo].         
       [Question] ([QID])
        );

CREATE TABLE [dbo].[Question] (
       [QID]      INT            IDENTITY (1, 1) NOT NULL,
       [Question] NVARCHAR (200) NOT NULL,
       PRIMARY KEY CLUSTERED ([QID] ASC)
 );

在这里,QID 是自动生成和递增的。 答案表包含 AID 作为主键和 QID 作为外键。 现在我的问题是我应该自动生成和增加 Answers.QID 还是应该单独设置?而且我还希望 Answers.AID 增加到 4(带有 4 个选项的多项选择题)。 像这样:

Answers Table                         
 AID | QID | Answer
 1 | 1 | Scripting Language
 2 | 1 | Programming Language
 3 | 1 | MarkUp Language
 4 | 1 | Network Protocol

Question Table
 QID | Question
 1 | What is HTML?

所以每当我尝试在 Answer 表中插入答案时,它应该检查 Question.QID = Answers.QID。如果为真,则从 1 到 4 分配 Answer.AID 并输入答案。

所有这一切都由管理员管理,因此我创建了一个 Web 表单 AddQuestion.aspx,当管理员单击“添加”按钮时可以在其中添加问题,它会重定向到管理员可以保存和上传答案的 AddAnswer.aspx。

AddQuestion.aspx

public partial class AddQuestion : System.Web.UI.Page
{
    SqlCommand command;
    SqlConnection connection;
    protected void ButtonAdd_Click(object sender, EventArgs e)
    {
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TheQuizConnectionString"].ConnectionString);
        connection.Open();

        string addQuestion = "insert into Question(Question) values(@Ques)";
        command = new SqlCommand(addQuestion, connection);

        //command.Parameters.AddWithValue("@Qid", TextBoxQid.Text);
        command.Parameters.AddWithValue("@Ques", TextBoxQuestion.Text);
        command.ExecuteNonQuery();

        Response.Redirect("AddAnswer.aspx");

        connection.Close();
    }
}

AddAnswer.aspx

public partial class AddAnswer : System.Web.UI.Page
{
     SqlCommand command;
     SqlConnection connection;
     protected void ButtonAdd_Click(object sender, EventArgs e)
     {

        Response.Redirect("AddQuestion.aspx");
     }
     public void CheckQid()
    {
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TheQuizConnectionString"].ConnectionString);
        connection.Open();

        string checkQid = "select count(QID) from Question";
        using (command = new SqlCommand(checkQid, connection))

    }
    protected void ButtonSave_Click(object sender, EventArgs e)
    {
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TheQuizConnectionString"].ConnectionString);
        connection.Open();

        string addAnswer = "insert into Answers(Answer) values(@Answer)";
        command = new SqlCommand(addAnswer, connection);

        //command.Parameters.AddWithValue("@Aid", TextBoxAid.Text);
        //command.Parameters.AddWithValue("@Qid", TextBoxQid.Text);
        command.Parameters.AddWithValue("@Answer", TextBoxAnswer.Text);

        command.ExecuteNonQuery();
        Response.Redirect("AddAnswer.aspx");
    }
}

我是 asp.net 和 Visual Studio 的新手。我试图寻找答案,但找不到任何东西。如果有人可以帮助我解决这个问题,我将不胜感激。

谢谢。

【问题讨论】:

  • 当你运行command.ExecuteNonQuery任何错误时会发生什么?还有你在哪里执行这个方法中的实际 sql 查询public void CheckQid()
  • 我确信它没有 QID 参数
  • @MethodMan 我不知道如何编写 sql 查询,我只是试过这个:更新答案集 QID = (Select QID from Question where Question.QID = Answer.QID) 但它没有用.而且我对 sql 的了解也不多。
  • 听起来你应该打开 chrome 并在基本 SQL 教程上进行谷歌搜索。I don't know is not an excuse 这就是为什么会有像 google.com 这样的东西在那里......祝你好运
  • @MethodMan 我已经开始学习了。谢谢。

标签: c# sql asp.net database webforms


【解决方案1】:

如果限制为 1-4,则 AID 不能作为主键。一种选择是使其成为由 QID 和 AID 组成的复合键。另一种选择是添加一个标识列作为主键,或者不使用它。

如果这是我的项目,我可能只是将新 IDENTITYcolumn 上的 PK 添加到 Answer 表中。请注意,我通常不进行需要对 INSERT/UPDATE 进行约束检查的表设计,因此没有 FK,除了 PK 所有字段都允许 null。唯一的例外是如果我使用的是复合索引。

CREATE TABLE [dbo].[Answers] (
    AnswerNDX       INT IDENTITY(1,1) NOT NULL,
    [AID]           INT               NULL,
    [QID]           INT               NULL,
    [Answer]        NVARCHAR (200)    NULL,
    [CorrectAnswer] NVARCHAR (200)    NULL,
    CONSTRAINT PK_Answers_NDX PRIMARY KEY CLUSTERED ([AnswerNDX] ASC) ON [PRIMARY]
)

我通常会将答案插入例程放入存储过程中。此过程的第一部分为您的 AID 声明一个默认为 1 的变量。然后它检查这个问题是否已经有答案,如果有,它会获取 AID 的最大值并将其加 1。然后它将插入新的答案

CREATE PROCEDURE dbo.usp_QuestionAnswerAdd (
    @qID            INT,
    @Answer         NVARCHAR(200),
    @CorrectAnswer  NVARCHAR(200)
) AS 
BEGIN
    DECLARE @aID INT = 1
    IF EXISTS (SELECT [AID] FROM Answers WHERE (QID = @QID)) BEGIN
        SELECT @aID = Max(AID) + 1 FROM Answers WHERE (QID = @QID)
    END

    INSERT Answers( aID,  qID,  Answer,  CorrectAnswer)
    VALUES        (@aID, @Qid, @Answer, @CorrectAnswer)
END
GO

此过程的 C# 代码会有所不同,因为我们将调用存储过程而不是仅传递文本命令。您不会分配 AID,因为 SQL 会查找它的增量。

protected void ButtonSave_Click(object sender, EventArgs e) {
    int RowsAffected;
    string connstring = ConfigurationManager.ConnectionStrings["TheQuizConnectionString"].ConnectionString;

    using (SqlConnection connection = new SqlConnection(connstring)) {
        string sqlcmd = "usp_QuestionAnswerAddusp_QuestionAnswerAdd";
        SqlCommand cmd = new SqlCommand(sqlcmd, connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Paramaters.AddWithValue("@qID", (int)TTextBoxQid.Text);
        cmd.Paramaters.AddWithValue("@Answer", TextBoxAnswer.Text);
        cmd.Paramaters.AddWithValue("@CorrectAnswer", string.Empty); // didnt see a value for this
        try {
            connection.Open();
            RowsAffected = cmd.ExecuteNonQuery();
        }
        catch (Exception ex) {
            RowsAffected = -1;
            // add error handling
        }
        finally { connection.Close(); }
    }
    /*
        RowsAffected should be equal to 1.
        -1 would mean there was an C# exception
        Any other failure would be in SQL commands
    */


    Response.Redirect("AddAnswer.aspx");
}    

这绝不是一个完整的例子。如果您要删除问题,AID 不会自动反映这一点。或者,如果您想更改答案的顺序,因为 AID 也可以兼作 ORDER BY 因素。

【讨论】:

  • 谢谢。它真的帮助了我。谢谢你也让我明白。真的很感激。
  • 不客气。如果有帮助,请考虑对此进行标记或回答
猜你喜欢
  • 2022-12-19
  • 1970-01-01
  • 2016-11-09
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2021-02-16
  • 2018-10-23
相关资源
最近更新 更多