Mori Bone
سه شنبه 01 اردیبهشت 1394, 12:59 عصر
سلام.
من یه کلاس دارم برای مدیریت بانک اطلاعاتی sqlite. حالا توی این کلاس یه تابع دارم که اسم فیلد رو میگیره و مقدارش رو برمی گردونه. حالا میخوام نوع مقدار برگشتی با نوع فیلد یکی باشهمن کده زیر رو نوشتم ولی ارروری رو که گذاشتم رو نشون میده. لطفا کمک کنید.
تابع GetFieldData رو میگم
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include "sqlite3.h"
using namespace std;
#define DBName "DB_PassManager.sqlite"
#pragma once
class SqilteDB
{
private:
bool isConnect;
sqlite3 *dbfile;
public:
int GetRowCount(char* query);
template <class T>
T GetFieldData(string tableName, string fieldName, string fieldCondition);
bool Connect();
void Disconnect();
SqilteDB();
~SqilteDB();
};
#include "stdafx.h"
#include "Class_SqilteDB.h"
int SqilteDB::GetRowCount(char* query)
{
sqlite3_stmt *statement;
if (sqlite3_prepare(this->dbfile, query, -1, &statement, 0) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ERROR) {
return -1;
}
else {
return sqlite3_column_int(statement, 0);
}
}
return -1;
}
template <class T>
T SqilteDB::GetFieldData(string tableName, string fieldName, string fieldCondition)
{
sqlite3_stmt *statement;
std::stringstream strm;
strm << "SELECT " + fieldName + " FROM " + tableName + " WHERE " + fieldCondition;
string s = strm.str();
char *str = &s[0];
char *query = str;
if (sqlite3_prepare(this->dbfile, query, -1, &statement, 0) == SQLITE_OK)
{
int ctotal = sqlite3_column_count(statement);
int res = 0;
res = sqlite3_step(statement);
if (res == SQLITE_ROW)
{
return (T)sqlite3_column_text(statement, 0);
}
}
return (T)NULL;
}
bool SqilteDB::Connect()
{
if (sqlite3_open(DBName, &this->dbfile) == SQLITE_OK)
{
this->isConnect = true;
return true;
}
return false;
}
void SqilteDB::Disconnect()
{
if (this->isConnect)
{
sqlite3_close(this->dbfile);
}
}
SqilteDB::SqilteDB()
{
}
SqilteDB::~SqilteDB()
{
this->Disconnect();
}
Error 1 error LNK2019: unresolved external symbol "public: bool __thiscall SqilteDB::GetFieldData<bool>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??$GetFieldData@_N@SqilteDB@@QAE_NV?$basic_string @DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00@ Z) referenced in function "public: bool __thiscall User::setUsername(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setUsername@User@@QAE_NV?$basic_string@DU?$char_ traits@D@std@@V?$allocator@D@2@@std@@@Z) G:\Projects\CPP\ConsolPassManager\ConsolPassManage r\Class_User.obj ConsolPassManager
من یه کلاس دارم برای مدیریت بانک اطلاعاتی sqlite. حالا توی این کلاس یه تابع دارم که اسم فیلد رو میگیره و مقدارش رو برمی گردونه. حالا میخوام نوع مقدار برگشتی با نوع فیلد یکی باشهمن کده زیر رو نوشتم ولی ارروری رو که گذاشتم رو نشون میده. لطفا کمک کنید.
تابع GetFieldData رو میگم
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include "sqlite3.h"
using namespace std;
#define DBName "DB_PassManager.sqlite"
#pragma once
class SqilteDB
{
private:
bool isConnect;
sqlite3 *dbfile;
public:
int GetRowCount(char* query);
template <class T>
T GetFieldData(string tableName, string fieldName, string fieldCondition);
bool Connect();
void Disconnect();
SqilteDB();
~SqilteDB();
};
#include "stdafx.h"
#include "Class_SqilteDB.h"
int SqilteDB::GetRowCount(char* query)
{
sqlite3_stmt *statement;
if (sqlite3_prepare(this->dbfile, query, -1, &statement, 0) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ERROR) {
return -1;
}
else {
return sqlite3_column_int(statement, 0);
}
}
return -1;
}
template <class T>
T SqilteDB::GetFieldData(string tableName, string fieldName, string fieldCondition)
{
sqlite3_stmt *statement;
std::stringstream strm;
strm << "SELECT " + fieldName + " FROM " + tableName + " WHERE " + fieldCondition;
string s = strm.str();
char *str = &s[0];
char *query = str;
if (sqlite3_prepare(this->dbfile, query, -1, &statement, 0) == SQLITE_OK)
{
int ctotal = sqlite3_column_count(statement);
int res = 0;
res = sqlite3_step(statement);
if (res == SQLITE_ROW)
{
return (T)sqlite3_column_text(statement, 0);
}
}
return (T)NULL;
}
bool SqilteDB::Connect()
{
if (sqlite3_open(DBName, &this->dbfile) == SQLITE_OK)
{
this->isConnect = true;
return true;
}
return false;
}
void SqilteDB::Disconnect()
{
if (this->isConnect)
{
sqlite3_close(this->dbfile);
}
}
SqilteDB::SqilteDB()
{
}
SqilteDB::~SqilteDB()
{
this->Disconnect();
}
Error 1 error LNK2019: unresolved external symbol "public: bool __thiscall SqilteDB::GetFieldData<bool>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??$GetFieldData@_N@SqilteDB@@QAE_NV?$basic_string @DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00@ Z) referenced in function "public: bool __thiscall User::setUsername(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setUsername@User@@QAE_NV?$basic_string@DU?$char_ traits@D@std@@V?$allocator@D@2@@std@@@Z) G:\Projects\CPP\ConsolPassManager\ConsolPassManage r\Class_User.obj ConsolPassManager