0

ASP.NET と C# を使用して、簡単な提案 Web ベースのアプリケーションを開発しています。1つのことを除いてうまく機能します。次のデータベース設計があります。

テーブルの安全性に関する提案ログ

ID, Title, Description, Username, DateSubmitted, TypeID, OtherTypes

テーブルの安全性に関する提案の種類

ID, Type

ユーザーはフォームに入力して送信できます。データベースに送信されたユーザー名、タイトル、説明、日付を挿入できます。ただし、データベース内のタイプの 1 つまたは新しいタイプのいずれかであるタイプを挿入する必要があります。私はこの部分に苦労しており、誰が解決するのかわかりません。それで、これで私を助けてもらえますか?type の値をデータベースに挿入するにはどうすればよいですか?

ASP.NET コード:

<div ID="contactform">
  <ol>
    <li>
      <label for="subject">Type</label>
      <asp:DropDownList ID="DropDownList" runat="server"
       DataSourceID="SqlDataSource1" Width="155px" Font-Bold="True"
       ForeColor="#006666" AppendDataBoundItems="false" DataTextField="Type"
       DataValueField="ID" AutoPostBack="true"
       OnDataBound="DropDownList_DataBound"/>
      <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
       ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
       SelectCommand="SELECT * FROM [SafetySuggestionsType]"/>
      <asp:TextBox ID="TextBox1" runat="server" CssClass="text"/><br />
      <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" 
       ControlToValidate="dropdownlist"
       ErrorMessage="Please select a type ... or choose Others"/>
      <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" 
       ControlToValidate="TextBox1" 
       ErrorMessage="Please enter a type for your suggestion"/>
    </li>
    <li>
      <label for="subject">Subject</label>
      <asp:TextBox ID="txtSubject" runat="server" CssClass="text"/><br />
      <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
       ControlToValidate="txtSubject" 
       ErrorMessage="Please enter a subject/title for your suggestion"/>
    </li>
    <%--The following hidden field is for inserting the date--%>
    <li>
      <asp:TextBox ID="dateSubmitted" runat="server" CssClass="text"
       Visible="false"/><br />
    </li>
    <li>
      <label for="message">Your Suggestion</label>
      <asp:TextBox ID="txtSuggestion" runat="server" cols="50"
       CssClass="textarea" rows="6" TextMode="MultiLine"/><br />
      <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 
       ControlToValidate="txtSuggestion"
       ErrorMessage="Please enter your suggestion"/>
    </li>
    <li class="buttons">
      <asp:ImageButton ID="imageField" runat="server"
       ImageURL="images/Send.gif" OnClick="btnSubmit_Click" />
      <%--<input type="image" name="imageField" id="imageField"
       src="images/Send.gif" />--%>
    </li>
  </ol>
</div>

コード ビハインド:

protected void btnSubmit_Click(object sender, ImageClickEventArgs e)
{
    SmtpClient sc = new SmtpClient("MAIL.Aramco.com");
    StringBuilder sb = new StringBuilder();
    MailMessage msg = null;

    sb.Append("Message from: " + Service.User.Name + "\n");
    sb.Append("Email: " + Service.User.GetProperty("EMP_BINTERMAIL") + "\n");
    sb.Append("Type: ");
    sb.Append((DropDownList.SelectedItem.Text.Equals("Others")
        ? TextBox1.Text : DropDownList.SelectedItem.Text) + "\n");
    sb.Append("Title: " + txtSubject.Text + "\n");
    sb.Append("Suggestion   : " + txtSuggestion.Text + "\n");

    try
    {
        msg = new MailMessage(Service.User.GetProperty("EMP_BINTERMAIL"),
            "JOHN.ARNESON@ARAMCO.COM", "PSSP: New Safety Suggestion Box",
            sb.ToString());
        sc.Send(msg);
        MultiView1.SetActiveView(ViewConfirm);
    }
    catch (Exception ex)
    {
        throw ex;
        //Response.Write("Something bad happened!");
    }
    finally
    {
        if (msg != null)
        {
            msg.Dispose();
        }
    }

    //For storing the suggestions in the database
    string connString = "Data Source=localhost\\sqlexpress;"
        + "Initial Catalog=psspdbTest;Integrated Security=True";
    string insertCommand = "INSERT INTO SafetySuggestionsLog "
        + "(Title, DateSubmitted, Description, Username) values "
        + "(@Title, @DateSubmitted, @Description, @Username)";
    string username = Service.User.ID;
    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand(insertCommand, conn))
        {
            cmd.Parameters.Clear(); 
            cmd.Parameters.AddWithValue("@Title", txtSubject.Text);
            cmd.Parameters.AddWithValue("@DateSubmitted",
                DateTime.Now.ToString());
            cmd.Parameters.AddWithValue("@Description", txtSuggestion.Text);
            cmd.Parameters.AddWithValue("@Username", username);
            cmd.ExecuteNonQuery();
        }
    }
}

アップデート:

提案情報を保存するためにコードを変更しました。

//For stroing the suggestions in the database
        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
        //string insertCommand = "INSERT INTO SafetySuggestionsLog (Title, DateSubmitted, Description, Username) values(@Title, @DateSubmitted, @Description, @Username)";
        string insertCommand = @"insert into SafetySuggestionsLog
                                  ( Title, Description, Username, DateSubmitted, TypeID, OtherTypes ) values
                                  ( @Title, @Description, @Username, @DateSubmitted,
                                    ( select ID from SafetySuggestionsType where Type = @Type ), '?' )";
        string username = Service.User.ID;
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(insertCommand, conn))
            {
                cmd.Parameters.Clear(); 
                cmd.Parameters.AddWithValue("@Title", txtSubject.Text);
                cmd.Parameters.AddWithValue("@DateSubmitted", DateTime.Now.ToString());
                cmd.Parameters.AddWithValue("@Description", txtSuggestion.Text);
                cmd.Parameters.AddWithValue("@Username", username);
                cmd.Parameters.AddWithValue("@Type", DropDownList.SelectedValue);
                cmd.ExecuteNonQuery();
            }
        }

それでも、ドロップダウンリストから選択したタイプを保存できませんでした。定義済みの型の 1 つを選択した場合でも、データベースの othertype 列に (?) が表示され、Type 列に NULL が表示されます。なぜ?

4

3 に答える 3

1

ストアド プロシージャは、関連する手順を適切に処理できます。

if not exists ( select 42 from SafetySuggestionsType where Type = @Type )
  insert into SafetySuggestionsType ( Type ) values ( @Type )

insert into SafetySuggestionsLog
  ( Title, Description, Username, DateSubmitted, TypeID, OtherTypes ) values
  ( @Title, @Description, @Username, @DateSubmitted,
    ( select TypeId from SafetySuggestionsType where Type = @Type ), '?' )
于 2012-08-05T11:49:26.760 に答える
0

次のように SqlDbType でパラメーターの型を指定できます。

   cmd.Parameters.Add("@Title",SqlDbType.VarChar, 20);
     cmd.Parameters["@Title"].Value = txtSubject.Text;
于 2012-08-05T10:10:28.080 に答える
0

タイプ列を主キーにすることができます。データベースにすでに存在する新しいタイプを挿入すると、例外がスローされます。したがって、try ブロック内にレコードを挿入します。

try{
//Do your insertion, if a duplicate item was found, the insertion will not take place
}
catch{
//Do something is an value was inserted which already existed
}
于 2012-08-05T10:10:35.410 に答える