2012-09-23 12 views
7

¿Cómo puedo INSERT una fila si aún no existe en una tabla de base de datos de SQL Server CE y UPDATE si existe?SQL Server CE: si existe la actualización else inserte

He intentado muchas consultas SQL y sigo recibiendo errores. Esto no está funcionando.

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

actualización:

he encontrado este que está trabajando para mí. Cualquier otra buena sugerencia es bienvenida.

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

¿Está esperando alguna posibilidad de simultaneidad o esta es la base de datos para una sola aplicación de usuario? –

+0

@MartinSmith, es una aplicación móvil para un solo usuario. – user960567

+0

Vea también: http://stackoverflow.com/questions/728373/performing-insert-or-update-upsert-on-sql-server-compact-edition – Seph

Respuesta

2

Sé que has etiquetado y sql sql-server-ce pero en caso de que esté abierta a la utilización de código C# para solucionar este problema ..:

usando C# y Conjuntos de resultados Esto es lo que lo hice para mi aplicación móvil usando 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 

     } 
Cuestiones relacionadas