2012-09-23 5 views
7

Как я могу указать INSERT строку, если она еще не существует в таблице базы данных SQL Server CE, и UPDATE если она существует?SQL Server CE: если существует обновление else insert

Я пробовал много SQL-запросов и продолжал получать ошибки. Это не работает.

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

Update:

Я нашел это, которое работает для меня. Любые другие хорошие предложения приветствуются.

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-Server-се, но в случае, если вы открыты для использования в 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 

     } 
Смежные вопросы