0

2 つのテーブルを持つデータベースがあります。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

複数のステートメントを AND ステートメントで完全に結合することはできません。つまり、複数の条件を結合するためです。また、あるテーブルの行を別のテーブルの行に魔法のように関連付けることはできません。代わりに、JournalEntries テーブルには、エントリが関連付けられている学生の ID を含む別の列が必要です。JournalEntries テーブルに新しい行を挿入すると、その列に学生 ID が含まれます。これにより、日誌エントリが学生に関連付けられます。

また、クエリに「SearchGrid.SelectedRow.Cells[3].Text」のような変数名を含めることはできません。代わりに、その変数の値をクエリ テキストに直接挿入する必要があります。このクエリを別のサーバー (データベース サーバー) に送信していることに注意してください。スクリプト内の変数はわかりません。

于 2013-07-15T17:30:38.947 に答える
0

SELECT ステートメントと INSERT ステートメントを組み合わせることはできません。

.......

string 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 に答える