应用程序崩溃访问新数据库

时间:2009-10-09 05:47:43

标签: c++ symbian

我的应用程序在从数据库读取/写入数据时崩溃。我在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 ) );

db creation:

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

答案 0 :(得分:1)

User:: LeaveIfError()返回错误代码时,

iDatabase.Execute()会抛出异常。

您可以在NewLC

找到最常见的Symbian错误代码

如果在RDbDatabase::Execute()实际运行之前发生了崩溃,我们需要查看更多代码,以找出iDatabase处于错误状态的原因。

答案 1 :(得分:0)

您需要解释“崩溃”的含义 - 异常/离开?恐慌?如果是这样,什么离开代码,或什么恐慌类别和数字?

如果它在这里“崩溃”

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”表示清理项目。