2017-05-19 28 views
-1

我正在尝试构建测验应用程序。我创建了两个表格:如何检查一个表的ID是否等于另一个表的ID,如果相等,则将新值赋给asp.net表中的另一列

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? 

所以每当我尝试插入的回答表的答案,应该检查是否Question.QID = Answers.QID。如果为true,则从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和视觉工作室。我试图寻找答案,但找不到任何东西。我很感激,如果有人能帮助我这个。

谢谢。

+0

运行'command.ExecuteNonQuery'时会发生什么错误?你也在哪里执行这个方法实际的SQL查询'公共无效CheckQid()' – MethodMan

+0

我敢肯定它没有QID参数 –

+0

@MethodMan我不写怎么写sql查询,我只是试过这个:Update解决方案设置QID =(从问题中选择QID where Question.QID = Answer.QID)但它没有奏效。而且我也没有那么多的关于sql的知识。 –

回答

0

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

如果这是我的项目,我可能会将新的IDENTITY列上的PK添加到应答表中。请注意,我通常不会执行需要在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加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因子。

+1

谢谢。它真的帮助了我。感谢让我理解。万分感激。 –

+0

不客气。请考虑将其标记出来,或者在有帮助时予以回答 –

相关问题