SqlCommand执行两次的SQL语句
本文关键字:两次 SQL 语句 执行 SqlCommand | 更新日期: 2023-09-27 18:01:57
我正在创建一个ASP。. NET应用程序使用c#,每次我尝试使用SqlCommand执行SQL INSERT,该命令被执行两次。我在这篇文章中实现了(SQL插入查询执行两次),但它仍然没有帮助。
代码如下:
protected void btn_Add_Click(object sender, EventArgs e)
{
error.InnerHtml = " ";
SqlConnection MyConn = new SqlConnection("Data Source=.''SQLEXPRESS;"
+ "Initial Catalog=SIMON;"
+ "Persist Security Info=True;"
+ "User ID=username;Password=password");
string sqlStatement = @"INSERT INTO [Network_Equipment] "
+ "([Network_Equipment_Name], [Network_Equipment_Type_ID], [IP_Address], [FQDN], [NetBIOS_Name], [Building_ID], [Description])"
+ " VALUES "
+ "(@Network_Equipment_Name, @Network_Equipment_Type_ID, @IP_Address, @FQDN, @NetBIOS_Name, @Building_ID, @Description)";
SqlCommand sqlCmd = new SqlCommand(sqlStatement, MyConn);
sqlCmd.Connection = MyConn;
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Name", ((in_Add_Equipment.Value == null) ? (object)DBNull.Value : (object)in_Add_Equipment.Value));
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Type_ID", ((ddl_Equipment_Type.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Equipment_Type.SelectedValue));
sqlCmd.Parameters.AddWithValue("@IP_Address", ((in_IP_Address.Value == null) ? (object)DBNull.Value : (object)in_IP_Address.Value));
sqlCmd.Parameters.AddWithValue("@FQDN", ((in_FQDN.Value == null) ? (object)DBNull.Value : (object)in_FQDN.Value));
sqlCmd.Parameters.AddWithValue("@NetBIOS_Name", ((in_NetBIOS.Value == null) ? (object)DBNull.Value : (object)in_NetBIOS.Value));
sqlCmd.Parameters.AddWithValue("@Building_ID", ((ddl_Building.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Building.SelectedValue));
sqlCmd.Parameters.AddWithValue("@Description", ((ta_Description.Value == null) ? (object)DBNull.Value : (object)ta_Description.Value));
try
{
MyConn.Open();
}
catch (Exception er)
{
error.InnerHtml = er.ToString();
return;
}
try
{
sqlCmd.ExecuteNonQuery();
}
catch (Exception er)
{
error.InnerHtml = er.ToString();
return;
}
error.InnerHtml = "Successfully added: " + in_Add_Equipment.Value;
sqlCmd.Dispose();
sqlCmd = null;
MyConn.Close();
in_Add_Equipment.Value = "";
ddl_Equipment_Type.SelectedIndex = 0;
in_IP_Address.Value = "";
in_FQDN.Value = "";
in_NetBIOS.Value = "";
ddl_Building.SelectedIndex = 0;
ta_Description.Value = "";
GridView1.DataBind();
}
我在调试模式下运行它,sqlCmd.ExecuteNonQuery()只被调用一次,但我有两个相同的条目被添加。
我错过了什么和/或做错了什么?
-------- EDIT --------
我使用了john ryan的代码的修改版本,但它仍然被添加了两次。
下面是所有的代码:
Equipment.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Equipment.aspx.cs" Inherits="SIMON.Equipment" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript">
// disables the button specified and sets its style to a disabled "look".
function disableButtonOnClick(oButton, sButtonText, sCssClass) {
oButton.disabled = true; // set button to disabled so you can't click on it.
oButton.value = sButtonText; // change the text of the button.
oButton.setAttribute('className', sCssClass); // IE uses className for the css property.
oButton.setAttribute('class', sCssClass); // Firefox, Safari use class for the css property. (doesn't hurt to do both).
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<div id="error" runat="server"> </div>
<div>
<fieldset style="display: inline-block; padding: 5px; -moz-border-radius: 8px; border-radius: 8px;">
<legend style="text-decoration: underline;">[ Add Equipment ]</legend>
<table cellpadding="3px" style="border: 0px; width: 300px;">
<tbody>
<tr>
<td style="text-align: left;"><label for="in_Add_Equipment" style="white-space: nowrap;">Equipment Name</label></td>
<td style="text-align: right;"><input id="in_Add_Equipment" runat="server" size="20" /></td>
<td style="text-align: left;"><label for="ddl_Equipment_Type" style="white-space: nowrap;">Equipment Type</label></td>
<td style="text-align: right;">
<asp:DropDownList ID="ddl_Equipment_Type"
runat="server" DataSourceID="Network_Equipment_Type" DataTextField="Network_Equipment_Type"
DataValueField="Network_Equipment_Type_ID"></asp:DropDownList>
</td>
</tr>
<tr>
<td style="text-align: left;"><label for="in_IP_Address" style="white-space: nowrap;">IP Address</label></td>
<td style="text-align: right;"><input id="in_IP_Address" runat="server" size="20" class="OnlyNumeric" /></td>
<td style="text-align: left;"><label for="in_FQDN" title="Fully Qualified Domain Name" style="white-space: nowrap;">FQDN</label></td>
<td style="text-align: right;"><input id="in_FQDN" runat="server" size="20" /></td>
</tr>
<tr>
<td style="text-align: left;"><label for="in_NetBIOS" style="white-space: nowrap;">NetBIOS Name</label></td>
<td style="text-align: right;"><input id="in_NetBIOS" runat="server" size="20" /></td>
<td style="text-align: left;"><label for="ddl_Building" style="white-space: nowrap;">Building</label></td>
<td style="text-align: right;">
<asp:DropDownList ID="ddl_Building" runat="server"
DataSourceID="Buildings" DataTextField="Building_Name"
DataValueField="Building_ID"></asp:DropDownList>
</td>
</tr>
<tr>
<td style="text-align: left;"><label for="ta_Description" style="white-space: nowrap;">Description</label></td>
<td style="text-align: right;" colspan="3"><textarea id="ta_Description" runat="server" cols="50" rows="3"></textarea></td>
</tr>
<tr>
<td colspan="4" style="text-align: right;">
<asp:Button ID="btn_Add" Text="Add" CssClass="ui-state-default ui-corner-all" runat="server" OnClick="btn_Add_Click" />
</td>
</tr>
</tbody>
</table>
</fieldset>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<p></p>
<fieldset style="display: inline-block; padding: 5px; -moz-border-radius: 8px; border-radius: 8px;">
<legend style="text-decoration: underline;">[ Update Equipment ]</legend>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:SIMON-Writer %>"
DeleteCommand="DELETE FROM [Network_Equipment] WHERE [Network_Equipment_ID] = @original_Network_Equipment_ID"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [All_Network_Equipment-Simplified]"
UpdateCommand="UPDATE [Network_Equipment] SET [Network_Equipment_Name] = @Network_Equipment_Name, [Network_Equipment_Type_ID] = @Network_Equipment_Type_ID, [IP_Address] = @IP_Address, [FQDN] = @FQDN, [NetBIOS_Name] = @NetBIOS_Name, [Building_ID] = @Building_ID, [Description] = @Description, [Active] = @Active WHERE [Network_Equipment_ID] = @original_Network_Equipment_ID">
<DeleteParameters>
<asp:Parameter Name="original_Network_Equipment_ID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="Network_Equipment_Name" Type="String" />
<asp:Parameter Name="Network_Equipment_Type_ID" Type="Int32" />
<asp:Parameter Name="IP_Address" Type="String" />
<asp:Parameter Name="FQDN" Type="String" />
<asp:Parameter Name="NetBIOS_Name" Type="String" />
<asp:Parameter Name="Building_ID" Type="Int32" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="Active" Type="Boolean" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Network_Equipment_Name" Type="String" />
<asp:Parameter Name="Network_Equipment_Type_ID" Type="Int32" />
<asp:Parameter Name="IP_Address" Type="String" />
<asp:Parameter Name="FQDN" Type="String" />
<asp:Parameter Name="NetBIOS_Name" Type="String" />
<asp:Parameter Name="Building_ID" Type="Int32" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="Active" Type="Boolean" />
<asp:Parameter Name="original_Network_Equipment_ID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
CellPadding="4" DataKeyNames="Network_Equipment_ID"
DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<Columns>
<asp:BoundField DataField="Network_Equipment_ID"
HeaderText="Network_Equipment_ID" ReadOnly="True"
SortExpression="Network_Equipment_ID" Visible="False" />
<asp:BoundField DataField="Network_Equipment_Name" HeaderText="Equipment Name" SortExpression="Network_Equipment_Name" />
<asp:BoundField DataField="Network_Equipment_Type_ID" HeaderText="Network_Equipment_Type_ID" SortExpression="Network_Equipment_Type_ID" Visible="False" />
<asp:TemplateField HeaderText="Equipment Type" SortExpression="Network_Equipment_Type">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="Network_Equipment_Type" DataTextField="Network_Equipment_Type"
DataValueField="Network_Equipment_Type_ID"
SelectedValue='<%# Bind("Network_Equipment_Type_ID") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Network_Equipment_Type") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="IP_Address" HeaderText="IP Address" SortExpression="IP_Address" />
<asp:BoundField DataField="FQDN" HeaderText="FQDN" SortExpression="FQDN" />
<asp:BoundField DataField="NetBIOS_Name" HeaderText="NetBIOS Name" SortExpression="NetBIOS_Name" />
<asp:BoundField DataField="Building_ID" HeaderText="Building_ID" SortExpression="Building_ID" Visible="False" />
<asp:TemplateField HeaderText="Building" SortExpression="Building_Name">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="Buildings"
DataTextField="Building_Name" DataValueField="Building_ID"
SelectedValue='<%# Bind("Building_ID") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Building_Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Description" SortExpression="Description">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Height="50px" Text='<%# Bind("Description") %>' TextMode="MultiLine" Width="200px"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Description") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CheckBoxField DataField="Active" HeaderText="Active" SortExpression="Active" />
<asp:CommandField ShowEditButton="True" />
</Columns>
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
<br />
<asp:SqlDataSource ID="Network_Equipment_Type" runat="server" ConnectionString="<%$ ConnectionStrings:SIMON-Reader %>"
SelectCommand="SELECT DISTINCT * FROM [Network_Equipment_Types] ORDER BY [Network_Equipment_Type]">
</asp:SqlDataSource>
<asp:SqlDataSource ID="Buildings" runat="server" ConnectionString="<%$ ConnectionStrings:SIMON-Reader %>"
SelectCommand="SELECT DISTINCT * FROM [Buildings] ORDER BY [Building_Name]">
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</fieldset>
</div>
</form>
</body>
</html>
Equipment.aspx.cs
namespace SIMON
{
public partial class Equipment : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btn_Add);
btn_Add.OnClientClick = "disableButtonOnClick(this, 'Please wait...', 'disabled_button ui-corner-all'); ";
btn_Add.OnClientClick += ClientScript.GetPostBackEventReference(optionsSubmit);
}
}
protected void btn_Add_Click(object sender, EventArgs e)
{
error.InnerHtml = " ";
SqlTransaction trans = null;
using (SqlConnection MyConn = new SqlConnection(ConfigurationManager.ConnectionStrings["SIMON-Writer"].ToString()))
{
MyConn.Open();
trans = MyConn.BeginTransaction();
string sqlStatement = "INSERT INTO [Network_Equipment] "
+ "([Network_Equipment_Name], [Network_Equipment_Type_ID], [IP_Address], [FQDN], [NetBIOS_Name], [Building_ID], [Description])"
+ " VALUES "
+ "(@Network_Equipment_Name, @Network_Equipment_Type_ID, @IP_Address, @FQDN, @NetBIOS_Name, @Building_ID, @Description)";
using (SqlCommand sqlCmd = new SqlCommand(sqlStatement, MyConn))
{
sqlCmd.Transaction = trans;
sqlCmd.Connection = MyConn;
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Name", ((in_Add_Equipment.Value == null) ? (object)DBNull.Value : (object)in_Add_Equipment.Value));
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Type_ID", ((ddl_Equipment_Type.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Equipment_Type.SelectedValue));
sqlCmd.Parameters.AddWithValue("@IP_Address", ((in_IP_Address.Value == null) ? (object)DBNull.Value : (object)in_IP_Address.Value));
sqlCmd.Parameters.AddWithValue("@FQDN", ((in_FQDN.Value == null) ? (object)DBNull.Value : (object)in_FQDN.Value));
sqlCmd.Parameters.AddWithValue("@NetBIOS_Name", ((in_NetBIOS.Value == null) ? (object)DBNull.Value : (object)in_NetBIOS.Value));
sqlCmd.Parameters.AddWithValue("@Building_ID", ((ddl_Building.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Building.SelectedValue));
sqlCmd.Parameters.AddWithValue("@Description", ((ta_Description.Value == null) ? (object)DBNull.Value : (object)ta_Description.Value));
try
{
sqlCmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception er)
{
error.InnerHtml = er.ToString();
return;
}
finally
{
MyConn.Close();
error.InnerHtml = "Successfully added: " + in_Add_Equipment.Value;
in_Add_Equipment.Value = "";
ddl_Equipment_Type.SelectedIndex = 0;
in_IP_Address.Value = "";
in_FQDN.Value = "";
in_NetBIOS.Value = "";
ddl_Building.SelectedIndex = 0;
ta_Description.Value = "";
GridView1.DataBind();
}
}
}
}
}
}
-------- EDIT 2 --------
我已经找到了导致SQL语句"双执行"的原因,找到了这段代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btn_Add);
btn_Add.OnClientClick = "disableButtonOnClick(this, 'Please wait...', 'disabled_button ui-corner-all'); ";
btn_Add.OnClientClick = ClientScript.GetPostBackEventReference(optionsSubmit);
}
}
当我注释掉它时,信息被添加一次,但按钮没有像我想要的那样被禁用。禁用该按钮可以防止人们不耐烦而多次点击该按钮。
建议吗?
结果如下:
aspx
<asp:Button ID="btn_Add" Text="Add" CssClass="ui-state-default ui-corner-all" runat="server" OnClick="btn_Add_Click" />
aspx.cs
if (!Page.IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btn_Add);
btn_Add.OnClientClick = "disableButtonOnClick(this, 'Please wait...', 'disabled_button ui-corner-all'); ";
btn_Add.OnClientClick += ClientScript.GetPostBackEventReference(optionsSubmit);
}
执行两次SQL语句
aspx
<asp:Button ID="btn_Add" Text="Add" CssClass="ui-state-default ui-corner-all" runat="server" />
aspx.cs
if (!Page.IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btn_Add);
btn_Add.OnClientClick = "disableButtonOnClick(this, 'Please wait...', 'disabled_button ui-corner-all'); ";
btn_Add.OnClientClick += ClientScript.GetPostBackEventReference(optionsSubmit);
}
以所需的方式简单地更改了"btn_Add",但不执行"btn_Add_Click"的代码
aspx
<asp:Button ID="btn_Add" Text="Add" CssClass="ui-state-default ui-corner-all" runat="server" OnClick="btn_Add_Click" />
aspx.cs
if (!Page.IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btn_Add);
btn_Add.OnClientClick = "disableButtonOnClick(this, 'Please wait...', 'disabled_button ui-corner-all'); ";
//btn_Add.OnClientClick += ClientScript.GetPostBackEventReference(optionsSubmit);
}
按所需方式更改"btn_Add",不执行"btn_Add_Click"的代码,并将整个页面刷新为Equipment。aspx(通常为设备。
几个建议…
连接字符串应该存储在您的web中。配置文件。
可以在每个步骤中捕获异常,但要使用"using"语句。这样你就不用担心处理对象了。
我建议添加一个全局。Asax文件到您的项目并捕获应用程序错误。在你的catch语句中,你可以放置一行,说"throw new Exception..",并传入你的特定异常,这样很容易捕获,你可以描述错误。然后,我建议在Enterprise Library 5.0中设置日志应用程序块。拥有一个像你这样的全局"错误"变量可能不是一个好主意。如果您想轻松学习Enterprise Library,请下载Enterprise Library Labs示例。
我不会在你的代码中直接使用SQL命令。我会使用存储过程,并让SQL在SQL服务器上完成。如果有变量,请在存储过程上设置参数。存储过程对于web应用程序来说更安全。使用微软企业库中的数据库应用程序块可能是个好主意。它们为您提供了所有这些代码,您只需要导入库并了解这些命令。
如果使用using语句,则不需要关闭连接或dispose。
如果你抛出一个异常,不需要"return"语句…堆栈上的下一个带有catch语句(或finally语句)的块将捕获它。如果没有,则Global中的Application_Error。Asax会抓住它的。确保在。net框架中正确处理未处理的异常。微软打破了。net 3.5的未处理异常架构,所以你要么添加自己的模块,要么切换回1.1架构。或者升级到。net 4.0
实际问题:你的点击事件可能会被调用两次,因为你正在使用一个处理程序,你有"onclick"事件属性指定在你的<asp:按钮源标签。在VB中,单词"句柄"会跟在事件方法后面。在c#中,处理程序可以在不同的位置,使用不同类型的语法。如果两个都在这里,它会被调用两次。>
# 1: & lt; asp:按钮ID = " btn_Add "文本= "添加"CssClass = " ui-state-default ui-corner-all"runat = " server " OnClick = " btn_Add_Click " />
# 2: btn_Add。OnClientClick = ClientScript.GetPostBackEventReference(optionsSubmit);
如果控件上有onclick属性,则不需要添加特殊代码(如OnClientClick或事件处理程序)。
祝你好运! error.InnerHtml = " ";
string connStr = "Data Source=.''SQLEXPRESS;"
+ "Initial Catalog=SIMON;"
+ "Persist Security Info=True;"
+ "User ID=username;Password=password");
using (SqlConnection MyConn = new SqlConnection(connStr))
{
string sqlStatement = @"INSERT INTO [Network_Equipment] "
+ "([Network_Equipment_Name], [Network_Equipment_Type_ID], [IP_Address], [FQDN], [NetBIOS_Name], [Building_ID], [Description])"
+ " VALUES "
+ "(@Network_Equipment_Name, @Network_Equipment_Type_ID, @IP_Address, @FQDN, @NetBIOS_Name, @Building_ID, @Description)";
SqlCommand sqlCmd = new SqlCommand(sqlStatement, MyConn);
sqlCmd.Connection = MyConn;
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Name", ((in_Add_Equipment.Value == null) ? (object)DBNull.Value : (object)in_Add_Equipment.Value));
sqlCmd.Parameters.AddWithValue("@Network_Equipment_Type_ID", ((ddl_Equipment_Type.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Equipment_Type.SelectedValue));
sqlCmd.Parameters.AddWithValue("@IP_Address", ((in_IP_Address.Value == null) ? (object)DBNull.Value : (object)in_IP_Address.Value));
sqlCmd.Parameters.AddWithValue("@FQDN", ((in_FQDN.Value == null) ? (object)DBNull.Value : (object)in_FQDN.Value));
sqlCmd.Parameters.AddWithValue("@NetBIOS_Name", ((in_NetBIOS.Value == null) ? (object)DBNull.Value : (object)in_NetBIOS.Value));
sqlCmd.Parameters.AddWithValue("@Building_ID", ((ddl_Building.SelectedValue == null) ? (object)DBNull.Value : (object)ddl_Building.SelectedValue));
sqlCmd.Parameters.AddWithValue("@Description", ((ta_Description.Value == null) ? (object)DBNull.Value : (object)ta_Description.Value));
try
{
MyConn.Open();
}
catch (Exception er)
{
//error.InnerHtml = er.ToString();
//return;
throw new Exception(...
}
try
{
sqlCmd.ExecuteNonQuery();
}
catch (Exception er)
{
//error.InnerHtml = er.ToString();
//return;
throw new Exception(...
}
error.InnerHtml = "Successfully added: " + in_Add_Equipment.Value;
}
in_Add_Equipment.Value = "";
ddl_Equipment_Type.SelectedIndex = 0;
in_IP_Address.Value = "";
in_FQDN.Value = "";
in_NetBIOS.Value = "";
ddl_Building.SelectedIndex = 0;
ta_Description.Value = "";
GridView1.DataBind();
删除两个catch中的"return"
和
为每个try
添加finally语句和移动
sqlCmd.Dispose(); sqlCmd = null; MyConn.Close();
变成最后的
在调试时,可以看到插入语句是否正确。然后查看数据库。
@Jesus拉莫斯是正确的。
像这样做。
private _constring = new SqlConnection("Data Source=.''SQLEXPRESS;"
+ "Initial Catalog=SIMON;"
+ "Persist Security Info=True;"
+ "User ID=username;Password=password");
protected void btn_Add_Click(object sender, EventArgs e)
{
SqlTransaction trans = null;
using (var con = new SqlConnection(_constring))
{
con.Open();
trans = con.BeginTransaction();
using (
string sqlStatement ="//SqlStuff";
var sqlCmd = new SqlCommand(sqlStatement,con))
{
sqlCmd.Transaction = trans;
sqlCmd.Connection = con;
try
{
//sqlcmd.Parameters Stuff
sqlCmd.ExecuteNonQuery();
trans.Commit();
//SUCCESS
}
catch (Exception er)
{
error.InnerHtml = er.ToString();
return;
}
finally
{
con.Close();
}
}
}
}
对
除了在一个函数中有太多代码,没有使用using
语句等,这个事件处理程序函数将被多次调用的唯一原因是它被连接了不止一次。检查你的AutoEventWireUp设置,代码前面的OnClick按钮的定义,和一个显式的事件连接在你的代码后面(可能看起来像btn_Add.Click += btn_Add_Click;
.