2012-09-23 83 views
7

如果INSERT行如果還不存在於SQL Server CE數據庫表中並且UPDATE它如果存在?SQL Server CE:如果存在update else insert

我已經嘗試了很多SQL查詢並不斷收到錯誤。這不起作用。

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue') 
    UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
ELSE 
    INSERT INTO Table1 VALUES (...) 

更新

我發現這個這是爲我工作。歡迎任何其他好建議。

INSERT INTO Table1 VALUES (...) 
    SELECT (........) 
    WHERE NOT Exists (SELECT ........) 
    -- INSERT with Default value if not exist. Next, UPDATE it 
    UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
+0

您是否期望有任何可能發生所有併發性,或者此數據庫是否適用於單個用戶應用程序? –

+0

@MartinSmith,這是一個單用戶移動應用程序。 – user960567

+0

另請參閱:http://stackoverflow.com/questions/728373/performing-insert-or-update-upsert-on-sql-server-compact-edition – Seph

回答

2

我知道你已經標記了SQL和SQL服務器-CE但如果你打開使用C#代碼來解決這個問題..:

使用C#和結果集,這是我爲我的移動應用程序使用SQL CE:

  // UpdateRow is a struct/class to hold the data for each row 
      // SqlCeConn = connection string for db 

      SqlCeCommand cmd = new SqlCeCommand("Table1", SqlCeConn); 
      cmd.CommandType = CommandType.TableDirect; 
      cmd.IndexName = "Column1"; 

      using (SqlCeResultSet rsltSet = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable)) 
      { 
       if (UpdateRow.Column1> 0) // or != "" if it's string etc 
       { 
        if (rsltSet.Seek(DbSeekOptions.FirstEqual, UpdateRow.Column1)) 
         FoundRecord = true; 
       } 
       rsltSet.Read(); 

       if (FoundRecord) 
       { 
        // Update 
        rsltSet.SetInt32(1, UpdateRow.Column1); 
        rsltSet.SetInt32(2, UpdateRow.Column2); 

        // etc 

        rsltSet.Update(); 
       } 
       else 
       { 
        // Insert new record 
        SqlCeUpdatableRecord record = rsltSet.CreateRecord(); 
        record.SetInt32(0, UpdateRow.Column1); 
        record.SetInt32(1, UpdateRow.Column2); 

        // etc 
        rsltSet.Insert(record, DbInsertOptions.PositionOnInsertedRow); 
       } 
      } 
      cmd.Dispose(); 
     } 
     catch (Exception e) 
     { 
      // Deal with exception 

     }