ODBC中怎么利用CRecordset類(lèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶(hù)提供超值的營(yíng)銷(xiāo)型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷(xiāo)型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶(hù)提供了成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
1.MFC中的ODBC類(lèi)
主要有CDatabase、CRecordset、CRecordview、CDBException、CFieldExchange。這些類(lèi)封裝了ODBC
SDK函數(shù),可以很方便的操作支持ODBC的數(shù)據(jù)庫(kù)。
(1)CDatabase類(lèi):封裝應(yīng)用程序與需要訪問(wèn)的數(shù)據(jù)庫(kù)之間的連接,控制事務(wù)的提交和執(zhí)行SQL語(yǔ)句的方法。
(2)CRecordset類(lèi):封裝大部分操縱數(shù)據(jù)庫(kù)的方法,包括瀏覽、修改記錄、控制游標(biāo)移動(dòng),排序等操作。CRecordset類(lèi)是MFC的ODBC類(lèi)中最重要、功能最強(qiáng)大的一個(gè)類(lèi)。CRecordset類(lèi)對(duì)象提供了從數(shù)據(jù)源中提取出的記錄集。在多任務(wù)操作系統(tǒng)或網(wǎng)絡(luò)環(huán)境中,多個(gè)用戶(hù)可以共享同一個(gè)數(shù)據(jù)源。共享數(shù)據(jù)的一個(gè)主要問(wèn)題是如何協(xié)調(diào)各個(gè)用戶(hù)對(duì)數(shù)據(jù)源的修改。CRecordset提供了幾種不同的方法來(lái)處理這個(gè)問(wèn)題,這將由程序采用哪種類(lèi)型的記錄集來(lái)決定。
CRecordset對(duì)象通常用于兩種形式:動(dòng)態(tài)行集(dynasets)和快照集(snapshots)。動(dòng)態(tài)行集能與其他用戶(hù)所做的更改保持同步,快照集則是數(shù)據(jù)的一個(gè)靜態(tài)視圖,當(dāng)別的用戶(hù)改變了記錄時(shí)(包括修改、添加和刪除),快照中的記錄不受影響,也就是說(shuō),快照不反映別的用戶(hù)對(duì)數(shù)據(jù)源記錄的改變.直到調(diào)用了CRecordset::Requery重新查詢(xún)后,快照才會(huì)反映變化。每一種形式在記錄集被打開(kāi)時(shí)都提供一組記錄,所不同的是,當(dāng)在一個(gè)動(dòng)態(tài)行集里滾動(dòng)到一條記錄時(shí),由其他用戶(hù)或是應(yīng)用程序中其他記錄集對(duì)該記錄所做的更改會(huì)相應(yīng)地顯示出來(lái),例如在火車(chē)聯(lián)網(wǎng)銷(xiāo)售系統(tǒng)中,應(yīng)該實(shí)時(shí)的顯示共享數(shù)據(jù)的變化。
(3)CRecordView類(lèi):提供與CRecordset對(duì)象相連接的視圖,可以建立視圖中的控件與數(shù)據(jù)庫(kù)數(shù)據(jù)的對(duì)應(yīng),同時(shí)支持游標(biāo),修改記錄等操作。
(4)CDBException類(lèi):提供對(duì)數(shù)據(jù)庫(kù)操作的異常處理。
(5)CFieldExchange類(lèi):提供用戶(hù)變量與數(shù)據(jù)庫(kù)字段之間的數(shù)據(jù)交換。
2.域數(shù)據(jù)成員與數(shù)據(jù)交換
CRecordset類(lèi)代表一個(gè)記錄集。用戶(hù)一般用ClassWizard創(chuàng)建一個(gè)CRecordset的派生類(lèi)。ClassWizard可以為派生的記錄集類(lèi)創(chuàng)建一批數(shù)據(jù)成員,這些數(shù)據(jù)成員與記錄的各字段相對(duì)應(yīng),被稱(chēng)為字段數(shù)據(jù)成員或域數(shù)據(jù)成員。域數(shù)據(jù)成員與表中的字段名字類(lèi)似,且類(lèi)型匹配。
例如:這是一個(gè)CRecordset類(lèi)的派生類(lèi)的定義
class CSetdata : public CRecordset
{
public:
CSetdata(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSetdata)
// Field/Param Data
//{{AFX_FIELD(CSetdata, CRecordset)
//定義域數(shù)據(jù)成員變量,域數(shù)據(jù)成員用來(lái)與記錄集對(duì)應(yīng)字段進(jìn)行數(shù)據(jù)交換,起到一個(gè)緩沖區(qū)或中間橋梁的作用。也就是說(shuō),我們?cè)谔幚碛涗浖瘯r(shí),實(shí)際上是對(duì)域數(shù)據(jù)成員進(jìn)行操作,而不是直接對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)操作。
CString m_number;
CString m_name;
CString m_sex;
long m_age;
//}}AFX_FIELD
CString number;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSetdata)
public:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
#endif
域數(shù)據(jù)成員用來(lái)保存某條記錄的各個(gè)字段,它們是程序與記錄之間的緩沖區(qū)。域數(shù)據(jù)成員代表當(dāng)前記錄,當(dāng)在記錄集中滾動(dòng)到某一記錄時(shí),框架自動(dòng)地把記錄的各個(gè)字段拷貝到記錄集對(duì)象的域數(shù)據(jù)成員中。當(dāng)用戶(hù)要修改當(dāng)前記錄或增加新記錄時(shí),程序先將各字段的新值放入域數(shù)據(jù)成員中,然后調(diào)用相應(yīng)的CRecordset成員函數(shù)把域數(shù)據(jù)成員設(shè)置到數(shù)據(jù)源中。
不難看出,在記錄集與數(shù)據(jù)源之間有一個(gè)數(shù)據(jù)交換問(wèn)題.CRecordset類(lèi)使用"記錄域交換"(Record Field Exchange,縮寫(xiě)為RFX)機(jī)制自動(dòng)地在域數(shù)據(jù)成員和數(shù)據(jù)源之間交換數(shù)據(jù)。RFX機(jī)制與對(duì)話(huà)數(shù)據(jù)交換(DDX)類(lèi)似。CRecordset的成員函數(shù)DoFieldExchange負(fù)責(zé)數(shù)據(jù)交換任務(wù),在該函數(shù)中調(diào)用了一系列RFX函數(shù)。當(dāng)用戶(hù)用ClassWizard加入域數(shù)據(jù)成員時(shí),ClassWizard會(huì)自動(dòng)在DoFieldExchange中建立RFX。
典型的DoFieldExchange函數(shù)
void CSetdata::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CSetdata)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, _T("[number]"), m_number); //實(shí)現(xiàn)了域數(shù)據(jù)成員和數(shù)據(jù)源之間的數(shù)據(jù)交換
RFX_Text(pFX, _T("[name]"), m_name);
RFX_Text(pFX, _T("[sex]"), m_sex);
RFX_Long(pFX, _T("[age]"), m_age);
//}}AFX_FIELD_MAP
pFX->SetFieldType(CFieldExchange::param);
RFX_Text(pFX,_T("[]"),number);
}
3.記錄集的建立和關(guān)閉
使用MFC的ODBC類(lèi)操作數(shù)據(jù)庫(kù)首先要建立一個(gè)CRecordset的派生類(lèi)來(lái)關(guān)聯(lián)對(duì)應(yīng)的數(shù)據(jù)表,然后調(diào)用Open()函數(shù)來(lái)查詢(xún)數(shù)據(jù)源中的數(shù)據(jù)并建立記錄集。此外,在Open函數(shù)中,可能還會(huì)調(diào)用GetDefaultConnect和GetDefaultSQL函數(shù)。
(1)首先在派生類(lèi)的構(gòu)造函數(shù)中會(huì)有一個(gè)參數(shù)指向一個(gè)CDatabase對(duì)象,用來(lái)獲取數(shù)據(jù)源。函數(shù)如下:
CRecordset(CDatabase* pDatabase = NULL);
如果pDatabase為NULL,則會(huì)在Open函數(shù)中自動(dòng)構(gòu)建一個(gè)CDatabase對(duì)象。如果CDatabase對(duì)象還未與數(shù)據(jù)源連接,那么在Open函數(shù)中會(huì)建立連接,連接字符串由成員函數(shù)GetDefaultConnect提供。
(2)virtual CString GetDefaultConnect();
該函數(shù)返回缺省的連接字符串。Open函數(shù)在必要的時(shí)侯會(huì)調(diào)用該函數(shù)獲取連接字符串以建立與數(shù)據(jù)源的連接。一般需要在CRecordset派生類(lèi)中覆蓋該函數(shù)并在新版的函數(shù)中提供連接字符串。
例如:CSetdata為CRecordset類(lèi)的派生類(lèi)
CString CSetdata::GetDefaultConnect()
{
return _T("ODBC;DSN=my data");
}
這個(gè)函數(shù)獲取了數(shù)據(jù)庫(kù)連接字符串,包括連接方式以及數(shù)據(jù)源的名稱(chēng)。
(3)virtual CString GetDefaultSQL();
Open函數(shù)在必要時(shí)會(huì)調(diào)用該函數(shù)返回缺省的SQL語(yǔ)句或表名以查詢(xún)數(shù)據(jù)源中的記錄。一般需要在CRecordset派生類(lèi)中覆蓋該函數(shù)并在新版的函數(shù)中提供SQL語(yǔ)句或表名。
例如:
CString CSetdata::GetDefaultSQL()
{
return _T("[bingli]");
}
這個(gè)類(lèi)返回的是數(shù)據(jù)源中數(shù)據(jù)表bingli的名稱(chēng)。
(4)virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );
該函數(shù)使用指定的SQL語(yǔ)句查詢(xún)數(shù)據(jù)源中的記錄并按指定的類(lèi)型和選項(xiàng)建立記錄集。參數(shù)nOpenType說(shuō)明了記錄集的類(lèi)型,如下表所示。如果要求的類(lèi)型驅(qū)動(dòng)程序不支持,則函數(shù)將產(chǎn)生一個(gè)異常。參數(shù)lpszSQL是一個(gè)SQL的SELECT語(yǔ)句,或是一個(gè)表名。函數(shù)用lpszSQL來(lái)進(jìn)行查詢(xún),如果該參數(shù)為NULL,則函數(shù)會(huì)調(diào)用GetDefaultSQL獲取缺省的SQL語(yǔ)句。參數(shù)dwOptions可以是一些選項(xiàng)的組合,常用的選項(xiàng)在下表中列出。若創(chuàng)建成功則函數(shù)返回TRUE,若函數(shù)調(diào)用了CDatabase::Open且返回FALSE,則函數(shù)返回FALSE.
記錄集的類(lèi)型
類(lèi)型
含義
AFX_DB_USE_DEFAULT_TYPE 使用缺省值.
CRecordset::dynaset 可雙向滾動(dòng)的動(dòng)態(tài)集.
CRecordset::snapshot 可雙向滾動(dòng)的快照.
CRecordset::dynamic 提供比動(dòng)態(tài)集更好的動(dòng)態(tài)特性,大部分ODBC驅(qū)動(dòng)程序不支持這種記錄集.
CRecordset::forwardOnly 只能前向滾動(dòng)的只讀記錄集.
創(chuàng)建記錄集時(shí)的常用選項(xiàng)
選項(xiàng)
含義
CRecordset::none 無(wú)選項(xiàng)(缺?。?nbsp;
CRecordset::appendOnly 不允許修改和刪除記錄,但可以添加記錄.
CRecordset::readOnly 記錄集是只讀的.
CRecordset::skipDeletedRecords 有些數(shù)據(jù)庫(kù)(如FoxPro)在刪除記錄時(shí)并不真刪除,而是做個(gè)刪除標(biāo)記,在滾動(dòng)時(shí)將跳過(guò)這些被刪除的記錄。
如果所有的參數(shù)都為空,例如:
CSetdata *pset = new CSetdata();
pset->Open();
那么Open()函數(shù)將會(huì)調(diào)用GetDefaultSQL()函數(shù)獲取指定數(shù)據(jù)表的數(shù)據(jù)并建立數(shù)據(jù)集。實(shí)際上,如果只提供表名,CRecordset類(lèi)會(huì)構(gòu)造一個(gè)SELECT語(yǔ)句來(lái)查詢(xún)數(shù)據(jù)源。例如:SELECT
(能提供的字段名) FROM bingli(即GetDefaultSQL()函數(shù)返回的表名)。
(5) 建立記錄集后,用戶(hù)可以隨時(shí)調(diào)用Requery成員函數(shù)來(lái)重新查詢(xún)和建立記錄集。Requery有兩個(gè)重要用途:
使記錄集能反映用戶(hù)對(duì)數(shù)據(jù)源的改變
按照新的過(guò)濾或排序方法查詢(xún)記錄并重新建立記錄集.
在調(diào)用Requery之前,可調(diào)用CanRestart來(lái)判斷記錄集是否支持Requery操作。要記住Requery只能在成功調(diào)用Open后調(diào)用,所以程序應(yīng)調(diào)用IsOpen來(lái)判斷記錄集是否已建立.函數(shù)的聲明為
virtual BOOL Requery( );
throw( CDBException, CMemoryException );
返回TRUE表明記錄集建立成功,否則返回FALSE。若函數(shù)內(nèi)部出錯(cuò)則產(chǎn)生異常.
BOOL CanRestart( ) const; //若支持Requery則返回TRUE
BOOL IsOpen( ) const; //若記錄集已建立則返回TRUE
CRecordset類(lèi)有兩個(gè)公共數(shù)據(jù)成員m_strFilter和m_strSort用來(lái)設(shè)置對(duì)記錄的過(guò)濾和排序。在調(diào)用Open或Requery前,如果在這兩個(gè)數(shù)據(jù)成員中指定了過(guò)濾或排序,那么Open和Requery將按這兩個(gè)數(shù)據(jù)成員指定的過(guò)濾和排序來(lái)查詢(xún)數(shù)據(jù)源。
成員m_strFilter用于指定過(guò)濾器。m_strFilter實(shí)際上包含了SQL的WHERE子句的內(nèi)容,但它不含WHERE關(guān)鍵字。使用m_strFilter的一個(gè)例子為:
m_pSet->m_strFilter=“CourseID=‘MATH101’”; //只選擇CourseID為MATH101的記錄
if(m_pSet->Open(CRecordset::snapshot, “Section”))
. . . . . .
成員m_strSort用于指定排序.m_strSort實(shí)際上包含了ORDER BY子句的內(nèi)容,但它不含ORDER BY關(guān)鍵字.m_strSort的一個(gè)例子為
m_pSet->m_strSort=“CourseID DESC”; //按CourseID的降序排列記錄
m_pSet->Open();
. . . . . .
事實(shí)上,Open函數(shù)在構(gòu)造SELECT語(yǔ)句時(shí),會(huì)把m_strFilter和m_strSort的內(nèi)容放入SELECT語(yǔ)句的WHERE和ORDER
BY子句中.如果在Open的lpszSQL參數(shù)中已包括了WHERE和ORDER BY子句,那么m_strFilter和m_strSort必需為空.
調(diào)用無(wú)參數(shù)成員函數(shù)Close可以關(guān)閉記錄集.在調(diào)用了Close函數(shù)后,程序可以再次調(diào)用Open建立新的記錄集.CRecordset的析構(gòu)函數(shù)會(huì)調(diào)用Close函數(shù),所以當(dāng)刪除CRecordset對(duì)象時(shí)記錄集也隨之關(guān)閉。
4.滾動(dòng)記錄
CRecordset提供了幾個(gè)成員函數(shù)用來(lái)在記錄集中滾動(dòng),如下所示.當(dāng)用這些函數(shù)滾動(dòng)到一個(gè)新記錄時(shí),框架會(huì)自動(dòng)地把新記錄的內(nèi)容拷貝到域數(shù)據(jù)成員中。
void MoveNext(); //前進(jìn)一個(gè)記錄
void MovePrev(); //后退一個(gè)記錄
void MoveFirst(); //滾動(dòng)到記錄集中的第一個(gè)記錄
void MoveLast(); //滾動(dòng)到記錄集中的最后一個(gè)記錄
void SetAbsolutePosition( long nRows );
該函數(shù)用于滾動(dòng)到由參數(shù)nRows指定的絕對(duì)位置處.若nRows為負(fù)數(shù),則從后往前滾動(dòng).例如,當(dāng)nRows為-1時(shí),函數(shù)就滾動(dòng)到記錄集的末尾。注意,該函數(shù)不會(huì)跳過(guò)被刪除的記錄。
virtual void Move( long nRows, WORD wFetchType = SQL_FETCH_RELATIVE );
該函數(shù)功能強(qiáng)大.通過(guò)將wFetchType參數(shù)指定為SQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_FIRST、SQL_FETCH_LAST和SQL_FETCH_ABSOLUTE,可以完成上面五個(gè)函數(shù)的功能.若wFetchType為SQL_FETCH_RELATIVE,那么將相對(duì)當(dāng)前記錄移動(dòng),若nRows為正數(shù),則向前移動(dòng),若nRows為負(fù)數(shù),則向后移動(dòng)。
如果在建立記錄集時(shí)選擇了CRecordset::skipDeletedRecords選項(xiàng),那么除了SetAbsolutePosition外,在滾動(dòng)記錄時(shí)將跳過(guò)被刪除的記錄,這一點(diǎn)對(duì)象FoxPro這樣的數(shù)據(jù)庫(kù)十分重要。
如果記錄集是空的,那么調(diào)用上述函數(shù)將產(chǎn)生異常。另外,必須保證滾動(dòng)沒(méi)有超出記錄集的邊界。調(diào)用IsEOF和IsBOF可以進(jìn)行這方面的檢測(cè)。
BOOL IsEOF( ) const; //如果記錄集為空或滾動(dòng)過(guò)了最后一個(gè)記錄,那么函數(shù)返回TRUE,否則返回FALSE。
BOOL IsBOF( ) const; //如果記錄集為空或滾動(dòng)過(guò)了第一個(gè)記錄,那么函數(shù)返回TRUE,否則返回FALSE。
下面是一個(gè)使用IsEOF的例子:
while(!m_pSet->IsEOF( ))
m_pSet->MoveNext( );
調(diào)用GetRecordCound可獲得記錄集中的記錄總數(shù),該函數(shù)的聲明為:
long GetRecordCount( ) const;
要注意這個(gè)函數(shù)返回的實(shí)際上是用戶(hù)在記錄集中滾動(dòng)的最遠(yuǎn)距離.要想真正返回記錄總數(shù),只有調(diào)用MoveNext移動(dòng)到記錄集的末尾(MoveLast不行)。
5.修改、添加和刪除記錄
要修改當(dāng)前記錄,應(yīng)該按下列步驟進(jìn)行:
調(diào)用Edit成員函數(shù).調(diào)用該函數(shù)后就進(jìn)入了編輯模式,程序可以修改域數(shù)據(jù)成員.注意不要在一個(gè)空的記錄集中調(diào)用Edit,否則會(huì)產(chǎn)生異常.
Edit函數(shù)會(huì)把當(dāng)前域數(shù)據(jù)成員的內(nèi)容保存在一個(gè)緩沖區(qū)中,這樣做有兩個(gè)目的,一是可以與域數(shù)據(jù)成員作比較以判斷哪些字段被改變了,二是在必要的時(shí)侯可以恢復(fù)域數(shù)據(jù)成員原來(lái)的值.若再次調(diào)用Edit,則將從緩沖區(qū)中恢復(fù)域數(shù)據(jù)成員,調(diào)用后程序仍處于編輯模式.調(diào)用Move(AFX_MOVE_REFRESH)或Move(0)可退出編輯模式(AFX_MOVE_REFRESH的值為0),同時(shí)該函數(shù)會(huì)從緩沖區(qū)中恢復(fù)域數(shù)據(jù)成員.
設(shè)置域數(shù)據(jù)成員的新值.
調(diào)用Update完成編輯.Update把變化后的記錄寫(xiě)入數(shù)據(jù)源并結(jié)束編輯模式.
要向記錄集中添加新的記錄,應(yīng)該按下列步驟進(jìn)行:
調(diào)用AddNew成員函數(shù).調(diào)用該函數(shù)后就進(jìn)入了添加模式,該函數(shù)把所有的域數(shù)據(jù)成員都設(shè)置成NULL(注意,在數(shù)據(jù)庫(kù)術(shù)語(yǔ)中,NULL是指沒(méi)有值,這與C++的NULL是不同的).與Edit一樣,AddNew會(huì)把當(dāng)前域數(shù)據(jù)成員的內(nèi)容保存在一個(gè)緩沖區(qū)中,在必要的時(shí)侯,程序可以再次調(diào)用AddNew取消添加操作并恢復(fù)域數(shù)據(jù)成員原來(lái)的值,調(diào)用后程序仍處于添加模式.調(diào)用Move(AFX_MOVE_REFRESH)可退出添加模式,同時(shí)該函數(shù)會(huì)從緩沖區(qū)中恢復(fù)域數(shù)據(jù)成員.
設(shè)置域數(shù)據(jù)成員.
調(diào)用Update.Update把域數(shù)據(jù)成員中的內(nèi)容作為新記錄寫(xiě)入數(shù)據(jù)源,從而結(jié)束了添加.
如果記錄集是快照,那么在添加一個(gè)新的記錄后,需要調(diào)用Requery重新查詢(xún),因?yàn)榭煺諢o(wú)法反映添加操作.
要?jiǎng)h除記錄集的當(dāng)前記錄,應(yīng)按下面兩步進(jìn)行:
調(diào)用Delete成員函數(shù).該函數(shù)會(huì)同時(shí)給記錄集和數(shù)據(jù)源中當(dāng)前記錄加上刪除標(biāo)記.注意不要在一個(gè)空記錄集中調(diào)用Delete,否則會(huì)產(chǎn)生一個(gè)異常.
滾動(dòng)到另一個(gè)記錄上以跳過(guò)刪除記錄.
上面提到的函數(shù)聲明為:
virtual void Edit( );throw( CDBException, CMemoryException );
virtual void AddNew( );throw( CDBException );
virtual void Delete( );throw( CDBException );
virtual BOOL Update( );throw( CDBException );
若更新失敗則函數(shù)返回FALSE,且會(huì)產(chǎn)生一個(gè)異常.
在對(duì)記錄集進(jìn)行更改以前,程序也許要調(diào)用下列函數(shù)來(lái)判斷記錄集是否是可以更改的,因?yàn)槿绻诓荒芨牡挠涗浖羞M(jìn)行修改、添加或刪除將導(dǎo)致異常的產(chǎn)生.
BOOL CanUpdate( ) const; //返回TRUE表明記錄是可以修改、添加和刪除的.
BOOL CanAppend( ) const; //返回TRUE則表明可以添加記錄.
關(guān)于ODBC中怎么利用CRecordset類(lèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。