8

我有一个SQL Compact Edition数据库,我定期更新(通过Web服务)。使用SQLCeResultSet更新/插入表格

我写入数据库的部分太长了。我目前正在使用Linq来处理数据集(如this question所示)。我有heard,如果我使用SQLCeResultSet执行它,它将工作得更快。

所以,因为我有这样的一个表:

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

而且我已经在对象,我从我的Web服务得到看起来像这样的:

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

我怎么会获得100个客户端对象到数据库中?

更新现有行和插入行已经不在数据库(由主键确定的)?

任何示例代码都会很好。我有一个SqlCeConnection,但没有别的。

感谢您的帮助!

回答

13

这将是这个样子:

编辑的插入或更新

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

我注意到,没有调用Update。如果该行已经存在,Insert会执行更新吗? – Vaccano 2010-07-01 22:49:02

+1

ResultSetOptions应设置为可更新。我的理解是Update()只适用于现有记录,而不适用于插入。 – 2010-07-02 03:09:05

+0

对不起,这是只为插入。如果你想做替换,你将不得不修改逻辑。我会在PK字段上执行Seek,然后执行Read,如果读取返回true,然后修改记录并更新,否则创建并插入。 – ctacke 2010-07-02 13:40:57