我正在尝试将gui实现为一个小型的c ++项目,现在我正在尝试在c ++ / cli中使用我的非托管c ++代码来使用Windows窗体。转换后我不能使用正常的sqlite所以我试图移动到托管sqlite版本,我得到错误代码: “尝试在类成员中包含SQLiteConnection时,”非托管类的成员不能具有ref类类型或接口类类型。
#pragma once
#include <list>
#include "CAlbum.h"
#include "CUser.h"
#include "CDataAccess.h"
using namespace System::Data::SQLite;
class CDatabaseAccess : public CDataAccess
{
private:
albums _albums;
users _users;
SQLiteConnection _sqldb;
int _lastId;
CPicture _topTaggedPicture;
albums _albumsOfUser;
pictures _picturesOfUser;
bool fileExistsOnDisk(const string& filename);
bool initDatabase();
public:
CDatabaseAccess();
~CDatabaseAccess();
bool open() override;
void close() override;
void clear() override;
// album related
const albums& getAlbums() override;
const albums& getAlbumsOfUser(int userId) override;
void insertAlbum(CAlbum& album) override;
void deleteAlbum(string albumName) override;
bool albumExists(string albumName) override;
CAlbum* openAlbum(string albumName) override;
void closeAlbum(CAlbum *pAlbum) override;
// picture related
void addPictureToAlbum(int albumId, CPicture& picture) override;
void removePictureFromAlbum(int albumId, int pictureId) override;
void tagUserInPicture(CPicture& picture, int userId) override;
void untagUserInPicture(CPicture& picture, int userId) override;
bool isUserTaggedInPicture(const CPicture& picture, int userId) override;
// user related
const users& getUsers() override;
void addUser(CUser& user) override;
void deleteUser(string userName) override;
bool userExists(string userName) override;
bool userExists(int userId) override;
CUser* getUser(int userId) override;
// user statistics
int countAlbumsOwnedOfUser(int userId) override;
int countAlbumsTaggedOfUser(int userId) override;
int countTagsOfUser(int userId) override;
float averageTagsPerAlbumOfUser(int userId) override;
// queries
const CUser* getTopTaggedUser() override;
const CPicture* getTopTaggedPicture() override;
const pictures& getTaggedPicturesOfUser(int userId) override;
// sql related
void setLastId(char* lastId);
void resetLastId();
};
答案 0 :(得分:1)
我不知道从本机c ++代码访问(而不是创建)托管对象的任何合理方法。
但这不是重点。你说你有一个c ++程序,你只想要一个c ++ / CLI(.Net)GUI。正如@AlgirdasPreidžius所说,你需要决定在哪里放置功能:在本机代码或托管代码中,但不能混合使用。
在您的情况下,您需要明确什么是核心代码和什么GUI,并尽量不混合。 核心必须与GUI无关(不使用!)。 GUI必须以非常控制的形式访问核心。在这种情况下,只需将指向您的核心中的本机类的指针插入到托管的clases中即可。它“只是有效”。您必须确定SQLite是属于核心还是属于GUI。我在这里看到的唯一技巧是在GUI和核心中以不同方式访问数据库:使用GUI中使用的System::Data::SQLite
的“托管”连接和本机核心代码的本地sqlite
连接。或者,如果托管版本可以生成本机句柄,您可以将其传递给核心代码,或创建采用本机连接的托管版本(如果System::Data::SQLite
具有该可能性)。
请参阅:Sqlite3DatabaseHandle定义,SQLiteConnection::Handle和how it is used to open a conection及其compare with native use。
也就是说,我有一个类似的问题(有一个c ++程序只需要一个c ++ / CLI(.Net)GUI。),它在我的机器上工作得很好。我想运行我的程序的所有其他机器都受到保护,我没有管理器,它始终是兼容.Net版本问题,我无法解决。根据我的需要,切换到Nana C++ GUI是一个更好的解决方案。我的核心代码已经与GUI无关,因此GUI更改并不是很困难。现在一切都是本机代码,并且通过静态链接,程序是一个小型便携式,可以在我的任何Windows机器中作为一个简单的用户运行。