TableDirect 表访问的 SQL CE 3.5 问题

Posted

技术标签:

【中文标题】TableDirect 表访问的 SQL CE 3.5 问题【英文标题】:SQL CE 3.5 problem with TableDirect table access 【发布时间】:2011-03-30 13:54:50 【问题描述】:

我尝试使用 TableDirect 类型的 SqlCeCommand 将数百条记录插入到空数据库表中。问题是我在调用 SqlCeResultSet::Insert 时遇到异常 SqlCeException“未指定错误”。下面是我的代码。有什么提示吗?

谢谢

    public bool StoreEventsDB2(List<DAO.Event> events)
    
        try
        

            SqlCeCommand command = new SqlCeCommand("Event");
            command.CommandType = System.Data.CommandType.TableDirect;

            SqlCeResultSet rs = _databaseManager.ExecuteResultSet(command, ResultSetOptions.Updatable | ResultSetOptions.Scrollable );

            foreach (DAO.Event theEvent in events)
            
                SqlCeUpdatableRecord record = rs.CreateRecord();
                record.SetInt32( 0, theEvent.ID );
                record.SetInt32( 1, theEvent.ParentID);
                record.SetString(2, theEvent.Name);
                record.SetDateTime(3, theEvent.DateTime);

                record.SetDateTime(4, theEvent.LastSynced);
                record.SetInt32(5, theEvent.LastSyncedTS);

                record.SetString(6, theEvent.VenueName);
                record.SetBoolean(7, theEvent.IsParentEvent);

                record.SetDateTime(11, DateTime.Now);

                rs.Insert(record);
            

        
        catch (SqlCeException e)
        
            Log.Logger.GetLogger().Log(Log.Logger.LogLevel.ERROR, "[EventManager::StoreEventsDB] error: 0", e.Message);
            return false;
        
        catch (Exception e)
        
            Log.Logger.GetLogger().Log(Log.Logger.LogLevel.ERROR, "[EventManager::StoreEventsDB] error: 0", e.Message);
            return false;
        
        return true;
    

【问题讨论】:

【参考方案1】:

我不确定如何使用数据库管理器管理您的连接,这可能是罪魁祸首 - 确保您使用的是一个连接(sqlce 不能很好地发挥作用)。也不需要结果集选项“ResultSetOption.Scrollable”(至少我从未将它用于插入)。

以下是我在执行直接表插入时使用的语法。每个数据库/数据访问对象都包含在 using 语句中,以便在使用后处理对象 - 这非常重要,尤其是对于紧凑型框架和 sqlce,因为垃圾收集不太理想(您将出现内存不足异常!)。我还在您的代码中添加了一个事务,因此该选项是全有或全无。

希望这会有所帮助:

using (var transaction = connection.BeginTransaction())

    using (var command = connection.CreateCommand())
    
        command.Transaction = transaction;
        command.CommandType = CommandType.TableDirect;
        command.CommandText = "Event";

        using (var rs = command.ExecuteResultSet(ResultSetOptions.Updatable))
        
            var record = rs.CreateRecord();

            foreach (DAO.Event theEvent in events)
            
                record.SetInt32(0, theEvent.ID);
                record.SetInt32(1, theEvent.ParentID);
                record.SetString(2, theEvent.Name);
                record.SetDateTime(3, theEvent.DateTime);
                record.SetDateTime(4, theEvent.LastSynced);
                record.SetInt32(5, theEvent.LastSyncedTS);
                record.SetString(6, theEvent.VenueName);
                record.SetBoolean(7, theEvent.IsParentEvent);
                record.SetDateTime(11, DateTime.Now);
                rs.Insert(record);
            
        
        transaction.Commit();
    
 

【讨论】:

以上是关于TableDirect 表访问的 SQL CE 3.5 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 SQL Server CE 3.5 更改跟踪表无限增长?

如何检查 SQL Server CE 3.5 中是不是存在表

Web Developer/WebMatrix:编辑时 SQL CE 数据库表错误

使用服务器资源管理器 GUI(VS) 是不是可以在 SQL CE 3.5 数据库的表之间创建一对多关系?

使用 LINQ To SQL / SQL CE 创建表

SQL CE Compact 3.5 表的标识列