سؤال

وأعمل على تطوير API C ++ والذي يستخدم المحمول مصمم خصيصا على التفاعل مع محركات قواعد البيانات المختلفة باستخدام واجهات برمجة التطبيقات وSQL محدد بناء الجملة.

وحاليا، أنا محاولة لايجاد وسيلة لادخال النقط، ولكن منذ NULL هو الطابع تنتهي في C / C ++، وBLOB يصبح اقتطاع عند بناء و<م> INSERT INTO سلسلة الاستعلام. حتى الآن، لقد عملت مع

//...
char* sql;
void* blob;
int len;
//...
blob = some_blob_already_in_memory;
len = length_of_blob_already_known;
sql = sqlite3_malloc(2*len+1);
sql = sqlite3_mprintf("INSERT INTO table VALUES (%Q)", (char*)blob);
//...

وأتوقع أن، إذا كان ذلك ممكنا للقيام بذلك في وحدة تحكم تفاعلية SQLite3، فإنه ينبغي أن يكون من الممكن بناء سلسلة الاستعلام مع هرب صحيح الأحرف NULL. ربما هناك طريقة للقيام بذلك مع SQL القياسي الذي تدعمه أيضا جملة SQL سكليتي؟

وبالتأكيد شخص ما يجب أن يكون واجه نفس الموقف من قبل. لقد غوغليد وجدت بعض الأجوبة ولكنها كانت في لغات البرمجة الأخرى (بايثون).

وشكرا لكم مقدما على ملاحظاتك.

هل كانت مفيدة؟

المحلول

وأنت ترغب في استخدام هذه الوظيفة مع بيان معد سلفا.

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

في C / C ++، والطريقة القياسية للتعامل مع القيم الخالية في سلاسل هو إما تخزين بداية السلسلة وطول، أو تخزين مؤشر إلى بداية سلسلة واحدة إلى نهاية السلسلة.

نصائح أخرى

وشكرا لكم جميعا مرة أخرى لملاحظاتك. هذه المرة أنا تقارير كيف تحل المشكلة مع مساعدة من المؤشرات المقدمة هنا. نأمل أن هذا سوف يساعد الآخرين في المستقبل.

وكما اقترح الملصقات الثلاثة الأولى، وأنا لم تستخدم البيانات المعدة - بالإضافة إلى ذلك لأنني كنت أيضا مهتمة في الحصول على أنواع البيانات الأعمدة، ومن شأنه أن sqlite3_get_table() بسيطة لا تفعل

وبعد إعداد بيان SQL في شكل سلسلة متواصلة التالية:

INSERT INTO table VALUES(?,?,?,?);

ويبقى <ط> ملزمة من القيم المناظرة. ويتم ذلك من خلال إصدار العديد من المكالمات sqlite3_bind_blob() كما الأعمدة. (أنا أيضا لجأت إلى sqlite3_bind_text() لأنواع البيانات الأخرى "بسيطة" لأن API أعمل على يمكن أن تترجم الأعداد الصحيحة / الزوجي / الخ في سلسلة). لذلك:

void* blobvalue[4];
int blobsize[4];
char *tail, *sql="INSERT INTO table VALUES(?,?,?,?)";
sqlite3_stmt *stmt=0;
sqlite3 *db;
/* ... */
db=sqlite3_open("sqlite.db");
sqlite3_prepare_v2(db, 
                   sql, strlen(sql)+1, 
                   &stmt, &tail);
for(int i=0; i<4; i++)
    sqlite3_ bind_ blob(stmt, 
                        i+1, blobvalue[i], blobsize[i], 
                        SQLITE_TRANSIENT);
if(sqlite3_step(stmt)!=SQLITE_DONE) 
    printf("Error message: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);

ملحوظة أيضا أن بعض وظائف (sqlite3_open_v2()، sqlite3_prepare_v2()) تظهر على الإصدارات سكليتي في وقت لاحق (افترض الإصدار 3.5.x وفي وقت لاحق).

وترغب في precompile وsqlite_prepare_v2() البيان، ومن ثم ربط النقطة في استخدام sqlite3_bind_blob(). لاحظ أن البيان الذي ربط في سيكون <م> INSERT INTO VALUES الجدول (؟) .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top