2013-12-13 47 views
1

是否有插入的方式if/else語句到下面一行在這裏:有條件的SQL語句 - 插入/更新查詢之間切換

command.CommandText = "UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3"; 

在一個情況下ID =值3(換句話說,行已存在)可以發現,然後更新查詢需要的地方,但它無法找到我想要插入查詢發生:

command.CommandText = "INSERT INTO Table1 (ID,Team) VALUES (value1,value2)"; 

採取地方...我怎麼能做到這一點?

private void button1_Click(object sender, EventArgs e) 
{ 
    // save to access database when user clicks on the save button 
    using (OleDbConnection conn = new OleDbConnection()) 
    { 
     //the file path of mdb 
     string filepath = @"C:\Users\sy\Visual Studio 2008\Projects\demo\demo\CE_Database.mdb"; 
     conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" + filepath + ";"; 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = conn; 
     //your update satemenet 
     command.CommandText = "UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3"; 
     conn.Open(); 
     //update to ms access 
     command.ExecuteNonQuery(); 
     conn.Close(); 
    } 
} 
+0

你怎麼知道該行是否存在?您是否查詢數據庫,以便您在某個時間點存在Id? – scheien

+0

注意您不必在'using'塊中明確關閉連接。 –

+0

@ZevSpitz:真的嗎?參考? – dotNET

回答

2

由於command.ExecuteNonQuery();將返回受影響的行數,你可以檢查一下這個從更新命令返回,如果記錄不存在,該方法將返回0 ,那麼你就可以然後發展到插入方法:

private string filepath = @"C:\Users\sy\Visual Studio 2008\Projects\demo\demo\CE_Database.mdb"; 
private string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" + filepath + ";"; 

private void button1_Click(object sender, EventArgs e) 
{  
    if (this.Update() == 0) 
    { 
     this.Insert(); 
    } 
} 

private int Update() 
{ 
    using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    using (OleDbCommand command = new OleDbCommand("UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3", conn); 
    { 
     conn.Open(); 
     return command.ExecuteNonQuery(); 
    } 
} 
private int Insert() 
{  
    using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    using (OleDbCommand command = new OleDbCommand("INSERT INTO Table1 (ID,Team) VALUES (value1,value2)", conn); 
    { 
     conn.Open(); 
     return command.ExecuteNonQuery(); 
    } 
} 

要清理的答案意見,OleDbConnection.Dispose()方法看起來像這樣的:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this._userConnectionOptions = null; 
     this._poolGroup = null; 
     this.Close(); 
    } 
    this.DisposeMe(disposing); 
    base.Dispose(disposing); 
} 

所以連接將被Dispose方法被關閉,所以沒有需要再調用Close()當你的連接是在使用塊

+0

比我的回答更好的寫作:> – scheien

0

聽起來像是在MERGE聲明之後......這在JET版本的SQL中不存在。這會爲大多數事情的工作,雖然:

UPDATE Table1 RIGHT JOIN Table2 
ON Table1.[KeyField] = Table2.[KeyField] 
SET Table1.[KeyField] = Table2.[KeyField], 
Table1.[OtherField] = Table2.[OtherField] 

如果是在Table2,它會被插入到Table1,覆蓋值(更新),如果它已經在Table1

0

很簡單。在運行INSERTUPDATE之前,通過SELECT COUNT(*)查詢檢查ID = 3是否存在。

0

您可以先用ExecuteNonQuery()執行UPDATE查詢,該查詢返回受影響的行數。

如果受影響的行是0,那麼您將運行INSERT查詢。

  //the file path of mdb 
      string filepath = @"C:\Users\sy\Visual Studio 2008\Projects\demo\demo\CE_Database.mdb"; 
      conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" + filepath + ";"; 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = conn; 
      //your update satemenet 
      command.CommandText = "UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3;"; 
      conn.Open(); 
      //update to ms access 
      int affectedRows = command.ExecuteNonQuery(); // returns 1 if the row exist, 0 if it does not. 

      if (affectedRows == 0) 
      { 
        command.CommandText = "INSERT INTO Table1 (ID,Team) VALUES (value1,value2)"; 
        command.ExecuteNonQuery(); // perform insert 
      } 

      conn.Close() 

編輯:正如Gord Thompson指出的,原來的解決方案並沒有工作。 ExecuteScalar()與「更新.....;選擇@@ ROWCOUNT」。將其更改爲使用ExecuteNonQuery,並從該方法獲取受影響的行數。

使用@@ ROWCOUNT

舊的解決方案:

  command.CommandText = "UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3; SELECT @@ROWCOUNT;"; 
      conn.Open(); 
      //update to ms access 
      int affectedRows = (int)command.ExecuteScalar(); // returns 1 if the row exist, 0 if it does not. 

      if (affectedRows == 0) 
      { 
        command.CommandText = "INSERT INTO Table1 (ID,Team) VALUES (value1,value2)"; 
        command.ExecuteNonQuery(); // perform insert 
      } 
+0

不好。我將編輯它以使用Executenonquery(),並刪除@@ rowcount。 :) – scheien

-1

使用@@ ROWCOUNT

command.CommandText = "UPDATE Table1 SET ID=value1,Team=value2 WHERE ID=value3 IF @@ROWCOUNT = 0 INSERT INTO Table1 (ID,Team) VALUES (value1,value2)" 

編輯:正如戈德說這不起作用,我太快了,沒有注意到它的訪問。

This是一個類似的問題和解決方案。

+1

這在Access中不起作用。 –