• 0
asm-soft

الـ bindValue لا تعمل مع SQLite

سؤال

السلام عليكم ورحمه الله وبركاته

أواجه مشكله في إستخدام bindValue مع قاعده بيانات SQLite و هي عند إرسال القيمة إلى المتغير فيتم تبديل القيمه بالحرف ? و لا أعرف لماذا و هذا مثال لتوضيح المشكله


QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "DB");
db.setDatabaseName(":memory:");
db.open();

QSqlQuery query(db);
query.prepare("CREATE TABLE IF NOT EXISTS tc_test (fc_index INTEGER PRIMARY KEY AUTOINCREMENT , fe_name TEXT DEFAULT(''))");
query.exec();

query.prepare("insert into tc_test (fe_name) values (:v)");
query.bindValue(":v", QVariant(QObject::trUtf8("Hello")));
QMessageBox::information(0, "", query.lastQuery());
query.exec();
QMessageBox::information(0, "", query.executedQuery());

db.close();

من خلال lastQuery سوف يتم عرض سطر SQL قبل تبديل المتغير و من من خلال executedQuery يتم عرض سطر SQL بعد تبديل المتغير و تنفيذ SQL و لكن للأسف لا يتم التبديل بصورة صحيحه و يتم وضع حرف ? بدل القيمة المطلوبه

تم تنفيذ الكود في حاله حفظ قاعده البيانات في الذاكرة أو في ملف و في الحالتين فشلت المحاوله و لكن لا أواجه أي مشكله مع bindValue في حاله التعامل مع PostgreSQL أو MySQL

كما تم تغيير نظام التعامل و تبديل الإستايل من : إلى ? و تم إستخدام الداله addBindValue أيضاً و لكن أواجه نفس المشكله.

نظام التشغيل : OpenSUSE 11.2 64Bit

نسخه QT : الإصدار 4.7 بالتحديد 2010.05.1

ما هو حل المشكله و هل SQLite لا تتعامل مع bindValue علماً بأن الإنترنت ممتلئه بالأمثله التي تستخدم bindValue مع SQLite بدون مشاكل حتى أنني لم أرى أي تلميح لهذا في توثيق Qt

ملحوظه: أقوم الأن بتحميل النسخه Qt_SDK_Lin64_offline_v1_1_en.run فممكن أن تكون المشكله من النسخه التي أستخدمها حالياً و سأطلعكم على النتيجه قريباً إن شاء الله.

إضافة: قمت بإختبار الإمكانيات NamedPlaceholders و PositionalPlaceholders من خلال الداله hasFeature و وجدت أن SQLite يدعم الثانيه فقط و لا يدعم الأولى و لكن في حاله إستخدام Positional Placeholders أواجه نفس المشكله و يتم وضع الحرف ? أيضاً.

إضافة 2: بعد بحث وجدت أن SQLite تدعم Named Placeholders بدون مشاكل فأتوقع أن المشكله في Dirver الخاص بنسخه Qt التي أعمل عليها و سينكشف هذا من النسخه التي أحلمها الأن إن شاء الله.

شكراً

تم تعديل بواسطه asm-soft
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

قمت بتجربه النسخة Qt_SDK_Lin64_offline_v1_1 و أواجه نفس المشكلة مع اني قمت بإختبار PositionalPlaceholders و يقول لي أنها مدعومه و لكن للأسف لا يتعامل معها أيضاً

فين المشكله 001.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

دلوقتي اتحولت القضيه لحاجه تانيه خالص laugh.gif

الدرايفر ينفذ bindvalue إذا استخدمت أسماء أو ترتيب المتغيرات مع أنه يقول أنه يدعم PositionalPlaceholders فقط و لا يدعم NamedPlaceholders و هذه ليست المشكله و ليست المشكله أنه لا يعرض الشكل النهائي للـ SQL عند إستخدام الداله executedQuery و يعرض حرف ? بدل القيم

المشكله هي أنني كنت أريد أن أنشئ جدول على الهواء مباشراً و كنت أريد أن أستخدم bindvalue لإعطاء بعض القيم إلى سطر إنشاء الجدول و لكنه يرفض أي قيم تأتي من bindvalue بل يجب أن أعطيه القيم بطريقه يدويه داخل SQL و لكن bindvalue تعمل عند الإستعلام أو الإضافه أو الحذف و هذا ما جعلني أن أفتح الموضوع ودخلت في دوامه

أوضحلكم قصدي بهذا المثال

