SQL CE 3.5与TableDirect表访问的问题

时间:2011-03-30 13:54:50

标签: asp.net windows-mobile compact-framework sql-server-ce

我尝试使用TableDirect类型的SqlCeCommand将数百条记录插入空数据库表。问题是我在调用SqlCeResultSet :: Insert时遇到异常SqlCeException“Unspecified error”。以下是我的代码。任何提示?

由于

    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 个答案:

答案 0 :(得分:0)

我不确定如何使用数据库管理器来管理您的连接,这可能是罪魁祸首 - 确保您使用的是一个连接(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();
    }
}