如何将数据插入DB

时间:2015-02-03 23:52:03

标签: c# asp.net

我一直在网上寻找不同的人对如何解释的解释 使用asp.net和C#插入数据,但到目前为止我尝试过的所有不同的东西都没有做,为什么当我点击将数据插入我的数据库时,我的按钮没有做任何事情?我还用什么来区分文本框和下拉列表,我会使用我目前使用的ddl.selecteditem并且这是最好的方法吗?大多数在线源代码和我看过的教程都处理了网格视图,而我却无法将其有效地转换为我需要的内容。

这是我的HTML

           </td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Project Tester
           </td>
           <td>
               <asp:DropDownList ID="ddlTester" runat="server"
                    DataTextField="" Width="203px" DataBound="ddlTester_DataBound"
                   AutoPostBack="False">
               </asp:DropDownList>
               &nbsp;
               <asp:SqlDataSource runat="server" ID="SqlDataSource1" ConnectionString='<%$ ConnectionStrings:ProjectsAndTasksTestConnectionString %>' 
                   SelectCommand="SELECT [TesterName] FROM [Users] ORDER BY [TesterName]">
               </asp:SqlDataSource>
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;
           </td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Project Name&nbsp;
           </td>
           <td>
               <asp:TextBox ID="txtProjectName" runat="server" Width="200px"></asp:TextBox>
               &nbsp;
           </td>
       </tr>
       <tr>
           <td style="height: 51px">
               &nbsp;
           </td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Project Description</td>
           <td style="height: 51px">
               <asp:TextBox ID="txtProjectDesc" runat="server" TextMode="MultiLine" Height="105px" Width="237px"></asp:TextBox>
               &nbsp;
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Assigned Date</td>
           <td>
               <asp:TextBox ID="txtStartDate" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Due Date</td>
           <td>
               <asp:TextBox ID="txtEndDate" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
        <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Project Platform</td>
           <td>
               <asp:TextBox ID="TxtProjectPlatform" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               BIOS</td>
           <td>
               <asp:TextBox ID="TxtBios" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               PCH</td>
           <td>
               <asp:TextBox ID="TxtPch" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               PROC</td>
           <td>
               <asp:TextBox ID="TxtProc" runat="server" Width="200px"></asp:TextBox>
           </td>
       </tr>
        <tr>
           <td>
               &nbsp;</td>
           <td style="height: 51px; width: 377px; font-weight: bold;">
               Forward To</td>
           <td>
               <asp:DropDownList ID="employeeEmailDropDownList" runat="server" 
            Visible="True" 
                   DataSourceID="SqlDataSource2" DataTextField="EmailAddress" DataValueField="EmailAddress" Width="203px">
        </asp:DropDownList>
               <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ProjectsAndTasksTestConnectionString %>"
                   SelectCommand="SELECT [EmailAddress] FROM [Users] ORDER BY [TesterName]"></asp:SqlDataSource></td>    
       </tr>
        <tr>
           <td>
               &nbsp;</td>
           <td>
               &nbsp;</td>
           <td>
               &nbsp;</td>
       </tr>
       <tr>
           <td>
               &nbsp;</td>
           <td style="width: 377px">
               &nbsp;</td>
           <td>
               <asp:Button ID="Button1" runat="server" onclick="CreateProject_Click"  
                   Text="Create Project" Font-Bold="true" Height="45px" Width="198px" />
               <asp:Label ID="errorLabel" runat="server" ForeColor="Red"></asp:Label>
               <asp:Label ID="successLabel" runat="server" ForeColor="Green"></asp:Label>
           </td>
       </tr>
       <tr>
           <td style="height: 29px">
               </td>
           <td style="height: 29px; width: 377px;">
               </td>
           <td style="height: 29px">
               </td>
       </tr>
   </table>
    </asp:Panel>

</asp:Content>

