SQL Insert查询执行两次

时间:2010-07-22 13:07:13

标签: c# .net sql sql-server-2005

我正在使用adapter.InsertCommand将一些数据插入表格中。

唯一的问题是它被执行了两次,因此在DB中给我两个条目。 我已经尝试在adapter.InsertCommand的文档和我自己的代码中遵循示例,但得到相同的结果。

这是我的代码:

public class nokernokDAL
{
    SqlConnection connection = new SqlConnection();
    SqlDataAdapter adapter = new SqlDataAdapter();

    public nokernokDAL()
    {
        connection.ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString();
        connection.Open();
    }

    public void addNewComment(int userID, int pageID, string title, string comment)
    {
        string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " +
                       "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')";

        adapter.InsertCommand = new SqlCommand(query, connection);
        adapter.InsertCommand.ExecuteNonQuery();

    }
}

Anny建议如何避免这种情况?

更新

对,经过一些调试后,我发现我的newWallComplaint_Click函数被触发了两次。这是因为我有以下代码:

    protected void Page_Load(object sender, EventArgs e)
    {
            btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click);
    }

不检查PostBack,这也是在提交后执行我的功能。因此,为了避免我的函数运行两次,我添加了一个PostBack检查。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click);
        }

    }

现在我的查询没有运行两次。

3 个答案:

答案 0 :(得分:2)

我在代码中看不到会执行两次的任何内容。我假设它被调用了两次。在addNewComment处设置一个断点,如果它被调用两次,请查看堆栈跟踪以查看在两种情况下从哪里调用它。

例如,你可能有两次被调用的事件。如果您已启用事件的自动连接并且已明确连接事件,则可能会在ASP.NET中发生这种情况。

顺便说一句,你绝对应该使用parametrized queries而不是字符串连接。我假设评论是用户提供的输入?在这种情况下,您将使用您显示的代码为自己设置SQL注入攻击。

答案 1 :(得分:1)

我发现我有数据表和数据集但只需要数据表......

因为我让它们在同一个命令中彼此相邻,所以创建了一个副本......

确保你使用命令中的所有内容,即使你像我一样醒了2天,你也能理解每个人的所作所为......

            DataSet dataset = new DataSet();

            data.Fill(dataset, "data");

            // Populate a new data table and bind it to the BindingSource.
            DataTable datatable = new DataTable();
            data.Fill(datatable);

你可以看到我有两个源填充一个MySqlDataAdapter ......

            //removing the following two lines fixed my duplicates issue...
            //DataSet dataset = new DataSet();
            //data.Fill(dataset, "data");

            // Populate a new data table and bind it to the BindingSource.
            DataTable datatable = new DataTable();
            data.Fill(datatable);

希望它可以帮助某人...

答案 2 :(得分:0)

你真的需要一个DataAdapter吗?也许你可以试试这个。

 public class nokernokDAL
 {
     string connectionString;

     public nokernokDAL()
     {
         ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString();
     }

     public void addNewComment(int userID, int pageID, string title, string comment)
     {
         string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " +
                        "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')";

         using (SqlConnection conn = new SqlConnection(_connString))
         {
             SqlCommand cmd = conn.CreateCommand();
             cmd.CommandText = Query;
             conn.Open();
             cmd.ExecuteNonQuery();
         }
     }
 }