2012-08-05 63 views
0

我正在开发一个简单的建议基于Web的应用程序使用C#ASP.NET。除了一件事情,它运作良好。我有以下的数据库设计:如何将选定的建议类型插入到数据库中?

SafetySuggestionsLog

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

SafetySuggestionsType

ID, 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"), 
      "[email protected]", "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(); 
     } 
    } 
} 

UPDATE:

我修改了代码,用于存储建议信息:

//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(); 
      } 
     } 

而且我仍然无法从下拉列表中存储选定的类型。我在数据库中的othertype列下获得(?),并且在Type列下使用NULL,即使我选择了其中一种预定义类型。为什么?

回答

0

,你可以这样用SqlDbType指定参数类型:

cmd.Parameters.Add("@Title",SqlDbType.VarChar, 20); 
    cmd.Parameters["@Title"].Value = txtSubject.Text; 
+0

一个'SqlDbType.Int'是不太适合这一直输入到一个文本框的值...... – 2012-08-05 10:20:51

+0

嗨,你有权;-)我纠正 – 2012-08-05 10:25:39

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 
} 
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), '?') 
+0

+1,但这并不需要是一个存储过程 - 查询字符串中只有多个语句。 – Hogan 2012-08-05 23:25:01

+0

我不明白你的意思。我已经有一个查询插入标题,日期提交,描述,用户名。如何插入类型?是你给存储过程还是别的什么? – 2012-08-07 05:27:40

+0

第一行检查'@ Type'是否已经在'SafetySuggestionsType'表中。如果不是,那么第二行'插入'它。第二个“INSERT”语句将建议添加到“SafetySuggestionsLog”表中。我发现在存储过程中封装这种功能更容易,测试它并根据需要设置安全性。它避免了在我的应用程序中散布一些SQL代码,并且避免了开始构建查询的诱惑。 (BTDT)。 – HABO 2012-08-07 10:54:41

相关问题