这是我拥有的C#

    using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Project_Set
{

    public partial class Projects_AddProject : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Populate1();
            }
        }

        protected void ddlTester_DataBound(object sender, EventArgs e)
        {
            //Inserting an item in the 0 index of the DDL named "-Select-"
            //which will navigate the user to select an item
            ddlTester.Items.Insert(0, new ListItem("-Select-"));
        }

        public void Populate1()
        {
            if (!IsPostBack)
            {
                string connetionString = "Data Source=JVANCEX-MOBL2;Initial Catalog=ProjectsAndTasksTest; Trusted_Connection=True;";
                SqlCommand cmd = new SqlCommand("SELECT TesterName AS FullName FROM [Users]", new SqlConnection(ConfigurationManager.ConnectionStrings["ProjectsAndTasksTestConnectionString"].ConnectionString));

                using (SqlConnection cnn = new SqlConnection(connetionString))
                {

                    cmd.Connection.Open();

                    SqlDataReader ddlValues;
                    ddlValues = cmd.ExecuteReader();

                    ddlTester.DataSource = ddlValues;
                    ddlTester.DataValueField = "FullName";
                    ddlTester.DataTextField = "FullName";
                    ddlTester.DataBind();

                    cmd.Connection.Close();
                    //cmd.Connection.Dispose();
                }
            }

        }

        public void CreateProject_Click(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string connetionString = "Data Source=JVANCEX-MOBL2;Initial Catalog=ProjectsAndTasksTest; Trusted_Connection=True;";
                string insStmt = "INSERT INTO Projects (TesterName, ProjectName, ProjectDescription, DueDate, DateAssigned, Platform) values (@TesterName, @ProjectName,@ProjectDesc, @DueDate, @DateAssigned, @Platform)";

                using (SqlConnection cnn = new SqlConnection(connetionString))
                {
                    cnn.Open();
                    SqlCommand insCmd = new SqlCommand(insStmt, cnn);
                    insCmd.Parameters.AddWithValue("@ProjectName", txtProjectName);
                    insCmd.Parameters.AddWithValue("@ProjectDesc", txtProjectDesc);

                    insCmd.Parameters.AddWithValue("@TesterName", ddlTester.SelectedItem);

                    insCmd.Parameters.AddWithValue("@DateAssigned", txtStartDate);
                    insCmd.Parameters.AddWithValue("@DueDate", txtEndDate);
                    insCmd.Parameters.AddWithValue("@Platform", TxtProjectPlatform);
                    //insCmd.Parameters.AddWithValue("@Bios", TxtBios.Text);
                    //insCmd.Parameters.AddWithValue("@Pch", TxtPch.Text);
                    //insCmd.Parameters.AddWithValue("@Proc", TxtProc.Text);
                    insCmd.ExecuteNonQuery();
                    cnn.Close();
                    //MessageBox.Show(affectedRows + " Project Created!");

                }

            }

        }

我知道我需要使用.Parameters来防止可能的MySQL注入,但除此之外,我是asp.net和C#的新手。

1 个答案:

答案 0 :(得分:2)

你的代码周围有if (!IsPostBack),否则会将数据插入到数据库中,但是如果你点击按钮并导致一个事件,那么事件的唯一途径(除了直接从C#调用它)回发。

您需要从该方法中删除该if语句,它应该可以正常工作。

如果你的代码中有set a breakpoint然后介入,你会很快注意到这一点。如果您对程序流有疑问,请设置断点并逐行逐步执行代码。

其他一些说明:

  • 您应该将连接字符串移动到web.config等配置文件中。如果您需要更新它,那么您将不必重建网站。您可以通过ConfigurationManager.ConnectionStrings["connection string name here"].ConnectionString

  • 以编程方式访问它
  • 我会移动创建SqlCommand的代码并设置参数。在使用块之外,然后执行insCmd.Connection = cnn;。我希望尽可能少地保持我的连接开放。这也允许您使用将命令字符串作为参数的构造函数,因此不需要insStmt变量。

  • Web表单没有MessageBox类,就像WPF或WCF一样。相反,当页面在客户端上完成加载时,您可以让它执行一些JavaScript。现在,一个简单的alert()会做,但最终你可能会用noty之类的东西来修饰它。

  • 您可以使用隐式类型变量var,而不是为变量明确设置类型。这使得代码更短,更易于阅读,并且如果您最后更改类型,则更容易重构。它并没有任何缺点。

  • 你应该在你的插入命令执行周围包装一个try / catch来捕获任何问题,并且可能在某处记录错误,然后向客户端显示一个通用的“抱歉,发生意外错误”。

  • 您传递给参数的变量大部分都是TextBox类型。这意味着您需要访问它们的.Text属性才能获取输入的文本。

  • 如果DateAssigned和DueDate是数据库中的日期类型,则需要使用DateTime.TryParse来确保它们是表示日期的有效字符串。如果它们的格式不正确,则向客户端显示错误消息,并且不执行insert命令。客户端应该使用一些JavaScript来强制输入日期为正确的格式(但不要依赖它,以防用户禁用JavaScript)。

总结一下,以下是我将如何编写该事件处理程序:

protected void CreateProject_Click(object sender, EventArgs e)
{ 
    var insCmd = new SqlCommand("INSERT INTO Projects (TesterName, ProjectName, ProjectDescription, DueDate, DateAssigned, Platform) values (@TesterName, @ProjectName,@ProjectDesc, @DueDate, @DateAssigned, @Platform)");
    insCmd.Parameters.AddWithValue("@ProjectName", txtProjectName.Text);
    insCmd.Parameters.AddWithValue("@ProjectDesc", txtProjectDesc.Text);
    insCmd.Parameters.AddWithValue("@TesterName", ddlTester.SelectedItem); //This should probably be .SelectedValue instead
    insCmd.Parameters.AddWithValue("@DateAssigned", txtStartDate.Text);
    insCmd.Parameters.AddWithValue("@DueDate", txtEndDate.Text);
    insCmd.Parameters.AddWithValue("@Platform", TxtProjectPlatform.Text);

    using (var cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
    {
        insCmd.Connection = cnn;
        cnn.Open();            
        insCmd.ExecuteNonQuery();
        cnn.Close();
    }

   ClientScript.RegisterStartupScript(this.GetType(), "insert-success", "alert('Project created');", true);
}