CREATE TABLE IF NOT EXISTS tc_test (fc_index INTEGER PRIMARY KEY AUTOINCREMENT , fe_age INTEGER DEFAULT(:v))

السطر السابق يستخدم لإنشاء جدول بإسم tc_test يحتوي على حقل بإسم fe_age و أريد أن أجعل القيمه الإفتراضيه له تأتي من خلال bindvalue و هنا يرفض الدرايفر أن ينفذ هذا الإجراء مع هذا النوع من SQL و يجب أن يكتب السطر بصوره صريحه لكي يتم تنفيذه هكذا على سبيل المثال

CREATE TABLE IF NOT EXISTS tc_test (fc_index INTEGER PRIMARY KEY AUTOINCREMENT , fe_age INTEGER DEFAULT(125))

و لكن bindvalue تعمل مع سطور التحديث و الحذف و الإستعلام بصوره طبيعيه مع عدم عمل الداله executedQuery بصورة صحيحة

عموماً سأقوم بإنشاء الجداول بعيداً عن إستخدام bindvalue و أمري لله

شكراً لكم

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يمكنك تنفيذها كالاتي:

QString query = QString("CREATE TABLE IF NOT EXISTS tc_test (fc_index INTEGER PRIMARY KEY AUTOINCREMENT , fe_name TEXT DEFAULT('%1'))").arg(125);

ومن ثم نفذ الاستعلام.

تحياتي.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

bindvalue تقوم بإجراء مهم و هو تصحيح النص قبل إرساله ففي MySQL يتم وضع الحرف ( \ ) قبل بعض الحروف مثل الحرف ( ' ) و في PostgreSQL يتم وضع ( \ ) أو ( ' ) و هذا حسب إعدادات متغيرات PostgreSQL المعده عند الإتصال و في SQLite يتم إستخدام الحرف ( ' ) لعمل Escape لنفس الحرف و هذا غير بعض الحروف الأخرى و التي تستخدم عند إرسال صورة على سبيل المثال لحفظها في قاعده البيانات.

بما أن هذه المشكله تظهر مع SQLite فقط فسأقوم بإجراء Escape بطريقه يدويه إن شاء الله و ذلك بالنسبه لسطر إنشاء الجداول لأن هناك بعض القيم سوف أحصل عليها من جه المستخدم.

شكراً لك أخي SudaNix

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يبدو أنه لديك نفس المشكلة معي، bindValue تعمل مع insert, update, delete, select لكنها لم تعمل مع CREATE عند تجربتي لها مع MySQL. الشيء الثاني ظهور علامة ؟ عند تنفيذ الإستعلام، هذا شيء طبيعي لأن بعض قواعد البيانات لا تدعم bind لذا تلجأ Qt إلى محاكاتها(أذكر أني قرأتها في stackoverflow.com لكن لست أذكر الموضوع بالتحديد).

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنا أيضا واجهتني مشكلة مع bindvalue في قاعدة بيانات sqlite

 QSqlQuery *ajouterDonneeQuery = new QSqlQuery;        ajouterDonneeQuery->prepare("insert into Produit (Reference,Designation,localisation,Famille,Qte_min,Qte_max,Qte_stock,Unite,Prix_achat,Prix_vente)   VALUES(:ref,:design,:local,:fam,:qtmin,:qtmax,:qtstock ,:unite,:pachat,:pvente)");        ajouterDonneeQuery->bindValue(":ref",champRef->text());  // QlineEdit        ajouterDonneeQuery->bindValue(":design",champDesignation->text()); // QlineEdit        ajouterDonneeQuery->bindValue(":local",champLocalisation->text()); // QlineEdit        ajouterDonneeQuery->bindValue(":fam",SelectFamille->currentText()); // QcomboBox        ajouterDonneeQuery->bindValue(":qtmin",champStockMin); // QlineEdit        ajouterDonneeQuery->bindValue(":qtmax",champStockMax->text()); // QlineEdit        ajouterDonneeQuery->bindValue(":qtstock",champStockInit->text()); // QlineEdit        ajouterDonneeQuery->bindValue(":unite",selectUnit->currentText()); // QlineEdit        ajouterDonneeQuery->bindValue(":pachat",champPrixAchat->text());  // QlineEdit        ajouterDonneeQuery->bindValue(":pvente",champPrixVente->text());  // QlineEdit                     ajouterDonneeQuery->exec();
تم تعديل بواسطه zaykem
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .