0

我有一个有两个表的数据库;StudentID 是“StudentList”表的主键,StudentID 是“JournalEntries”表的外键。

在我的网站上,我有一个搜索功能,因此用户可以从 StudentList 中搜索学生,并将结果显示在数据网格中。当用户从列表中选择一个学生时,会弹出一个日记条目框。当他们填写日记条目弹出框并单击提交按钮时,我需要将日记条目输入到与从数据网格中选择的学生 ID 相关联的 JournalEntries 表中。

protected void SearchGrid_SelectedIndexChanged(object sender, EventArgs e)
{
    FNameLabel.Text = SearchGrid.SelectedRow.Cells[1].Text;
    LNameLabel.Text = SearchGrid.SelectedRow.Cells[2].Text;

    string constr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Sites\Network2\nrsh\App_Data\myDB.mdb";
    string cmdstr = "SELECT StudentID FROM StudentList WHERE = SearchGrid.SelectedRow.Cells[3].Text AND INSERT into JournalEntries (Topic, SubTopic, Summary, Date, Notes) values (@Topic, @SubTopic, @Summary, @Date, @Notes)";

    OleDbConnection con = new OleDbConnection(constr);
    OleDbCommand com = new OleDbCommand(cmdstr, con);
    con.Open();
    //The following fields are added from the journal entry form to the corresponding database fields
    com.Parameters.AddWithValue("@Topic", ddlTopic.Text);
    com.Parameters.AddWithValue("@SubTopic", txtSubTopic.Text);
    com.Parameters.AddWithValue("@Date", txtDate.Text);
    com.Parameters.AddWithValue("@Summary", txtSummary.Text);
    com.Parameters.AddWithValue("@Notes", txtNotes.Text);
    com.ExecuteNonQuery();
    con.Close();
}

所以这是我对逻辑的想法,但它可能是完全错误的,因为我对 sql 了解不多。任何帮助都会很棒。

4

2 回答 2

0

不能组合 SELECT 和 INSERT 语句。

…………

字符串 myValue = SearchGrid.SelectedRow.Cells[3].Text;

您的字符串中没有 SearchGrid.SelectedRow.Cells[3].Text 的值..您实际上有“SearchGrid.SelectedRow.Cells[3].Text”...

string myValue = SearchGrid.SelectedRow.Cells[3].Text;
string cmdstr = "INSERT into JournalEntries (StudentID , Topic, SubTopic, Summary, Date, Notes) values (@StudentID , @Topic, @SubTopic, @Summary, @Date, @Notes)";

和后来

com.Parameters.AddWithValue("@StudentID", myValue);
com.Parameters.AddWithValue("@Topic", ddlTopic.Text);
com.Parameters.AddWithValue("@SubTopic", txtSubTopic.Text);
com.Parameters.AddWithValue("@Date", txtDate.Text);
com.Parameters.AddWithValue("@Summary", txtSummary.Text);
com.Parameters.AddWithValue("@Notes", txtNotes.Text);

我有点猜 您应该给出表名和表中的所有列及其数据类型(int、string 等)。

编辑:重构。

您应该创建一个接受参数的类。您永远不应该拥有数据库代码....坐在您的 GUI 代码所在的位置。

public class JournalEntriesManager
{

public static void InsertJournalEntry ( string studentID, string topic , string subTopic, DateTime DateOf  , string summary , string notes )
{
// Your code here
}

}

这就像“关注点分离”的“1 级”。

但简而言之,您的 GUI 级代码应该从控件中收集信息......并将该信息传递给 BusinessLogic(在本例中为“JournalEntriesManager”)。类似的东西。

于 2013-07-15T17:22:54.803 回答
0

您不能将多个语句与 AND 语句完全组合,即用于将多个条件组合在一起。此外,您不能只是神奇地将一个表中的一行与另一个表中的一行相关联,相反,您的 JournalEntries 表中应该有另一列,其中包含与该条目关联的学生的 ID。当您在 JournalEntries 表中插入新行时,您将在该列中包含学生 ID,这就是您的日记条目与学生相关联的方式。

此外,您的查询不能包含变量名称,如“SearchGrid.SelectedRow.Cells[3].Text”,您必须将该变量的值直接插入到查询文本中。请记住,您正在将此查询发送到另一台服务器(您的数据库服务器),并且它不知道您的脚本中的变量是什么。

于 2013-07-15T17:30:38.947 回答