SQL CE 3.5 проблема с доступом к таблице TableDirect - PullRequest
1 голос
/ 30 марта 2011

Я пытаюсь вставить сотни записей в пустую таблицу базы данных, используя тип TableDirect SqlCeCommand. Проблема в том, что я получаю исключение SqlCeException "Unspecified error" при вызове SqlCeResultSet :: Insert. Ниже мой код. Есть намеки?

Спасибо

    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 голосов
/ 31 марта 2011

Я не уверен, как ваше соединение управляется с помощью менеджера баз данных, который может быть виновником - убедитесь, что вы используете одно соединение (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();
    }
} 
...