2012-03-29 16 views
17

में समर्थित तैयार कथन हैं, मैं आमतौर पर एक लाइव सर्वर के साथ विकसित होता हूं, लेकिन पहली बार मुझे लगा कि मैं छलांग लगाऊंगा और देख सकता हूं कि क्या मैं अपने सभी (सी ++) mysql कोड को एम्बेडेड सर्वर के रूप में काम कर सकता हूं। विशेष रूप से, मैं तैयार बयानों का बहुत शौकिया हूं क्योंकि वे (आईएमएचओ) "आम तौर पर" गैर-तैयार विविधता से बेहतर हैं।एम्बेडेड MySQL

मैंने 5.5.22 से libmysqld और libmysqld 5.6.4 से और न तो काम करने का प्रयास किया है।

कनेक्शन बनाया गया है, सरल mysql_query/mysql_real_query आदेश ठीक काम करते हैं, लेकिन जैसे ही मेरा पहला तैयार कथन एक mysql_stmt_fetch() को इंगित करता है, मुझे नफरत 'सिंक से बाहर आदेश' त्रुटि मिलती है।

संकल्प के बिना ऑरक्ल फ़ोरम (http://forums.mysql.com/read.php?168,507863,507863#msg-507863) पर एक बहुत ही समान समस्या दिखाई देती है।

मुझे नहीं लगता है, और न ही मेरा मानना ​​है कि मुझे mysql_real_connect() और mysql_stmt_fetch() के बीच कोई आदेश नहीं है।

तैयार सभी कथन का उपयोग कर रहे एम्बेडेड सर्वर के किसी भी उदाहरण के लिए मेरी सभी खोजें खाली हो गई हैं। न ही मुझे एक वास्तविक वाक्य मिला है "आप यह नहीं कर सकते"।

तो ... क्या यह समर्थित है या नहीं?

आपकी विशेषज्ञता के लिए धन्यवाद।

// संपादित इस आगे रहस्यमय नहीं रखना इतनी के रूप में करने के लिए (और हिदायत यदि आवश्यक हो तो) मेरा पूरा mysql cmd अनुक्रम इस प्रकार है:

mysql_library_init(); // as embedded 
mysql_init(); 
mysql_options(MYSQL_SET_CHARSET_NAME); //to utf8 
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION); 
mysql_real_connect(); 
mysql_real_query("SET NAMES 'utf8'"); 
mysql_real_query("SET CHARACTER SET 'utf8'"); 
mysql_set_character_set("utf8"); // yes, you really do need to set utf8 four times 
mysql_autocommit(mAutocommit); 
इस बिंदु पर

, mysql_real_query() कॉल काम करते हैं। मैं जारी ...

//all this would only happen once for each stmt 
{ 
    mysql_stmt_init(); 
    mysql_stmt_prepare(theQuery); 
    mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery 
    mysql_stmt_result_metadata() 
    mysql_num_fields(); // to assert the output bind object has the same number of params as theQuery 
    mysql_free_result(metadata); 
    mysql_stmt_bind_param(); // called IF there are input params 
    mysql_stmt_bind_result(); // pretty much always called for the output params 
} 
// and at last 
mysql_stmt_execute(); 
//mysql_stmt_store_result(); //{OPTIONAL: use if you want to buffer the fetch - I dont} 
mysql_stmt_fetch(); // ERROR! commands out of sync. 

// and for completeness, 
mysql_stmt_free_result(); 
mysql_stmt_close(); 

// and the shutdown 
mysql_close(); 
mysql_library_end(); 

उत्तर

3

मुझे इससे डर था .. लेकिन काम की कोई छोटी राशि के बाद, मेरे पास मेरे प्रश्न का उत्तर है, और समस्या का समाधान है। (हाँ, मैं आलसी कोडर हूं ... मुझे उम्मीद थी कि किसी और ने मुझे यह सब कुछ जरूरी बताया होगा ..hehe)

एम्बेडेड सर्वर + तैयार कथन के लिए मेरा स्वयं का आधिकारिक उत्तर यहां काम नहीं कर रहा है।

प्रश्न: एम्बेडेड में समर्थित stmts हैं? जवाब ... वे होना चाहिए लेकिन वे नहीं हैं।

हां, stmts के संबंध में एम्बेडेड mysql में एक बग है। देखें: http://bugs.mysql.com/bug.php?id=62136

श्री क्यू झोउ का मेरा पूरा सम्मान है। उन्होंने किसी भी तरह से निर्धारित किया कि एम्बेडेड चलते समय, mysql_stmt_execute() गलत तरीके से "MYSQL_STATUS_STATEMENT_GET_RESULT" (यानी एक गैर-स्टेटमेंट की तरह एक stmt का इलाज करने) की बजाय "MYSQL_STATUS_GET_RESULT" पर परिणाम स्थिति सेट कर रहा था, यह स्पष्ट रूप से "सिंक से बाहर आदेश" त्रुटि। इसलिए इसे स्रोत कोड को पैच करने की आवश्यकता है।

कैसे करना है कि .. MySql "कैसे खिड़कियों पर निर्माण करने के लिए" यहाँ पेज: http://dev.mysql.com/doc/refman/5.5/en/source-installation.html

संदर्भ यह बहुत आसान करने के लिए पढ़ने के लिए, कैसे-करें-बिल्ड: http://www.chriscalender.com/?p=689

प्रक्रिया में निर्धारित अतिरिक्त हाउ-टू नोट्स

क्रिस का वीएस -2008 एक्सप्रेस के लिए कैसे है। मैं 2010 प्रो का उपयोग करता हूं और सीएमके-जी तर्क को सीखा जा सकता है। मेरे लिए, 2010 का उपयोग करने के लिए संकलक होने का स्वत: निर्धारण था।

