Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用外键对插入进行编码?_C#_Asp.net - Fatal编程技术网

C# 如何使用外键对插入进行编码?

C# 如何使用外键对插入进行编码?,c#,asp.net,C#,Asp.net,我的网站上有一个Q和一个页面,其中显示了从数据库中的问题表中提取的问题。问题下方有两个文本框,一个用于输入姓名,另一个用于输入答案表中的答案。答案表上有一个FK问题ID,这就是我被卡住的地方。如何在代码中为答案表编写脚本,以便它使用问题表中的问号 这就是我到目前为止所做的: protected void btnSubmitAnswer_onClick(object sender, EventArgs e) { String connectionString = "Server=root

我的网站上有一个Q和一个页面,其中显示了从数据库中的问题表中提取的问题。问题下方有两个文本框,一个用于输入姓名,另一个用于输入答案表中的答案。答案表上有一个FK问题ID,这就是我被卡住的地方。如何在代码中为答案表编写脚本,以便它使用问题表中的问号

这就是我到目前为止所做的:

protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
     String connectionString = "Server=root;Database=test;User=name;Password=test;";

     using (SqlConnection conn = new SqlConnection(connectionString))
     {
          SqlCommand cmd = new SqlCommand("INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
                   "VALUES (%%, '" + txtName.Text + "', '" + txtAnswer.Text + "')");
          cmd.Connection = conn;
          conn.Open();
          cmd.ExecuteScalar().ToString();
     }   
}


%%是我需要修复的。我正在考虑使用一个字符串变量,但是我仍然不知道该使用什么数据类型。

您需要从问题表中执行get Query Select语句来检索问题Id,然后执行插入操作


另外,使用参数字符串,不要连接,您的代码可能会被注入恶意行为,可能会删除您的数据库表

您需要将问题的id存储在一个隐藏字段中,并引用该字段,否则在insert语句中使用内部select来检索问题的id

隐藏字段的设置如下所示:

<input type="hidden" id="questionId" value="questionId" />
内部选择将以

insert into table ((select id from questiontable where question = [the question text]), 'name', 'answer')
您需要创建一个int QuestionID变量来保存当前的QuestionID。当用户更改问题时,只需更改它。您可以将其存储在会话中


旁注:我建议参数化txtName.Text和txtAnswer.Text,以避免SQL注入。

在获取数据库问题时,也获取Id并将其存储在某处

另一方面,您的代码对SQL注入是开放的。使用参数存储文本框中的值,如下所示:

SqlParameter param = new SqlParameter("@Name", SqlDbType.VarChar);
param.Value = txtName.Text;
cmd.Parameters.Add(param);
因此,您的控件是Gridview,可能是这样。。试试看

受保护的无效myRowCommandobject发送方GridViewCommandEventArgs e { 字符串连接字符串=Server=root;数据库=test;用户=name;密码=test;; GridViewRow行=this.GridView1.SelectedRow; int EntryID=row.RowIndex; 使用SqlConnection conn=新的SqlConnectionconnectionString { SqlCommand cmd=new-SqlCommandINSERT-INTO-Answers-QuestionID、Answer\u-Name、Answer+ 值EntryID,“+txtName.Text+”,“+txtAnswer.Text+”; cmd.Connection=conn; 康涅狄格开放大学; cmd.ExecuteScalar.ToString; } }
} 获取问题Id时,应将其存储到变量中,以便在插入命令时重用它

比如:

并将其存储在类似Int32 QuestionId的变量中

此外,为了完整性起见,不要连接SQL字符串,这会使代码易受攻击,而应使用SQL参数

protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
 String connectionString = "Server=root;Database=test;User=name;Password=test;";

 using (SqlConnection conn = new SqlConnection(connectionString))
 {
      SqlCommand cmd = new SqlCommand(
           "INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
           "VALUES (@prmQuestionId, @prmAnswerName, @prmAnswer)");
      cmd.Parameters.Add(new SqlParameter("@prmQuestionId", QuestionId/*HERE INSERT THE ID VALUE OF THE FETCHED QUESTION*/));
      cmd.Parameters.Add(new SqlParameter("@prmAnswerName", txtName.Text));
      cmd.Parameters.Add(new SqlParameter("@prmAnswer", txtAnswer.Text));
      cmd.Connection = conn;
      conn.Open();
      cmd.ExecuteScalar().ToString();
 }   
}

您对SQL注入非常开放,fyi网站中的问题是如何组织的?您提供的代码不足以说明您可以从哪里获得您的问题ID。你是说它显示了一个从问题表中提取的问题——那么为什么不不仅提取问题文本呢。但也要识别并使用它?你的模型是什么,目前你允许一个问题有多个答案。一对多,正确吗?是的,正确,同一个问题可以有多个答案。感谢@AndyKorneyev删除了问题并发表了评论感谢警告,尽管我知道这是真的-我不担心我的用户会这样做。我使用网格视图来显示问题。这实际上也非常有用,谢谢:谢谢你的预防措施。谢谢你的帮助,这将是最大的帮助
SELECT Id, /*And anything else you need*/ FROM QUESTION
protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
 String connectionString = "Server=root;Database=test;User=name;Password=test;";

 using (SqlConnection conn = new SqlConnection(connectionString))
 {
      SqlCommand cmd = new SqlCommand(
           "INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
           "VALUES (@prmQuestionId, @prmAnswerName, @prmAnswer)");
      cmd.Parameters.Add(new SqlParameter("@prmQuestionId", QuestionId/*HERE INSERT THE ID VALUE OF THE FETCHED QUESTION*/));
      cmd.Parameters.Add(new SqlParameter("@prmAnswerName", txtName.Text));
      cmd.Parameters.Add(new SqlParameter("@prmAnswer", txtAnswer.Text));
      cmd.Connection = conn;
      conn.Open();
      cmd.ExecuteScalar().ToString();
 }   
}