8

Ich habe eine SQL Compact Edition-Datenbank, die ich regelmäßig aktualisieren (über Webdienste).Aktualisieren/Einfügen in eine Tabelle mit SQLCeResultSet

Der Teil, wo ich in die Datenbank schreibe, dauert viel zu lange. Ich mache es gerade mit Linq zu Datasets (wie in this question gesehen). Ich habe heard, wenn ich es mit SQLCeResultSet mache, dass es schneller arbeitet.

So gegeben, dass ich eine Tabelle wie folgt aus:

 
tblClient 
    +- CLIENT_ID  {Unique identifier} (Primary Key) 
    +- CLIENT_NAME {varchar (100)} 
    +- CLIENT_ACTIVE {bit}

Und ich habe es in Objekt, das ich von meiner Web-Services erhalten, die wie folgt aussehen:

class Client 
{ 
    public Guid ClientID { get; set; } 
    public String ClientName { get; set; } 
    public bool Active { get; set; } 
} 

Wie würde ich Holen Sie 100 Client-Objekte in die Datenbank?

aktualisiert vorhandene Zeilen und Einfügen Zeilen, die nicht bereits in der Datenbank (von dem Primärschlüssel bestimmt) sind?

Jeder Beispielcode wäre großartig. Ich habe eine SqlCeConnection, aber sonst nichts.

Danke für jede Hilfe!

Antwort

13

Es wird so etwas wie folgt aussehen:

(Edited für Einfügen oder Aktualisieren von)

void Foo(SqlCeConnection connection) 
{ 
    using (var cmd = new SqlCeCommand()) 
    { 
     cmd.CommandType = CommandType.TableDirect; 
     cmd.CommandText = "MyTableName"; 
     cmd.Connection = connection; 
     cmd.IndexName = "PrimakryKeyIndexName"; 

     using (var result = cmd.ExecuteResultSet(
          ResultSetOptions.Scrollable | ResultSetOptions.Updatable)) 
     { 
      int pkValue = 100; // set this, obviously 

      if (result.Seek(DbSeekOptions.FirstEqual, pkValue)) 
      { 
       // row exists, need to update 
       result.Read(); 

       // set values 
       result.SetInt32(0, 1); 
       // etc. 

       result.Update(); 
      } 
      else 
      { 
       // row doesn't exist, insert 
       var record = result.CreateRecord(); 

       // set values 
       record.SetInt32(0, 1); 
       // etc. 

       result.Insert(record); 
      } 
     } 
    } 
} 
+0

Ich stelle fest, dass kein Anruf dort zu aktualisieren ist. Führt Insert eine Aktualisierung durch, wenn die Zeile bereits existiert? – Vaccano

+1

ResultSetOptions sollte auf Updatable festgelegt werden. Mein Verständnis ist Update() gilt nur für vorhandene Datensätze, keine Einsätze. –

+0

Sorry, das war nur für Einsätze. Sie müssen die Logik ändern, wenn Sie Ersetzungen vornehmen möchten. Ich würde eine Suche auf dem PK-Feld machen, dann eine Leseoperation durchführen, wenn der Lesevorgang wahr ist, dann den Datensatz ändern und aktualisieren, andernfalls erstellen und einfügen. – ctacke