2010-07-22 131 views
1

我正在使用adapter.InsertCommand將一些數據插入表中。SQL插入查詢執行兩次

唯一的問題是它執行了兩次,因此給我在數據庫中的雙重條目。 我試過按照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(); 

    } 
} 

安妮建議?

UPDATE

權,一些調試後,我發現我的newWallComplaint_Click功能被解僱了兩次。這是becuae我有以下代碼:

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

不檢查回發,這也執行我的功能後提交也。所以爲了避免我的函數運行兩次,我添加了一個PostBack檢查。

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

    } 

現在我的查詢沒有運行兩次。

+4

做一些調試,並找出函數是否正在運行不知何故兩次或者如果實際執行SQL兩次。 – 2010-07-22 13:08:57

+0

我想你的標題說明了這一切 - 「SQL插入查詢確實執行了兩次」! – 2010-07-22 13:19:31

+0

我已經看到用戶「雙擊」一個按鈕(按鈕只需要一次單擊),導致底層代碼運行兩次,你確定這樣的事情沒有發生在這裏嗎? – 2010-07-22 13:26:42

回答

2

我看不到任何代碼會執行兩次。我假設它被調用兩次。在addNewComment處設置一個斷點,如果它被調用兩次,則查看堆棧跟蹤,以查看兩次調用的位置。

也許你有一個事件被稱爲兩次例如。如果你已經啓用了事件的自動佈線並且明確地將事件連接起來,那麼這可能發生在ASP.NET中。

順便說一句,你應該肯定使用parametrized queries而不是字符串連接。我假設評論是用戶提供的輸入?在這種情況下,您正在使用您顯示的代碼設置自己的SQL注入攻擊。

+1

謝謝。調試不起作用,但我擅長輸出字符串。事實證明,我沒有在頁面加載時使用if(!isPostBack),因此執行了兩次我的腳本。查看更新的代碼。 – Steven 2010-07-22 14:01:04

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

希望它可以幫助別人......