ºODBC£¨Open Database Connectivity£¬¿ª·ÅʽÊý¾Ý¿âÁ¬½Ó£©£¬ÊÇÒ»ÖÖÓÃÀ´ÔÚÏà¹Ø»ò²»Ïà¹ØµÄÊý¾Ý¿â¹ÜÀíϵͳ£¨DBMS£©ÖдæÈ¡Êý¾ÝµÄ±ê×¼Ó¦ÓóÌÐò½Ó¿Ú£¨API£©¡£±¾Îĸø³öWindows 95 »·¾³ÏÂÓÃVisual C++(www.cppentry.com) ½øÐÐODBC ±à³Ì(www.cppentry.com)µÄ¾ßÌå·½·¨¼°¼¼ÇÉ¡£
---- ¹Ø¼ü×Ö£ºODBC£¬Visual C++(www.cppentry.com)£¬Windows ±à³Ì(www.cppentry.com)¡£
---- Ò»£®¸ÅÊö
---- ODBC ÊÇÒ»ÖÖʹÓÃSQL µÄ³ÌÐòÉè¼Æ½Ó¿Ú¡£Ê¹ÓÃODBC ÈÃÓ¦ÓóÌÐòµÄ±àдÕß±ÜÃâÁËÓëÊý¾ÝÔ´ÏàÁªµÄ¸´ÔÓÐÔ¡£ÕâÏî¼¼ÊõĿǰÒѾµÃµ½ÁË´ó¶àÊýDBMS ³§ÉÌÃǵĹ㷺֧³Ö¡£
---- Microsoft Developer Studio Ϊ´ó¶àÊý±ê×¼µÄÊý¾Ý¿â¸ñʽÌṩÁË32 λODBC Çý¶¯Æ÷¡£ÕâЩ±ê×¼Êý¾Ý¸ñʽ°üÀ¨ÓУºSQL Server¡¢Access¡¢Paradox¡¢dBase¡¢FoxPro¡¢Excel¡¢Oracle ÒÔ¼°Microsoft Text¡£Èç¹ûÓû§Ï£ÍûʹÓÃÆäËûÊý¾Ý¸ñʽ£¬Óû§ÐèÒªÏàÓ¦µÄODBC Çý¶¯Æ÷¼°DBMS¡£
---- Óû§Ê¹ÓÃ×Ô¼ºµÄDBMS Êý¾Ý¿â¹ÜÀí¹¦ÄÜÉú³ÉеÄÊý¾Ý¿âģʽºó£¬¾Í¿ÉÒÔʹÓÃODBC À´µÇ¼Êý¾ÝÔ´¡£¶ÔÓû§µÄÓ¦ÓóÌÐòÀ´Ëµ£¬Ö»Òª°²×°ÓÐÇý¶¯³ÌÐò£¬¾ÍÄÜ×¢²áºÜ¶à²»Í¬µÄÊý¾Ý¿â¡£µÇ¼Êý¾Ý¿âµÄ¾ßÌå²Ù×÷²Î¼ûÓйØODBC µÄÁª»ú°ïÖú¡£
---- ¶þ£®MFC ÌṩµÄODBC Êý¾Ý¿âÀà
---- Visual C++(www.cppentry.com) µÄMFC »ùÀà¿â¶¨ÒåÁ˼¸¸öÊý¾Ý¿âÀà¡£ÔÚÀûÓÃODBC ±à³Ì(www.cppentry.com)ʱ£¬¾³£ÒªÊ¹Óõ½CDatabase( Êý¾Ý¿âÀà)£¬CRecordSet( ¼Ç¼¼¯Àà) ºÍCRecordView( ¿ÉÊӼǼ¼¯Àà)¡£ÆäÖУº
---- CDatabase Àà¶ÔÏóÌṩÁ˶ÔÊý¾ÝÔ´µÄÁ¬½Ó£¬Í¨¹ýËüÄã¿ÉÒÔ¶ÔÊý¾ÝÔ´½øÐвÙ×÷¡£
---- CRecordSet Àà¶ÔÏóÌṩÁË´ÓÊý¾ÝÔ´ÖÐÌáÈ¡³öµÄ¼Ç¼¼¯¡£CRecordSet ¶ÔÏóͨ³£ÓÃÓÚÁ½ÖÖÐÎʽ£º¶¯Ì¬Ðм¯£¨dynasets£©ºÍ¿ìÕÕ¼¯£¨snapshots£©¡£¶¯Ì¬Ðм¯Äܱ£³ÖÓëÆäËûÓû§Ëù×öµÄ¸ü¸Ä±£³Öͬ²½¡£¿ìÕÕ¼¯ÔòÊÇÊý¾ÝµÄÒ»¸ö¾²Ì¬ÊÓͼ¡£Ã¿Ò»ÖÖÐÎʽÔڼǼ¼¯±»´ò¿ªÊ±¶¼Ìṩһ×é¼Ç¼£¬Ëù²»Í¬µÄÊÇ£¬µ±ÄãÔÚÒ»¸ö¶¯Ì¬Ðм¯Àï¹ö¶¯µ½Ò»Ìõ¼Ç¼ʱ£¬ÓÉÆäËûÓû§»òÊÇÄãÓ¦ÓóÌÐòÖÐµÄÆäËû¼Ç¼¼¯¶Ô¸Ã¼Ç¼Ëù×öµÄ¸ü¸Ä»áÏàÓ¦µØÏÔʾ³öÀ´¡£
---- CRecordView Àà¶ÔÏóÄÜÒÔ¿ØÖƵÄÐÎʽÏÔʾÊý¾Ý¿â¼Ç¼¡£Õâ¸öÊÓͼÊÇÖ±½ÓÁ¬µ½Ò»¸öCRecordSet ¶ÔÏóµÄ±íÊÓͼ¡£
---- Èý£®Ó¦ÓÃODBC ±à³Ì(www.cppentry.com)
---- Ó¦ÓÃVisual C++(www.cppentry.com) µÄAppWizard ¿ÉÒÔ×Ô¶¯Éú³ÉÒ»¸öODBC Ó¦ÓóÌÐò¿ò¼Ü¡£·½·¨ÊÇ£º´ò¿ªFile ²Ëµ¥µÄNew Ñ¡ÏѡȡProjects£¬ÌîÈ빤³ÌÃû£¬Ñ¡ÔñMFC AppWizard (exe)£¬È»ºó°´AppWizard µÄÌáʾ½øÐвÙ×÷¡£µ±AppWizard ѯÎÊÊÇ·ñ°üº¬Êý¾Ý¿âÖ§³Öʱ£¬Èç¹ûÄãÏë¶ÁдÊý¾Ý¿â£¬ÄÇôѡ¶¨Database view with file support£»¶ø ãÏë·ÃÎÊÊ Ý¿âµÄÐÅÏ¢¶ »Ïë»ØÐ´Ë öµÄ¸Ä±ä£ Çôѡ¶¨Database view without file support Ñ¡Ïî¾Í±È½ÏºÏÊÊÁË¡£Ñ¡ÔñÁËÊý¾Ý¿âÖ§³ÖÖ®ºóDatabase Source °´Å¥»á¼¤»î£¬Ñ¡ÖÐËüÈ¥µ÷ÓÃData Options ¶Ô»°¿ò¡£ÔÚDatabase Options ¶Ô»°¿òÖлáÏÔʾÒÑÏòODBC ×¢²áµÄÊý¾Ý¿â×ÊÔ´£¬Ñ¡¶¨ÄãËùÒª²Ù×÷µÄÊý¾Ý¿â£¬È磺Super_ES£¬µ¥»÷OK ºó»á³öÏÖSelect Database Tables ¶Ô»°¿ò£¬ÆäÖÐÁоÙÁËÄãËùÑ¡ÖеÄÊý¾Ý¿âÖаüº¬µÄÈ«²¿±í£¬Ñ¡ÔñÄãÏ£Íû²Ù×÷µÄ±íºó£¬µ¥»÷OK¡£ÔÚÑ¡¶¨ÁËÊý¾Ý¿âºÍÊý¾Ý±íÖ®ºó£¬Äã¿ÉÒÔ°´ÕÕ¹ßÀý¼ÌÐø½øÐÐAppWizard ²Ù×÷¡£
---- ÌØ±ðÐèÒªÖ¸³öµÄÊÇ£ºÔÚÉú³ÉµÄÓ¦ÓóÌÐò¿ò¼ÜView ÀࣨÈ磺CSuper_ESView£©Öаüº¬Ò»¸öÖ¸ÏòCSuper_ESSet ¶ÔÏóµÄÖ¸Õëm_pSet£¬¸ÃÖ¸ÕëÓÉAppWizard ½¨Á¢£¬Ä¿µÄÊÇÔÚÊÓ±íµ¥ºÍ¼Ç¼¼¯Ö®¼ä½¨Á¢ÁªÏµ£¬Ê¹µÃ¼Ç¼¼¯ÖеIJéѯ½á¹ûÄܹ»ºÜÈÝÒ×µØÔÚÊÓ±íµ¥ÉÏÏÔʾ³öÀ´¡£ÓйØm_pSet µÄÏêϸÓ÷¨¿ÉÒԲμûVisual C++(www.cppentry.com) Online Book¡£
---- ³ÌÐòÓëÊý¾ÝÓïÑÔ½¨Á¢ÁªÏµ£¬Ê¹ÓÃCDatebase::OpenEx() »òCDatabase::Open() º¯ÊýÀ´½øÐгõʼ»¯¡£Êý¾Ý¿â¶ÔÏó±ØÐëÔÚÄãʹÓÃËü¹¹ÔìÒ»¸ö¼Ç¼¼¯¶ÔÏó֮ǰ±»³õʼ»¯¡£
---- ÏÂÃæ¾ÙÀý˵Ã÷ÔÚVisual C++(www.cppentry.com) »·¾³ÖÐODBC µÄ±à³Ì(www.cppentry.com)¼¼ÇÉ£º
---- 1 £®²éѯ¼Ç¼
---- ²éѯ¼Ç¼ʹÓÃCRecordSet::Open() ºÍCRecordSet::Requery() ³ÉÔ±º¯Êý¡£ÔÚʹÓÃCRecordSet Àà¶ÔÏó֮ǰ£¬±ØÐëʹÓÃCRecordSet::Open() º¯ÊýÀ´»ñµÃÓÐЧµÄ¼Ç¼¼¯¡£Ò»µ©ÒѾʹÓùýCRecordSet::Open() º¯Êý£¬Ôٴβéѯʱ¾Í¿ÉÒÔÓ¦ÓÃCRecordSet::Requery() º¯Êý¡£ÔÚµ÷ÓÃCRecordSet::Open() º¯Êýʱ£¬Èç¹ûÒѾ½«Ò»¸öÒѾ´ò¿ªµÄCDatabase ¶ÔÏóÖ¸Õë´«¸øCRecordSet Àà¶ÔÏóµÄm_pDatabase ³ÉÔ±±äÁ¿£¬ÔòʹÓøÃÊý¾Ý¿â¶ÔÏó½¨Á¢ODBC Á¬½Ó£»·ñÔòÈç¹ûm_pDatabase Ϊ¿ÕÖ¸Õ룬¾Íн¨Ò»¸öCDatabase Àà¶ÔÏó²¢Ê¹ÆäÓëȱʡµÄÊý¾ÝÔ´ÏàÁ¬£¬È»ºó½øÐÐCRecordSet Àà¶ÔÏóµÄ³õʼ»¯¡£È±Ê¡Êý¾ÝÔ´ÓÉGetDefaultConnect() º¯Êý»ñµÃ¡£ÄãÒ²¿ÉÒÔÌṩÄãËùÐèÒªµÄSQL Óï¾ä£¬²¢ÒÔËüÀ´µ÷ÓÃCRecordSet::Open() º¯Êý£¬ÀýÈ磺
Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL); ---- Èç¹ûûÓÐÖ¸¶¨²ÎÊý£¬³ÌÐòÔòʹÓÃȱʡµÄSQL Óï¾ä£¬¼´¶ÔÔÚGetDefaultSQL() º¯ÊýÖÐÖ¸¶¨µÄSQL Óï¾ä½øÐвÙ×÷£º
CString CSuper_ESSet::GetDefaultSQL() {return _T("[BasicData],[MainSize]");} ---- ¶ÔÓÚGetDefaultSQL() º¯Êý·µ»ØµÄ±íÃû£¬¶ÔÓ¦µÄȱʡ²Ù×÷ÊÇSELECT Óï¾ä£¬¼´£º
SELECT * FROM BasicData,MainSize ---- ²éѯ¹ý³ÌÖÐÒ²¿ÉÒÔÀûÓÃCRecordSet µÄ³ÉÔ±±äÁ¿m_strFilter ºÍm_strSort À´Ö´ÐÐÌõ¼þ²éѯºÍ½á¹ûÅÅÐò¡£m_strFilter Ϊ¹ýÂË×Ö·û´®£¬´æ·Å×ÅSQL Óï¾äÖÐWHERE ºóµÄÌõ¼þ´®£»m_strSort ΪÅÅÐò×Ö·û´®£¬´æ·Å×ÅSQL Óï¾äÖÐORDER BY ºóµÄ×Ö·û´®¡£È磺
Super_ESSet.m_strFilter="TYPE=µç¶¯»ú"; Super_ESSet.m_strSort="VOLTAGE"; Super_ESSet.Requery(); ¶ÔÓ¦µÄSQLÓï¾äΪ£º SELECT * FROM BasicData,MainSize WHERE TYPE=µç¶¯»ú ORDER BY VOLTAGE ---- ³ýÁËÖ±½Ó¸³Öµ¸øm_strFilter ÒÔÍ⣬»¹¿ÉÒÔʹÓòÎÊý»¯¡£ÀûÓòÎÊý»¯¿ÉÒÔ¸üÖ±¹Û£¬¸ü·½±ãµØÍê³ÉÌõ¼þ²éѯÈÎÎñ¡£Ê¹ÓòÎÊý»¯µÄ²½ÖèÈçÏ£º
---- (1) £®ÉùÃ÷²Î±äÁ¿£º
CString p1; float p2; ---- (2) £®ÔÚ¹¹Ô캯ÊýÖгõʼ»¯²Î±äÁ¿
p1=_T(""); p2=0.0f; m_nParams=2; ---- (3) £®½«²Î±äÁ¿Óë¶ÔÓ¦Áаó¶¨
pFX- >SetFieldType(CFieldExchange::param) RFX_Text(pFX,_T("P1"),p1); RFX_Single(pFX,_T("P2"),p2); ---- Íê³ÉÒÔÉϲ½ÖèÖ®ºó¾Í¿ÉÒÔÀûÓòαäÁ¿½øÐÐÌõ¼þ²éѯÁË£º
m_pSet- >m_strFilter="TYPE= AND VOLTAGE= "; m_pSet- >p1=" µç¶¯»ú"; m_pSet- >p2=60.0; m_pSet- >Requery(); ---- ²Î±äÁ¿µÄÖµ°´°ó¶¨µÄ˳ÐòÌæ»»²éѯ×Ö´®ÖеÄ" " ÊÊÅä·û¡£
---- Èç¹û²éѯµÄ½á¹ûÊǶàÌõ¼Ç¼µÄ»°£¬¿ÉÒÔÓÃCRecordSet ÀàµÄº¯ÊýMove()£¬MoveNext()£¬MovePrev()£¬MoveFirst() ºÍMoveLast() À´Òƶ¯¹â±ê¡£
---- 2 £®Ôö¼Ó¼Ç¼
---- Ôö¼Ó¼Ç¼ʹÓÃAddNew() º¯Êý£¬ÒªÇóÊý¾Ý¿â±ØÐëÊÇÒÔÔÊÐíÔö¼ÓµÄ·½Ê½´ò¿ª£º
m_pSet- >AddNew(); //ÔÚ±íµÄĩβÔö¼ÓмǼ m_pSet- >SetFieldNull(&(m_pSet- >m_type), FALSE); m_pSet- >m_type=" µç¶¯»ú"; ... //ÊäÈëеÄ×Ö¶ÎÖµ m_pSet- > Update(); //½«Ð¼Ç¼´æÈëÊý¾Ý¿â m_pSet- >Requery(); //ÖØ½¨¼Ç¼¼¯ ---- 3 £®É¾³ý¼Ç¼
---- Ö±½ÓʹÓÃDelete() º¯Êý£¬²¢ÇÒÔÚµ÷ÓÃDelete() º¯ÊýÖ®ºó²»Ðèµ÷ÓÃUpdate() º¯Êý£º
m_pSet- >Delete(); if (!m_pSet- >IsEOF()) m_pSet- >MoveNext(); else m_pSet- >MoveLast(); ---- 4 £®Ð޸ļǼ
---- Ð޸ļǼʹÓÃEdit() º¯Êý£º
m_pSet- >Edit(); //Ð޸ĵ±Ç°¼Ç¼ m_pSet- >m_type="·¢µç»ú"; //Ð޸ĵ±Ç°¼Ç¼×Ö¶ÎÖµ ... m_pSet- >Update(); //½«Ð޸Ľá¹û´æÈëÊý¾Ý¿â m_pSet- >Requery(); ---- 5 £®³·Ïû²Ù×÷
---- Èç¹ûÓû§Ñ¡ÔñÁËÔö¼Ó»òÕßÐ޸ļǼºóÏ£Íû·ÅÆúµ±Ç°²Ù×÷£¬¿ÉÒÔÔÚµ÷ÓÃUpdate() º¯Êý֮ǰµ÷Óãº
CRecordSet::Move(AFX_MOVE_REFRESH); ---- À´³·ÏûÔö¼Ó»òÐÞ¸Äģʽ£¬²¢»Ö¸´ÔÚÔö¼Ó»òÐÞ¸Äģʽ֮ǰµÄµ±Ç°¼Ç¼¡£ÆäÖеIJÎÊýAFX_MOVE_REFRESH µÄֵΪÁã¡£
---- 6 £®Êý¾Ý¿âÁ¬½ÓµÄ¸´ÓÃ
---- ÔÚCRecordSet ÀàÖж¨ÒåÁËÒ»¸ö³ÉÔ±±äÁ¿m_pDatabase:
CDatabase* m_pDatabase; ---- ËüÊÇÖ¸Ïò¶ÔÏóÊý¾Ý¿âÀàµÄÖ¸Õë¡£Èç¹ûÔÚCRecordSet Àà¶ÔÏóµ÷ÓÃOpen() º¯Êý֮ǰ£¬½«Ò»¸öÒѾ´ò¿ªµÄCDatabase Àà¶ÔÏóÖ¸Õë´«¸øm_pDatabase£¬¾ÍÄܹ²ÏíÏàͬµÄCDatabase Àà¶ÔÏó¡£È磺
CDatabase m_db; CRecordSet m_set1,m_set2; m_db.Open(_T("Super_ES"));//½¨Á¢ODBCÁ¬½Ó m_set1.m_pDatabase=&m_db; //m_set1¸´ÓÃm_db¶ÔÏó m_set2.m_pDatabse=&m_db; // m_set2¸´ÓÃm_db¶ÔÏó ---- 7 £®SQL Óï¾äµÄÖ±½ÓÖ´ÐÐ
---- ËäȻͨ¹ýCRecordSet À࣬ÎÒÃÇ¿ÉÒÔÍê³É´ó¶àÊýµÄ²éѯ²Ù×÷£¬¶øÇÒÔÚCRecordSet::Open() º¯ÊýÖÐÒ²¿ÉÒÔÌṩSQL Óï¾ä£¬µ«ÊÇÓеÄʱºòÎÒÃÇ»¹Ïë½øÐÐһЩÆäËû²Ù×÷£¬ÀýÈ罨Á¢ÐÂ±í£¬É¾³ý±í£¬½¨Á¢ÐµÄ×ֶεȵȣ¬Õâʱ¾ÍÐèҪʹÓõ½CDatabase ÀàµÄÖ±½ÓÖ´ÐÐSQL Óï¾äµÄ»úÖÆ¡£Í¨¹ýµ÷ÓÃCDatabase::ExecuteSQL() º¯ÊýÀ´Íê³ÉSQL Óï¾äµÄÖ±½ÓÖ´ÐУº
BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL) { TRY { m_pdb- >ExecuteSQL(strSQL);//Ö±½ÓÖ´ÐÐSQLÓï¾ä } CATCH (CDBException,e) { CString strMsg; strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE; } END_CATCH return TRUE; } ---- Ó¦µ±Ö¸³öµÄÊÇ£¬ÓÉÓÚ²»Í¬DBMS ÌṩµÄÊý¾Ý²Ù×÷Óï¾ä²»¾¡Ïàͬ£¬Ö±½ÓÖ´ÐÐSQL Óï¾ä¿ÉÄÜ»áÆÆ»µÈí¼þµÄDBMS ÎÞ¹ØÐÔ£¬Òò´ËÔÚÓ¦ÓÃÖÐÓ¦µ±É÷ÓôËÀà²Ù×÷¡£
---- 8 £®¶¯Ì¬Á¬½Ó±í
---- ±íµÄ¶¯Ì¬Á¬½Ó¿ÉÒÔÀûÓÃÔÚµ÷ÓÃCRecordSet::Open() º¯Êýʱָ¶¨SQL Óï¾äÀ´ÊµÏÖ¡£Í¬Ò»¸ö¼Ç¼¼¯¶ÔÏóÖ»ÄÜ·ÃÎʾßÓÐÏàͬ½á¹¹µÄ±í£¬·ñÔò²éѯ½á¹û½«ÎÞ·¨Óë±äÁ¿Ïà¶ÔÓ¦¡£
void CDB::ChangeTable() { if (m_pSet- >IsOpen()) m_pSet- >Close(); switch (m_id) { case 0: m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT * FROM SLOT0"); //Á¬½Ó±íSLOT0 m_id=1; break; case 1: m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT * FROM SLOT1"); //Á¬½Ó±íSLOT1 m_id=0; break; } } ---- 9 £®¶¯Ì¬Á¬½ÓÊý¾Ý¿â
---- ÓÉÓÚÓëÊý¾Ý¿âµÄÁ¬½ÓÊÇͨ¹ýCDatabase Àà¶ÔÏóÀ´ÊµÏֵģ¬ËùÒÔÎÒÃÇ¿ÉÒÔͨ¹ý¸³ÓëCRecordSet Àà¶ÔÏó²ÎÊým_pDatabase ÒÔÁ¬½Ó²»Í¬Êý¾Ý¿âµÄCDatabase ¶ÔÏóÖ¸Õ룬¾Í¿ÉÒÔ¶¯Ì¬Á¬½ÓÊý¾Ý¿â¡£
void CDB::ChangeConnect() { CDatabase* pdb=m_pSet- >m_pDatabase; pdb- >Close();
switch (m_id) { case 0: if (!pdb- >Open(_T("Super_ES"))) //Á¬½ÓÊý¾ÝÔ´Super_ES { AfxMessageBox("Êý¾ÝÔ´Super_ES´ò¿ªÊ§°Ü£¬" "Çë¼ì²éÏàÓ¦µÄODBCÁ¬½Ó", MB_OK|MB_ICONWARNING); exit(0); } m_id=1; break; case 1: if (!pdb- >Open(_T("Motor"))) //Á¬½ÓÊý¾ÝÔ´Motor { AfxMessageBox("Êý¾ÝÔ´Motor´ò¿ªÊ§°Ü£¬" "Çë¼ì²éÏàÓ¦µÄODBCÁ¬½Ó", MB_OK|MB_ICONWARNING); exit(0); } m_id=0; break; } } ---- ËÄ£®×ܽá
---- Visual C++(www.cppentry.com) ÖеÄODBC Àà¿â¿ÉÒÔ°ïÖú³ÌÐòÔ±Íê³É¾ø´ó¶àÊýµÄÊý¾Ý¿â²Ù×÷¡£ÀûÓÃODBC ¼¼ÊõʹµÃ³ÌÐòÔ±´Ó¾ßÌåµÄDBMS ÖнâÍѳöÀ´£¬´Ó¶ø¼«´óµÄ¼õÉÙÁËÈí¼þ¿ª·¢µÄ¹¤×÷Á¿£¬Ëõ¶Ì¿ª·¢ÖÜÆÚ£¬Ìá¸ßÁËЧÂʺÍÈí¼þµÄ¿É¿¿ÐÔ¡£±¾ÎÄ×ܽáµÄ±ÊÕß´ÓÊÂÈí¼þ¿ª·¢µÄһЩ¾ÑéÐĵÃÏ£Íû¶Ô´ÓÊÂODBC ¿ª·¢µÄ¹¤×÷ÕßÓÐËù°ïÖú¡£
|