3 Stimmen

SqlCommand SQL-Anweisung wird zweimal ausgeführt

Ich erstelle eine ASP.NET-Anwendung mit C# und jedes Mal, wenn ich versuche, ein SQL INSERT mit SqlCommand zu tun, wird der Befehl zweimal ausgeführt. Ich implementiert, was in diesem Beitrag war ( SQL Insert-Abfrage wird zweimal ausgeführt ), aber es hilft trotzdem nicht.

Hier ist der Code:

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

Ich habe es im Debug-Modus ausgeführt und sqlCmd.ExecuteNonQuery() wird nur einmal aufgerufen, aber ich habe zwei identische Einträge hinzugefügt.

Was übersehe ich und/oder mache ich falsch?

-------- EDIT --------

Ich habe eine modifizierte Version von John Ryan Code, wurde aber trotzdem zweimal hinzugefügt.

Hier ist der gesamte Code, der dazu gehört:

Ausstattung.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">&nbsp;</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>

Ausstattung.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 = "&nbsp;";

            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 --------

Ich habe die Ursache für die "doppelte Ausführung" der SQL-Anweisung in diesem Codestück ausfindig gemacht:

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

Wenn ich sie auskommentiere, werden die Informationen einmal hinzugefügt, aber die Schaltfläche wird nicht wie gewünscht deaktiviert. Durch die Deaktivierung der Schaltfläche wird verhindert, dass Leute ungeduldig sind und die Schaltfläche mehrmals anklicken.

Vorschläge?

Ich bekomme Folgendes:

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

führt die SQL-Anweisung zweimal aus

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

ändert kurz "btn_Add" in der gewünschten Weise, führt aber nicht den Code für "btn_Add_Click" aus

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

ändert "btn_Add" in der gewünschten Weise, führt den Code für "btn_Add_Click" nicht aus und aktualisiert die gesamte Seite auf Equipment.aspx (normalerweise wird Equipment.aspx durch ein jquery .load-Ereignis in ein div geladen)

3voto

MacGyver Punkte 17368

Ein paar Vorschläge...

  • Verbindungsstrings sollten in Ihrer web.config-Datei gespeichert werden.

  • ist es in Ordnung, Ihre Ausnahmen für jeden Schritt auf dem Weg abzufangen, aber verwenden Sie eine "using"-Anweisung. Auf diese Weise müssen Sie sich nicht um die Entsorgung Ihres Objekts kümmern.

  • Ich würde empfehlen, eine Global.asax-Datei zu Ihrem Projekt hinzuzufügen und Anwendungsfehler dort abzufangen. In Ihren catch-Anweisungen könnten Sie eine Zeile mit der Aufschrift "throw new Exception " einfügen und Ihre spezifische Ausnahme angeben, damit sie leicht zu fangen ist und Sie den Fehler beschreiben können. Dann würde ich empfehlen, den Logging-Anwendungsblock in der Enterprise Library 5.0 einzurichten. Eine globale "Fehler"-Variable, wie Sie sie haben, ist wahrscheinlich keine gute Idee. Wenn Sie Enterprise Library auf einfache Weise erlernen möchten, laden Sie die Enterprise Library Labs-Beispiele herunter.

  • Ich würde keine SQL-Befehle direkt in Ihrem Code verwenden. Ich würde gespeicherte Prozeduren verwenden und das SQL auf dem SQL-Server selbst ausführen lassen. Wenn Sie Variablen haben, richten Sie Parameter für die gespeicherte Prozedur ein. Gespeicherte Prozeduren sind für Ihre Webanwendung sicherer. Es könnte sogar eine gute Idee sein, den Datenbankanwendungsblock aus Microsofts Enterprise Library zu verwenden. Sie müssen nur die Bibliothek importieren und die Befehle kennen. Alle Auswirkungen auf die Leistung werden für Sie erledigt.

  • wenn Sie eine using-Anweisung verwenden, müssen Sie die Verbindung nicht schließen oder entsorgen. Ich habe das im Code entfernt.

  • Wenn Sie eine Ausnahme auslösen, ist die "return"-Anweisung nicht erforderlich... der nächste Block auf dem Stapel mit einer catch-Anweisung (oder finally-Anweisung), die sich qualifiziert, fängt sie ab. Wenn es keine gibt, wird der Application_Error in Global.asax ihn abfangen. Stellen Sie sicher, dass Sie unbehandelte Ausnahmen im .NET-Framework richtig behandeln. Microsoft hat die Architektur für unbehandelte Ausnahmen in .NET 3.5 abgeschafft, so dass Sie entweder Ihr eigenes Modul hinzufügen oder zur Architektur von 1.1 zurückkehren müssen. Oder aktualisieren Sie auf .NET 4.0.

  • Die eigentliche Frage: Ihr Klick-Ereignis wird möglicherweise zweimal aufgerufen, weil Sie einen Handler verwenden UND das Ereignisattribut "onclick" in Ihrem <asp:button source tag angegeben haben. In VB würde das Wort "Handles" der Ereignismethode folgen. In C# könnte der Handler an einer anderen Stelle stehen, mit einer anderen Art von Syntax. Er wird zweimal aufgerufen, wenn Sie beide dort haben.

Hier ist Nr. 1: <asp:Button ID="btn_Add" Text="Hinzufügen" CssClass="ui-state-default ui-corner-all" runat="server" OnClick="btn_Add_Click" />

Hier ist die Nummer 2: btn_Add.OnClientClick = ClientScript.GetPostBackEventReference(optionsSubmit);

Wenn Sie das onclick-Attribut auf Ihrem Steuerelement haben, dann brauchen Sie keinen speziellen Code hinzuzufügen (wie OnClientClick oder Event-Handler). Verwenden Sie einfach 1 oder das andere.

Viel Glück für Sie!


        error.InnerHtml = "&nbsp;";

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

1voto

yapingchen Punkte 816

Die "Rückgabe", die in den beiden Verschlüssen

y

die finally-Anweisung für jedes Try hinzufügen

und verschieben Sie die

 sqlCmd.Dispose();             sqlCmd = null;             MyConn.Close(); 

in den schließlich

Wenn Sie debuggen, können Sie sehen, die Anweisung einfügen, ob richtig ist. dann schauen Sie die Datenbank.

0voto

BizApps Punkte 6000

@Jesus Ramos hat Recht.

Machen Sie etwas in dieser Art.

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

            }
        }
    }

Mit freundlichen Grüßen

0voto

Sumo Punkte 3978

Abgesehen davon, dass sie zu viel Code in einer Funktion enthalten, ist die Nichtverwendung von using Anweisungen usw. ist der einzige Grund dafür, dass diese Event-Handler-Funktion mehr als einmal aufgerufen wird, dass sie mehr als einmal verdrahtet wird. Überprüfen Sie Ihre AutoEventWireUp-Einstellung, den Code-in-Front für eine Definition von OnClick auf der Schaltfläche, und eine explizite Ereignis-Verdrahtung in Ihrem Code-behind (würde wahrscheinlich aussehen wie btn_Add.Click += btn_Add_Click; .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X