Сбой приложения при доступе к новой базе данных - PullRequest
1 голос
/ 09 октября 2009

Сбой моего приложения при чтении / записи данных из базы данных. У меня есть одна база данных на C: и я скопировал и переименовал с другим именем. Следующий процесс - это то, что я использовал для копирования ... Пожалуйста, помогите мне, если у вас есть какие-либо предложения или решения.

RFs fs;
fs.Connect();

CFileMan* fileMan=CFileMan::NewL(fs);
CleanupStack::PushL(fileMan);

TInt err=fileMan->Copy(anOld,aNew);

CleanupStack::PopAndDestroy(fileMan);
fs.Close();

if(err==KErrNone)
return ETrue;
else
return EFalse;

Сбой в следующей строке при попытке вставить или получить какие-либо данные из базы данных.

User::LeaveIfError( iDatabase.Execute( strSQL ) );

Создание БД:

TBool Open = OpenL();

if (!Open)
{

User::LeaveIfError(iDbSession.Connect());

CleanupClosePushL(iDbSession);
CleanupClosePushL(iDatabase);

User::LeaveIfError(iDatabase.Replace(iDbSession, iDBPath ));

// create table
_LIT(KSQLtest,"CREATE TABLE testtable(id INTEGER,test1 VARCHAR(50),test2 VARCHAR(50))"); User::LeaveIfError(iDatabase.Execute(KSQLtest));

iDatabase.Compact();
iDatabase.Close();
iDbSession.Close();
CleanupStack::PopAndDestroy();
CleanupStack::PopAndDestroy();

Открыть базу данных:

User::LeaveIfError( iDbSession.Connect() );

CleanupClosePushL( iDbSession );

if ( KErrNone != iDatabase.Open(iDbSession, iDBPath))
{
iDbSession.Close();
CleanupStack::PopAndDestroy();
return EFalse;
}
else
{
CleanupClosePushL( iDatabase );
iIsDatabaseOpened = ETrue;
return ETrue;
}

Ответы [ 2 ]

1 голос
/ 09 октября 2009

User:: LeaveIfError() создает исключение, когда iDatabase.Execute() возвращает код ошибки.

Наиболее распространенные коды ошибок Symbian можно найти по адресу NewLC

Если сбой произойдет до того, как RDbDatabase::Execute() будет фактически запущен, нам нужно увидеть больше кода, чтобы выяснить, почему iDatabase находится в плохом состоянии.

0 голосов
/ 15 октября 2009

Вам нужно объяснить, что означает "сбой" - исключение / отпуск? паника? Если да, то какой код выхода или какая категория и номер паники?

Если он "падает" здесь

User::LeaveIfError( iDatabase.Execute( strSQL ) );

вы можете проверить возвращаемое значение, т.е.

TInt error = iDatabase.Execute( strSQL );
//Now log/display the error
User::LeaveIfError(error);

Несколько других примечаний:

  • Если вы используете CleanupClosePushL() для объекта, вам не нужно вызывать Close() и CleanupStack::PopAndDestroy(). Последний позвонит вам Close().
  • Ваша функция OpenL() использует сочетание кода выхода и возврата, что обычно считается плохим стилем. Кроме того, функции, которые оставляют что-либо в стеке очистки, обычно называются xxxxLC(), а завершающий «C» обозначает элемент очистки.
...