我一直在网上寻找不同的人对如何解释的解释 使用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>
<asp:SqlDataSource runat="server" ID="SqlDataSource1" ConnectionString='<%$ ConnectionStrings:ProjectsAndTasksTestConnectionString %>'
SelectCommand="SELECT [TesterName] FROM [Users] ORDER BY [TesterName]">
</asp:SqlDataSource>
</td>
</tr>
<tr>
<td>
</td>
<td style="height: 51px; width: 377px; font-weight: bold;">
Project Name
</td>
<td>
<asp:TextBox ID="txtProjectName" runat="server" Width="200px"></asp:TextBox>
</td>
</tr>
<tr>
<td style="height: 51px">
</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>
</td>
</tr>
<tr>
<td>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td style="width: 377px">
</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#的新手。
答案 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);
}