ورود

View Full Version : آموزش: مشکل در ارتباط با Database



woeful
پنج شنبه 02 تیر 1390, 21:07 عصر
سلام

خیلی خیلی ببخشید این آموزش نیست من مخواستم سوال بزنم اشتبا هی آموزش زدم .

من با کد زید یه table در سازنده کلاس درست میکنم.

void DataBase::createTables()
{
QSqlQuery qry ;
if (!qry.exec("create table if not exist address (adr varchar(256) , count int )"))
emit errorOccur(tr("Error Occur In Database Setup."),tr("Cannot Setup Database."));
}


و میخام با استفاده از کد زیر یه query از database بگیرم:

void DataBase::addIfNotExist(const QString url)
{
QSqlQuery qry;
qry.prepare("select * from address where adr=':site'");
qry.bindValue(":site", url);//*1*
qry.exec();
int addrNo = qry.record().indexOf("adr");//*2*
int countNo = qry.record().indexOf("count");//*3*
//other code ....


که به خطوطی که شماره گزاشتم ارور های زیر رو میگیرم :


//*1* >> error: no matching function for call to ‘QSqlQuery::bindValue(int, const QString&)’
//*2* >> error: invalid use of incomplete type ‘struct QSqlRecord’ /usr/include/qt4/QtSql/qsqldatabase.h:60:7: error: forward declaration of ‘struct QSqlRecord’
//*3* >> error: invalid use of incomplete type ‘struct QSqlRecord’ /usr/include/qt4/QtSql/qsqldatabase.h:60:7: error: forward declaration of ‘struct QSqlRecord’

و یه توضیح هم میدم :

من یه کلاس دارم که در سازنده این کلاس به وسیله درایور SQLITE و با کد زیر به database متصل میشم :

db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./database/db.iw");
if (!db.open())
emit errorOccur(tr("Cannot Open Database."),tr("Unable to establish a database connection."));
else
createTables();

بعد در ادامه سازنده یه جدول (کدشو اول گزاشتم ) درست میکنم اون کد هایی هم که ازشون ارور میگیرم داخل یه تابع public هست که از کلاس MainWindow فراخوانی میشه.

و در آخر این اولین برنامه من با Qt در مورد database هست اگه اشتباه بچه گانه ای انجام دادم شرمنده .

با تشکر
Woeful

.:saeed:.
جمعه 03 تیر 1390, 13:35 عصر
سلام
مشکلت این جور که خطا داره میگه از include نکردن QSqlRecord و اشتباه استفاده کردن از توابع برای ساختن یه کوئری است . بهتره برای ساختن کوئری از روش زیر استفاده کنی ( البته به نظر من ) :(یه مثال ساده : برای انتخاب از یه جدول )

QString queryString;//nothnig
queryString = QString("SELECT FIELDA, FIELDB FROM YOUR_TABLE WHERE FIELDA='%1' AND FIELDB=%2").arg("String val for fieldA").arg(a_number);//nothing

یعنی اینکه در یه رشته ، جاهای متغیر رو با درصد n مشخص کنی و بعد در n امین فراخوانی تابع arg مقدار مورد نظرت رو بهش بدی. البته گذاشتن ' برای رشته ها یادت نره. خوبی این روش اینه که میتونی مقدار queryString رو توی یه نرم افزاری مثل phpMyAdmin تست کنی و بعد به اشتباهاتت پی ببری.
و حالا این QString ای که ساختی دقیقا یه کوئری valid خواهد بود . حالا این QString رو برای تابع prepare یه QSqlQuery بفرست و exec کن اون QSqlQuery رو . اینجوری دیگه مشکل bind کردن و اینا نداری دیگه .