PDA

View Full Version : مبتدی: ایجاد تابعی با نوع برگشتی متغیر و نامعلوم



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

rahnema1
سه شنبه 01 اردیبهشت 1394, 19:36 عصر
سلام
نمیدونم چه طور شما برنامه را کامپایل کردید
در هر صورت چون sqlite به زبان c هست معمولا کتابخونه sqlite در ابتدا کامپایل میشه سپس در برنامه سی پلاس پلاس از کتابخونه کامپایل شده استفاده می شه احتمالا در این مورد خطا بوده
گذشته از این، اینجوری که نمیشه به طور اتوماتیک با template نوع داده را استخراج کرد این لینک را ببینید:
http://www.sqlite.org/c3ref/column_blob.html
شما لازمه یک نوع داده مثلا به نام SqliteDataType ایجاد کنید و تعدادی نوع را از طریق ارث بری از اون مشتق کنید مثلا SqliteInteger یا SqliteFloat که این انواع متناظر با انواع sqlite هست که در جدول اومده
و احتمالا لازمه از تابعهای virtual استفاده کنید و همچنین احتمالا عملگرهایی مثل << که مربوط به sstream هست را به صورت friend برای هر کلاس تعریف کنید زیرا نوع برگشتی تابع sqlite3_column_text یک رشته بانوع * unsigned char هست که لازمه به کلاس مورد نظر شما تبدیل بشه
مباحثی مثل چند ریختی و ارث بری و امثال اینها را دنبال کنید
وقتی ساختار مناسب داده ها ایجاد شد ابتدا باید نوع ستونهای جدول sqlite را با sqlite3_column_type استخراج کنید.
جدول شما در سی پلاس پلاس در واقع SqliteDataType خواهد بود که ستونهای آن را داده های مشتق شده مثل SqliteInteger تشکیل می دهند

Mori Bone
پنج شنبه 03 اردیبهشت 1394, 10:10 صبح
ممنون rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) عزیز.
از حرفای شما یه چیزایی فهمیدم و اون لینکتون خیلی به دردم خورد
من اینهمه گشتم تو نت هیچی پیدا نکردم، نمیدونم یهو این لینک (http://www.codeproject.com/Articles/6343/CppSQLite-C-Wrapper-for-SQLite#_articleTop) از کجا پیداش شد:کف: که خیلی عالی بود

rahnema1
پنج شنبه 03 اردیبهشت 1394, 11:19 صبح
فقط یک نکته
این کد باز هم مشکل تبدیل نوعها را حل نمی کنه!

ali chegini
سه شنبه 08 اردیبهشت 1394, 23:08 عصر
سلام . ببین با نوع VARIANT می تونی؟
http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
http://stackoverflow.com/questions/208959/c-variant
https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627%28v=vs.85%29.aspx