मैंने केवल सेमेक और बाइसन स्थापित किया। इसके लिए perl और बाज़ार की आवश्यकता नहीं है। और मुझे बाज़ार से खींचने के बजाय मानक 5.5.22 स्रोत डिस्ट्रो मिला।

पुन: स्थापित करने बायसन:

  • स्पेस के एक रास्ते पर जंगली भैंसों स्थापित करने के लिए
  • संस्थापक प्रारंभ मेनू के लिए कुछ भी जोड़ने के लिए (अनुमति नहीं देते यह सुनिश्चित करने के कारण होता है "m4.exe नहीं मिला" त्रुटि)
  • मैन्युअल सिस्टम पथ को जंगली भैंसों के बिन फ़ोल्डर जोड़ने

पुन: signtool.exe

पाथ में साइनटोल जोड़ने के मार्ग को बीमा करें। (http://dev.mysql.com/downloads/mysql/#downloads) \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ बिन

डाउनलोड MySql का स्रोत distro: जेनेरिक लिनक्स (वास्तुकला स्वतंत्र) (मेरे लिए)

  • ग उदाहरण , संकुचित tar संग्रह (mysql-5.5.22.tar.gz)

    आप संपादित करने की जरूरत {D: \ your_path} \ mysql-5.5.22 \ libmysqld \ lib_sql.cc

    लाइन 340 पर आप होगा देखें:

    के बीच
    if (res) 
    { 
        NET *net= &stmt->mysql->net; 
        set_stmt_errmsg(stmt, net); 
        DBUG_RETURN(1); 
    } 
    //ADD CODE HERE 
    DBUG_RETURN(0); 
    

    सम्मिलित करता है, तो codeblock और DBUG_RETURN (0) निम्नलिखित:

    //kgk 2012/04/11 - see http://bugs.mysql.com/bug.php?id=62136 
    // Qi Zhou's modification to allow prep'd stmts to work 
    else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT) 
    { 
        stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT; 
    } 
    

    और अपने आप को libmysqld.dll, libmysqld.lib की एक नई रिलीज़ संस्करण का निर्माण, libmysqld.pdb

    और समस्या तय है।

    जब आपने डीएलएल बनाया है, तो मुझे ऐसा न करें और नए डीएलएल को अपने बाइनरी के रनटाइम फ़ोल्डर में ले जाना भूल जाएं और सोचें कि बदलाव ने कुछ भी क्यों नहीं किया। आह।

    एफवाईआई: ऑरैक की तकनीक की बग रिपोर्ट टिप्पणी [20 फरवरी 18:34] के साथ टैग की गईं स्वेता स्मरनोवा पूर्ण बकवास है। serverARgs के पास कुछ भी करने के लिए कुछ भी नहीं है।

-2

एंबेडेड MySQL एक जो सामान्य रूप से उपयोग नहीं कर रहा है और इस समस्या के लिए मैं कई बार वेब बहुत खोज की है और मैं एक अलग परियोजना तैयार की है। ऐसा करने पर, मैंने कई चीजें सीखी हैं और एक चीज यह है कि पहले क्वेरी निष्पादित करें और फिर परिणामों को संग्रहित करें।

विभिन्न प्रकार की क्वेरी से छुटकारा पाने के लिए कृपया निष्पादन के लिए एक वस्तु बनाएं और परिणाम लौटाएं और इस मामले में आपको बार-बार निष्पादन क्वेरी लिखनी पड़ेगी।

वर्तमान स्थिति में उपयोगकर्ता ने क्वेरी निष्पादित नहीं की और परिणामों को संग्रहित करने का प्रयास नहीं किया और यह तब होता है जब आप अन्य आदेशों की प्रतिलिपि बनाने का प्रयास करते हैं। इस प्रकार की समस्या का हल mysql_stmt_execute निष्पादित करने के लिए और फिर mysql_stmt_store_result

+1

आपकी मदद के लिए धन्यवाद। मेरा प्रश्न तैयार बयानों के मूल्य पर नहीं है, लेकिन यह एम्बेडेड mysql लाइब्रेरी (यानी कोई बाहरी सर्वर) के साथ काम करने से संबंधित जानकारी पर नहीं है। मेरे लिए, वे काम नहीं कर रहे हैं। दूसरी बात, mysql_stmt_store_result को कॉल करना प्रासंगिक नहीं है। आपके संदर्भ के लिए देखें: http://dev.mysql.com/doc/refman/5.5/en/mysql-stmt-store-result.html यदि आप fetch (जो मैं नहीं हूं) को बफर नहीं कर रहा हूं, तो आप नहीं करते स्टोर स्टोर करने की आवश्यकता है (जो मैं नहीं)। कम से कम, देखने के लिए, मैंने आपके सुझाव की कोशिश की और स्टोर कमांड पर सिंक से बाहर होता है। –

-1

http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html

मेरा बुरा अंग्रेजी के लिए खेद कहते हैं, लेकिन समस्या यह है कि mysql_stmt_fetch खुला कर्सर है, लेकिन mysql_stmt_execute केवल कर्सर के साथ mysql_stmt_store_result काम को अंजाम ...

है
+0

मेरा कोड पथ उपरोक्त है, mysql_stmt_execute() mysql_stmt_fetch() के बाद। दूरस्थ mysql सर्वर से कनेक्ट करते समय यह पूरी तरह से "stmt" कोड लागू किया जाता है। हालांकि यह एम्बेडेड सर्वर पर लागू होने पर 'सिंक से बाहर' त्रुटि उत्पन्न करता है। तो .. आपका जवाब प्रासंगिक नहीं है। –

संबंधित मुद्दे