第一篇:NB-IOT使用小結(jié)
一、NB-IOT簡介
萬物互聯(lián)的時(shí)代正以極其迅速的腳步走進(jìn)我們的生活,據(jù)估計(jì)2020年大約有500億臺(tái)設(shè)備連接到互聯(lián)網(wǎng)。而實(shí)現(xiàn)萬物互聯(lián)的基礎(chǔ)之一在于安全、可靠的數(shù)據(jù)傳輸。隨著5G技術(shù)方案逐漸落地,世界各地巨頭支持的NB-IoT(窄帶蜂窩物聯(lián)網(wǎng))首當(dāng)其沖無疑是物聯(lián)網(wǎng)無比渴望的一個(gè)強(qiáng)有力的蜂窩基礎(chǔ)網(wǎng)絡(luò),市場前景廣闊,應(yīng)用場景豐富。NB-IoT或?qū)⒊蔀樽顭岬膭?chuàng)客發(fā)展方向。
NB-IoT(Narrowband Internet of Thing)采用超窄帶、重復(fù)傳輸、精簡網(wǎng)絡(luò)協(xié)議等設(shè)計(jì),以犧牲一定速率、時(shí)延、移動(dòng)性性能,獲取面向LWPA物聯(lián)網(wǎng)的承載能力。NB-IoT作為一種新的窄帶蜂窩通信LPWAN(低功耗廣域網(wǎng))解決方案,將給物聯(lián)網(wǎng)行業(yè)帶來巨大的變革與創(chuàng)新。該解決方案具有諸多優(yōu)勢:
覆蓋廣且深:比GPRS覆蓋增強(qiáng)20dB+; 低功耗:基于AA電池,使用壽命可超過10年; 低成本;
強(qiáng)連接:50k+用戶容量/200kHz小區(qū)。
NB-IoT技術(shù)的六大主要應(yīng)用場景恰恰是現(xiàn)有移動(dòng)通信很難支持的場景,包括位置跟蹤、環(huán)境監(jiān)測、智能泊車、遠(yuǎn)程抄表、農(nóng)業(yè)和畜牧業(yè)這些場景。市場研究公司Machina預(yù)測,NB-IoT未來將覆蓋25%的物聯(lián)網(wǎng)連接。
二、調(diào)研過程
調(diào)研所需的NB-IoT模塊采購于上海移遠(yuǎn)通信技術(shù)股份有限公司,由于我們SIM卡電信合作方較積極,而且公司附近已布置電信NB-IoT基站,故采購了一款適用于電信的模塊。
瀏覽資料發(fā)現(xiàn),NB-IoT當(dāng)前各運(yùn)營商支持的頻段主要由以下3中:電信支持 800MHz(實(shí)際上該頻段處于 BC95-B5 的 850MHz 頻段范圍內(nèi)),移動(dòng)支持 900MHz,聯(lián)通支持 900MHz 和 1800MHz。要使其與電信的頻段相匹配,故用Code Loader User Guide工具更新最新固件BC95HA-02-STD_850。
更新完固件之后,需插上SIM卡,然后寫IMEI號(hào),過程如下:先執(zhí)行 AT+CFUN=0 命令,然后再執(zhí)行 AT+NTSETID=1,……設(shè)置 IMEI 號(hào)。設(shè)置后執(zhí)行 AT+CGSN=1 查詢是否設(shè)置成功。IMEI 號(hào)只能設(shè)置一次。(IMEI 號(hào)獲取:模塊標(biāo)簽上寫的 IMEI)。BC95 模塊從 B656 版本開始增加了擾碼(Scrambling)控制功能,此功能可通過 AT 命令進(jìn)行控制。模塊出廠默認(rèn)開啟此功能,此時(shí)基站(Base Transceiver Station)也需要開啟擾碼功能,否則模塊搜不到信號(hào),無法連接基站。若關(guān)閉擾碼功能,此時(shí)基站也需要關(guān)閉擾碼功能,模塊才可連接基站。由于不知基站是否開啟擾碼功能,故在接下來步驟之前,進(jìn)行了這兩種嘗試,確定其狀態(tài)。
接下來的步驟是附著網(wǎng)絡(luò),具體過程如下:
The following shows a simple example to manually attach the network.Neul //Module is powered on, wait for 3 seconds.OK AT+CGSN=1 //Query the IMEI number.If only ERROR is returned, you need to write the IMEI.+CGSN: *** OK AT+CFUN=1 //Configure the level of functionality in the MT.OK AT+CIMI //Query the IMSI and wait for 4 seconds after executing AT+CFUN=1.*** OK AT+NBAND? //Query the band information, set BC95-CM/B8 to BAND 8, BC95-SL/B5 to BAND 5, and BC95-VF/B20 to BAND 20.Execute AT+NBAND=n to set the frequency band.It will take effect after restart.+NBAND:5 OK AT+CGDCONT=1,“IP”,“HUAWEI.COM” //Configuration PDP.OK AT+CGATT=1 //Activate the network.OK AT+CSQ //Query current signal quality.+CSQ:24,99 OK AT+CGATT? //Query whether network is activated, +CGATT:1 means activated successfully.And wait for some time.+CGATT:1 OK AT+CEREG? //Query current EPS network registration status: Registered.+CEREG:0,1 OK AT+CSCON? //Query the signaling connection status, 1 means CONNECT, 0 means IDLE.+CSCON:0,0//使用手冊上的狀態(tài)是+CSCON:0,1 OK 附著網(wǎng)絡(luò)之后,便可以發(fā)送消息了。消息的發(fā)送可以有2種方式:
1、CoAP Messages
2、UDP Messeages。由于之前有過SIM800A的調(diào)試經(jīng)驗(yàn),并且手上可以搭建現(xiàn)成的UDP服務(wù)器,故采用了方式二的方式,具體過程如下:
AT+NSOCR= DGRAM,17,4400,1 //Create socket 0 OK AT+NSOST=0,123.57.41.13,4400,3,112233//Send messages 0,3 OK +NSONMI:0,4 //Receive messages AT+NSORF=0,4 //Read messages 0,123.57.41.13,4400,4,60A041C7,0 OK AT+NSOCL=0 //Close socket OK NB-IoT工作狀態(tài)有如下特點(diǎn):
1.三種連接狀態(tài)下,均可發(fā)送上行數(shù)據(jù)(CoAP/UDP);IDLE 下發(fā)送數(shù)據(jù),模塊會(huì)進(jìn)入 CONNECT 狀態(tài);PSM 下發(fā)送是數(shù)據(jù)會(huì)喚醒模塊,進(jìn)入 CONNECT,或者當(dāng) TAU 超時(shí),模塊喚醒,進(jìn)入 CONNECT。
2.IDLE 下,可接收下行數(shù)據(jù),模塊進(jìn)入 CONNECT 狀態(tài),PSM 下不接收下行數(shù)據(jù)。
3.TAU 的時(shí)長是指從進(jìn)入 IDLE 開始一直到 PSM 模式結(jié)束。通過對NB-IoT模塊的多次測試,可以得出以下結(jié)論:
1、低功耗:由上圖可以看出NB-IoT模塊可以工作在3種狀態(tài),以便節(jié)約功耗。在PSM模式下最大耗流為 5uA,在IDLE模式下大約為6mA。根據(jù)TR45.820的仿真數(shù)據(jù),5Wh的電池每天發(fā)送200bytes的數(shù)據(jù),預(yù)計(jì)可使用12.8年。故可用于開發(fā)置于高山荒野偏遠(yuǎn)地區(qū)的設(shè)備。
2、強(qiáng)鏈接:在同一基站的情況下,NB-IoT可以比現(xiàn)有無線技術(shù)提供50-100倍的接入數(shù)。這就意味著我們可以在一個(gè)不太大的空間,放置更多設(shè)備而互相又不會(huì)有干擾。
3、廣覆蓋:將提供改進(jìn)的室內(nèi)覆蓋,在同樣的頻段下,NB-IoT比現(xiàn)有的網(wǎng)絡(luò)增益20dB,相當(dāng)于提升了100倍覆蓋區(qū)域的能力。對于地下車庫、井蓋這些需要安裝數(shù)據(jù)采集裝置的地方,NB-IoT更加適用于使用3G/4G無線模塊或 433MHz的無線裝置的場合。
4、低成本:無論是模塊成本,還是供電、通訊運(yùn)營成本都比其他無線裝置便宜。隨著NB-IoT的發(fā)展,單個(gè)連接模塊的預(yù)期價(jià)格不超過5美元,甚至?xí)椭?美元。近期,電信發(fā)布了首個(gè)NB-IoT的包年套餐,只需要20元。
第二篇:關(guān)于NBIoT和GPRS的應(yīng)用總結(jié)
主要IOT技術(shù)要求與市場業(yè)務(wù)分布
NB-IoT是IoT領(lǐng)域一個(gè)新興的技術(shù),支持低功耗設(shè)備在廣域網(wǎng)的蜂窩數(shù)據(jù)連接。NB-IoT使用授權(quán)頻段基于運(yùn)營商全球覆蓋最為廣泛的網(wǎng)絡(luò)可直接部署于GSM網(wǎng)絡(luò)、UMTS網(wǎng)絡(luò)或LTE網(wǎng)絡(luò),享有更好的服務(wù)。
LoRa的誕生比NB-IoT要早些,LoRa工作在非授權(quán)頻段,故不需要額外付費(fèi),LoRa協(xié)議比NB-IoT更簡單,更容易開發(fā),相對成本少。LoRa節(jié)點(diǎn)可以根據(jù)具體應(yīng)用場景需求進(jìn)行或長或短的睡眠,電池壽命更長
GPRS是通用分組無線服務(wù)技術(shù)的簡稱。對于分組交換模式,用戶只有在發(fā)送或接收數(shù)據(jù)期間才占用資源,這意味著多個(gè)用戶可高效率地共享同一無線信道,從而提高了資源的利用率,相對鏈接時(shí)間長支付費(fèi)用卻低。GPRS可提供高達(dá)115kbps的傳輸速率,傳輸速率高??偨Y(jié):IoT領(lǐng)域并沒有一個(gè)沒有爭議的選擇,每一個(gè)應(yīng)用場景都有自己獨(dú)特的需求和考慮。NB適合的業(yè)務(wù),在于低頻次的業(yè)務(wù),最好是一天通信一次,其余時(shí)間最好能夠休眠或者關(guān)機(jī),從而實(shí)現(xiàn)低功耗,乃至網(wǎng)絡(luò)容量的擴(kuò)大。
從這個(gè)角度來說,NB適合三表(燃?xì)獗?,水表,熱力?,垃圾桶監(jiān)控,窨井蓋監(jiān)控,煙感監(jiān)控,路燈監(jiān)控,等等供電不方便,并且是不需要高頻次通信的場合。至于GPS定位跟蹤之類的產(chǎn)品,我們還是優(yōu)先選擇GPRS網(wǎng)絡(luò)。網(wǎng)絡(luò)層應(yīng)用:
GPRS 屬于長距離通訊,歷史比較久遠(yuǎn),除了手機(jī)通訊以外,包括POS機(jī)、共享單車、車載GPRS等移動(dòng)應(yīng)用均有較廣的使用。是第二代的數(shù)字通信系統(tǒng),以及之后的升級 3G、4G、5G等。
NB-IOT 屬于中遠(yuǎn)距離通訊技術(shù),工作頻率在433MHz~912MHZ,有效通訊距離應(yīng)該在5~10公里以內(nèi)。是這兩年由華為等通訊服務(wù)商牽頭的標(biāo)準(zhǔn),獲得國家的支持,主要面向于物聯(lián)網(wǎng)、智能家居應(yīng)用,以及電表水表電網(wǎng)等國家基礎(chǔ)設(shè)施上使用。
兩者均基于蜂窩技術(shù)實(shí)現(xiàn)廣域無線網(wǎng)絡(luò)的標(biāo)準(zhǔn),且均由通訊運(yùn)營商鋪設(shè)無線基站。簡單來說,NB-IOT 與GPRS最大的區(qū)別在于,NB功耗遠(yuǎn)低于GPRS,這樣可以解決很多應(yīng)用領(lǐng)域供電麻煩,比如煙感報(bào)警器、電網(wǎng)故障檢測儀、各類家居傳感器&控制器、區(qū)域內(nèi)物體移動(dòng)監(jiān)測(手環(huán))、工業(yè)流水線監(jiān)測等。
但NB也有自身的缺陷就是傳輸速率比GPRS要低,這是其技術(shù)的局限,所以并不能適合用于有高速率要求的領(lǐng)域,比如IP Camera、藍(lán)牙音響、手機(jī)通訊等。
GPRS通訊模塊:
1,是GSM的一種移動(dòng)數(shù)據(jù)業(yè)務(wù),是2G移動(dòng)通信的數(shù)據(jù)傳輸技術(shù)。2,傳輸速率為幾十kbps 3,永遠(yuǎn)在線,不會(huì)被呼入的電話打斷
4,模塊啟動(dòng)電流較大,典型供電電壓3.8v,4.0V,4.2V,約2A,5,模塊價(jià)格¥20-30 GPRS供電電路要求:
GSM/GPRS 模組供電設(shè)置在3.8V/2A 的規(guī)格主要考慮點(diǎn):
1、一般模組供電電壓最小3.4~4.2V,有3-400mV跌落電壓要求;
2、一般模組正常工作電流0.8A左右,撥號(hào)瞬間會(huì)有持續(xù)幾秒鐘1.8A左右的脈沖電流。因此,ISL91107IR在0.8A左右轉(zhuǎn)換效率最高,1.8A脈沖電流需要C9、C10提供一部分能量,同時(shí)盡量使模組供電電壓盡可能最小,降低整個(gè)功率輸出。
GPRS(SIM868、SIM808)模塊采用單電源供電,VBAT 供電范圍3.2 ~4.2V 之間,推薦電壓為4.0V,模塊射頻發(fā)射時(shí)會(huì)導(dǎo)致電壓跌落,這時(shí)電流的峰值最高會(huì)達(dá)到2A 以上,因此電源供電能力盡可能達(dá)到2A,并建議VBAT引腳并接大電容(電容根據(jù)供電IC 輸出能力確定)。電源芯片選擇上需要注意,如果外部輸入電壓與VBAT壓差很大,建議選擇開關(guān)電源, 當(dāng)選用DC-DC時(shí)需注意EMI 干擾,建議串接磁珠以備調(diào)整;如果外部輸入電壓與VBAT壓差不大,最好選用LDO??蛻舻漠a(chǎn)品需要過TA、CE、FCC等認(rèn)證,推薦選擇LDO供電。
為了增強(qiáng)模塊電源抗干擾能力(主要抗浪涌,脈沖群,靜電等),不至于在外界環(huán)境比較惡劣的情況下導(dǎo)致模塊供電異常,建議根據(jù)實(shí)際應(yīng)用在外部電源輸入端加一些共模電感、TVS 管等器件,在VBAT供電芯片輸出端加一些nf、pf 級電容,濾除干擾。電源隔離設(shè)計(jì),從圖3-1 中可以看出,在GPRS 模塊的工作過程中,存在瞬間大電流的
情況,導(dǎo)致電壓波動(dòng),產(chǎn)生開關(guān)噪聲,這些是GSM 移動(dòng)通信制式的固有特性。這種噪聲會(huì)影
響GPRS 模塊以外的電路,特別是模擬信號(hào),以及音頻處理電路。為了規(guī)避這種噪聲,需要將GPRS 模塊的電源和其它電路的電源做隔離處理。隔離措施可以是DC-DC 或者LDO 電路,或者電感搭建的LC 濾波電路。隔離電路可以參考如下原理示意圖3-5。DC-DC 或者LDO,建議使用額定輸出電流峰值大于2A 的電路。LC 濾波電路中,電感L 建議使用10μH,額定電流大于1.2A 的線繞功率電感。
參考電路網(wǎng)址,:https://blog.csdn.net/SharpQian/article/details/56013401
帶鋰電池供電的電源方案.pdf
GPRS在電力系統(tǒng)抄表中的應(yīng)用
電力抄表的場景分為用戶側(cè)通信和配網(wǎng)通信系統(tǒng)。電力負(fù)荷監(jiān)控系統(tǒng)頻段采用230MHz+1.8GHz的TD-LTE專網(wǎng)。
用戶電表的遠(yuǎn)程抄表采用過很多技術(shù),包括GPRS、3G、LTE、PLC、Zigbee、433MHz等等,抄表頻率的目標(biāo)是15分鐘一次采集和上傳,每天96個(gè)點(diǎn),以便實(shí)現(xiàn)電網(wǎng)的在線監(jiān)測控制。
中國等居住集中的地方主要是采用集中式抄表,主要有電力光纖集抄和GPRS集抄(占比超過50%),歐美等居住分散的地方主要采用獨(dú)立抄表。由于電力抄表供電不是問題,數(shù)據(jù)量相對較大,目前尚未體會(huì)到電力抄表利用NB-IoT的迫切需求。
NB-IOT 1,NB-IoT,即窄帶物聯(lián)網(wǎng)(Narrow Band Internet of Things)。可直接部署于GSM網(wǎng)絡(luò)、UMTS網(wǎng)絡(luò)或LTE網(wǎng)絡(luò),部署成本低。2,一種新興技術(shù),覆蓋面積廣,低功耗廣域網(wǎng)。
3,資費(fèi)低,未來可能取代GPRS,NB-IoT比LTE和GPRS基站提升了20dB的增益,期望能覆蓋到地下車庫、地下室、地下管道等信號(hào)難以到達(dá)的地方。4,模塊價(jià)格預(yù)計(jì)5美元。應(yīng)用領(lǐng)域:
區(qū)別:
共點(diǎn)一:GPRS DTU與NB-Iot DTU作為不同網(wǎng)絡(luò)制式的DTU,其工作原理和功能都是一樣的,都是實(shí)現(xiàn)工業(yè)設(shè)備在戶外與遠(yuǎn)程服務(wù)器雙向透明傳輸數(shù)據(jù)。
共點(diǎn)二:應(yīng)用領(lǐng)域大致相同,甚至可以無縫切換。GPRS DTU與NB-Iot DTU都適用于對傳輸速率要求不高的工業(yè)現(xiàn)場領(lǐng)域。
GPRS DTU與NB-Iot DTU的區(qū)別
第一,NB-Iot DTU的網(wǎng)絡(luò)覆蓋更強(qiáng)。NB-Iot在室內(nèi)的覆蓋能力很強(qiáng),比GSM增強(qiáng)20dBm增益,相對應(yīng)的在在覆蓋區(qū)域的范圍上比GPRS提升了100倍。網(wǎng)絡(luò)覆蓋的增強(qiáng)在農(nóng)村,廠區(qū),地下場所的部署上有很大優(yōu)勢。
第二,NB-Iot DTU具有更強(qiáng)的鏈接能力。舉例說明,如果使用相同的基站,NB-Iot DTU比傳統(tǒng)的GPRS DTU提高50-100倍的設(shè)備接入量。在實(shí)際應(yīng)用中接入設(shè)備數(shù)的優(yōu)勢有極大作用。
第三,NB-Iot DTU具有更低的功耗。超低功耗在工業(yè)應(yīng)用中是非常重要的,NB-Iot比GPRS擁有更低的功耗,它的電池可以待機(jī)5-10年不用更換,在一些需要長時(shí)間不能更換電池的場所,NB-Iot DTU可以說是極佳的選擇。
第四,NB-Iot DTU具有更低的成本。目前在山東電信已經(jīng)實(shí)現(xiàn)了NB-Iot99%的網(wǎng)絡(luò)覆蓋,而且這一趨勢正在向全國擴(kuò)展。NB-Iot DTU的低成本想體現(xiàn)在它可以跟傳統(tǒng)蜂窩網(wǎng)絡(luò)共用基礎(chǔ)設(shè)備,不需要重建;在資費(fèi)方面,NB-Iot的一年費(fèi)用才30元錢左右。
第五,NB-Iot DTU具有更好的市場前景。GPRS已經(jīng)面世很久,在國外很多國家地區(qū)面臨逐步淘汰的現(xiàn)狀。NB-Iot DTU擁有更好的前景。
第三篇:sqlldr使用小結(jié)
sqlldr使用小結(jié)
sqlldr userid=lgone/tiger control=a.ctl
LOAD DATA
INFILE ’t.dat’ // 要導(dǎo)入的文件
// INFILE ’tt.date’ // 導(dǎo)入多個(gè)文件
// INFILE * // 要導(dǎo)入的內(nèi)容就在control文件里 下面的BEGINDATA后面就是導(dǎo)入的內(nèi)容
INTO TABLE table_name // 指定裝入的表
BADFILE ’c:\bad.txt’ // 指定壞文件地址
************* 以下是4種裝入表的方式
APPEND // 原先的表有數(shù)據(jù) 就加在后面
// INSERT // 裝載空表 如果原先的表有數(shù)據(jù) sqlloader會(huì)停止 默認(rèn)值
// REPLACE // 原先的表有數(shù)據(jù) 原先的數(shù)據(jù)會(huì)全部刪除
// TRUNCATE // 指定的內(nèi)容和replace的相同 會(huì)用truncate語句刪除現(xiàn)存數(shù)據(jù)
************* 指定的TERMINATED可以在表的開頭 也可在表的內(nèi)部字段部分
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’“’
// 裝載這種數(shù)據(jù): 10,lg,”“"lg”“",”lg,lg“
// 在表中結(jié)果: 10 lg ”lg“ lg,lg
// TERMINATED BY X ’0Array’ // 以十六進(jìn)制格式 ’0Array’ 表示的// TERMINATED BY WRITESPACE // 裝載這種數(shù)據(jù): 10 lg lg
TRAILING NULLCOLS ************* 表的字段沒有對應(yīng)的值時(shí)允許為空
************* 下面是表的字段
(col_1 , col_2 ,col_filler FILLER // FILLER 關(guān)鍵字 此列的數(shù)值不會(huì)被裝載
// 如: lg,lg,not 結(jié)果 lg lg)
// 當(dāng)沒聲明FIELDS TERMINATED BY ’,’ 時(shí)
//(// col_1 [interger external] TERMINATED BY ’,’ ,// col_2 [date ”dd-mon-yyy“] TERMINATED BY ’,’ , // col_3 [char] TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’lg’
//)
// 當(dāng)沒聲明FIELDS TERMINATED BY ’,’用位置告訴字段裝載數(shù)據(jù)
//(// col_1 position(1:2),// col_2 position(3:10),// col_3 position(*:16), // 這個(gè)字段的開始位置在前一字段的結(jié)束位置
// col_4 position(1:16),// col_5 position(3:10)char(8)// 指定字段的類型
//)
BEGINDATA // 對應(yīng)開始的 INFILE * 要導(dǎo)入的內(nèi)容就在control文件里
10,Sql,what
20,lg,show
=======================================
//////////// 注意begindata后的數(shù)值前面不能有空格***** 普通裝載
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’”’
(DEPTNO,DNAME,LOC)
BEGINDATA
10,Sales,“"”USA“"”
20,Accounting,“Virginia,USA”
30,Consulting,Virginia
40,Finance,Virginia
50,“Finance”,“",Virginia // loc 列將為空
60,”Finance“,Virginia // loc 列將為空***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x’0Array’ 的情況
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
--FIELDS TERMINATED BY x’0Array’
(DEPTNO,DNAME,LOC)
BEGINDATA Sales Virginia ***** 指定不裝載那一列
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’”’
(DEPTNO,F(xiàn)ILLER_1 FILLER, // 下面的 “Something Not To Be Loaded” 將不會(huì)被裝載
DNAME,LOC)
BEGINDATA
20,Something Not To Be Loaded,Accounting,“Virginia,USA” ***** position的列子
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
(DEPTNO position(1:2),DNAME position(*:16), // 這個(gè)字段的開始位置在前一字段的結(jié)束位置
LOC position(*:2Array),ENTIRE_LINE position(1:2Array))
BEGINDATA
10Accounting Virginia,USA
***** 使用函數(shù) 日期的一種表達(dá) TRAILING NULLCOLS的使用
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS // 其實(shí)下面的ENTIRE_LINE在BEGINDATA后面的數(shù)據(jù)中是沒有直接對應(yīng)
// 的列的值的 如果第一行改為
10,Sales,Virginia,1/5/2000, 就不用TRAILING NULLCOLS了
(DEPTNO,DNAME “upper(:dname)”, // 使用函數(shù)
LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’, // 日期的一種表達(dá)方式 還有’dd-mon-yyyy’ 等
ENTIRE_LINE “:deptno||:dname||:loc||:last_updated”)
BEGINDATA
10,Sales,Virginia,1/5/2000
20,Accounting,Virginia,21/6/1ArrayArrayArray 30,Consulting,Virginia,5/1/2000
40,Finance,Virginia,15/3/2001 ***** 使用自定義的函數(shù) // 解決的時(shí)間問題
create or replace
function my_to_date(p_string in varchar2)return date
as
type fmtArray is table of varchar2(25);
l_fmts fmtArray := fmtArray(’dd-mon-yyyy’, ’dd-month-yyyy’,’dd/mm/yyyy’,’dd/mm/yyyy hh24:mi:ss’);
l_return date;
begin
for i in 1..l_fmts.count
loop
begin
l_return := to_date(p_string, l_fmts(i));
exception
when others then null;
end;EXIT when l_return is not null;
end loop;
if(l_return is null)
then
l_return :=
new_time(to_date(’01011Array70’,’ddmmyyyy’)+ 1/24/60/60 *
p_string, ’GMT’, ’EST’);
end if;
return l_return;
end;
/
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO, DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)” // 使用自定義的函數(shù))
BEGINDATA
10,Sales,Virginia,01-april-2001
20,Accounting,Virginia,13/04/2001
30,Consulting,Virginia,14/04/2001 12:02:02
40,Finance,Virginia,Array872682Array7
50,Finance,Virginia,02-apr-2001
60,Finance,Virginia,Not a date ***** 合并多行記錄為一行記錄
LOAD DATA
INFILE *
concatenate 3 // 通過關(guān)鍵字concatenate 把幾行的記錄看成一行記錄
INTO TABLE DEPT
replace
FIELDS TERMINATED BY ’,’
(DEPTNO, DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’)
BEGINDATA
10,Sales, // 其實(shí)這3行看成一行 10,Sales,Virginia,1/5/2000
Virginia,1/5/2000
// 這列子用 continueif list=“,” 也可以
告訴sqlldr在每行的末尾找逗號(hào) 找到逗號(hào)就把下一行附加到上一行
LOAD DATA
INFILE *
continueif this(1:1)= ’-’ // 找每行的開始是否有連接字符-有就把下一行連接為一行
// 如-10,Sales,Virginia,// 1/5/2000 就是一行 10,Sales,Virginia,1/5/2000
// 其中1:1 表示從第一行開始 并在第一行結(jié)束 還有continueif next 但continueif list最理想
INTO TABLE DEPT replace
FIELDS TERMINATED BY ’,’
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’)
BEGINDATA // 但是好象不能象右面的那樣使用
-10,Sales,Virginia,-10,Sales,Virginia,1/5/2000 1/5/2000
-40, 40,Finance,Virginia,13/04/2001
Finance,Virginia,13/04/2001 ***** 載入每行的行號(hào)
load data
infile *
into table t
replace
(seqno RECNUM //載入每行的行號(hào)
text Position(1:1024))
BEGINDATA fsdfasj //自動(dòng)分配一行號(hào)給載入 表t 的seqno字段 此行為 1
fasdjfasdfl // 此行為 2...Array ***** 載入有換行符的數(shù)據(jù)
注意: unix 和 windows 不同 \\n & /n
< 1 > 使用一個(gè)非換行符的字符
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)”,COMMENTS “replace(:comments,’\n’,chr(10))” // replace 的使用幫助轉(zhuǎn)換換行符)
BEGINDATA
10,Sales,Virginia,01-april-2001,This is the Sales\nOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting\nOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting\nOffice in Virginia
40,Finance,Virginia,Array872682Array7,This is the Finance\nOffice in Virginia
< 2 > 使用fix屬性
LOAD DATA
INFILE demo17.dat “fix 101”
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)”,COMMENTS)
demo17.dat 10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
40,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia
// 這樣裝載會(huì)把換行符裝入數(shù)據(jù)庫 下面的方法就不會(huì) 但要求數(shù)據(jù)的格式不同
LOAD DATA
INFILE demo18.dat “fix 101”
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’“’
TRAILING NULLCOLS
(DEPTNO, DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)“,COMMENTS)
demo18.dat
10,Sales,Virginia,01-april-2001,”This is the Sales
Office in Virginia“
20,Accounting,Virginia,13/04/2001,”This is the Accounting
Office in Virginia“
30,Consulting,Virginia,14/04/2001 12:02:02,”This is the Consulting
Office in Virginia“
40,Finance,Virginia,Array872682Array7,”This is the Finance
Office in Virginia“
< 3 > 使用var屬性
LOAD DATA
INFILE demo1Array.dat ”var 3“
// 3 告訴每個(gè)記錄的前3個(gè)字節(jié)表示記錄的長度 如第一個(gè)記錄的 071 表示此記錄有 71 個(gè)字節(jié)
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)“,COMMENTS)
demo1Array.dat
07110,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
07820,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
07140,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia
< 4 > 使用str屬性
// 最靈活的一中 可定義一個(gè)新的行結(jié)尾符 win 回車換行 : chr(13)||chr(10)
此列中記錄是以 a|\r\n 結(jié)束的select utl_raw.cast_to_raw(’|’||chr(13)||chr(10))from dual;
結(jié)果 7C0D0A
LOAD DATA
INFILE demo20.dat ”str X’7C0D0A’“
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)",COMMENTS)
demo20.dat 10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia|
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia|
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia|
40,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia|
================================
象這樣的數(shù)據(jù) 用 nullif 子句
10-jan-200002350Flipper seemed unusually hungry today.10510-jan-20000ArrayArray45Spread over three meals.id position(1:3)nullif id=blanks // 這里可以是blanks 或者別的表達(dá)式
// 下面是另一個(gè)列子 第一行的 1 在數(shù)據(jù)庫中將成為 null
LOAD DATA INFILE *
INTO TABLE T
REPLACE
(n position(1:2)integer external nullif n=’1’,v position(3:8))
BEGINDATA 10
20lg
-----------------------------
第四篇:GridCtrl使用小結(jié)
http://004km.cn/
GridCtrl使用詳解
CGridCtrl類主要是通過grid樣式顯示數(shù)據(jù) 在單文檔中的使用方法
步驟一 初始化 在CView類的.h頭文件中包含文件:
#include “Gridctrl.h” 并且手寫加入如下的成員函數(shù):
CGridCtrl * m_pGridCtrl;步驟二 構(gòu)造與析構(gòu) 構(gòu)造函數(shù)中:
m_pGridCtrl = NULL;析構(gòu)函數(shù)中:
if(m_pGridCtrl)
delete m_pGridCtrl;步驟三 如果需要打印功能的話添加同名打印函數(shù)代碼 在CView類的OnBeginPrinting()函數(shù)中添加如下代碼: if(m_pGridCtrl)
m_pGridCtrl->OnBeginPrinting(pDC,pInfo);//簡單吧,這就是類的好處其它兩個(gè)打印函數(shù)也一樣的做法.步驟四 在OnInitaUpdate()函數(shù)中或者你自己添加的要顯示Grid的消息函數(shù)中如下初始化: //創(chuàng)建非模式對話框 CDlg *dlg;dlg=new CDlg();dlg->Create(IDD_Dlg,this);
//初始化GridCtrl控件 if(m_pGridCtrl!=NULL){ deletem_pGridCtrl;m_pGridCtrl=NULL;} if(m_pGridCtrl == NULL){ // Create the Gridctrl object m_pGridCtrl = new CGridCtrl;if(!m_pGridCtrl)return 0;// Create the Gridctrl window CRectrect;GetClientRect(rect);m_pGridCtrl->Create(rect, this, 100);// fill it up with stuff m_pGridCtrl->SetEditable(false);m_pGridCtrl->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));//黃色背景 m_pGridCtrl->EnableDragAndDrop(false);try { m_pGridCtrl->SetRowCount(k);//設(shè)置行數(shù)為k行 m_pGridCtrl->SetColumnCount(4);//k列
m_pGridCtrl->SetFixedRowCount(1);//標(biāo)題行為一行
http://004km.cn/
m_pGridCtrl->SetFixedColumnCount(1);//同上 } catch(CMemoryException* e){ e->ReportError();e->Delete();return 0;} //填充列標(biāo)題 int row=0;for(int col=0;col<4;col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(col==0){ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.strText.Format(_T(“【類別】”),col);} else if(col==1){ Item.nFormat = DT_LEFT|DT_WORDBREAK;Item.strText.Format(_T(“第一列”),col);} else if(col==2){ Item.nFormat = DT_LEFT|DT_WORDBREAK;Item.strText.Format(_T(“第二列”),col);} m_pGridCtrl->SetItem(&Item);} // fill rows/cols with text for(row = 1;row < k;row++)for(col = 0;col < h;col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(col < 1){ //行標(biāo)題頭
Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;Item.strText.Format(_T(“%d”),row);
http://004km.cn/
} else if(col==1){ //第一列的值 Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;str=“aa”;Item.strText.Format(_T(“%s”),str);}else if(col==2){ //第二列第值 Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;CStringstr;str=“bb”;Item.strText.Format(_T(“%s”),str);} m_pGridCtrl->SetItem(&Item);} m_pGridCtrl->AutoSize();
//--------------設(shè)置行列距------------------for(int a=1;a
步驟五: 添加WM_SIZE消息,調(diào)整控件的界面占屏幕大小
if(m_pGridCtrl->GetSafeHWnd())
{
CRectrect;
GetClientRect(rect);
m_pGridCtrl->MoveWindow(rect);
}
在對話框中的使用方法 步驟一 創(chuàng)建數(shù)據(jù)顯示表格對話框
在資源管理器中新創(chuàng)建一個(gè)對話框,假設(shè)為CDlgTestReportBox。從工具箱中加入Custom Control,就是人頭像的那個(gè),將其區(qū)域拉伸至要顯示數(shù)據(jù)表格的大小,充滿整個(gè)對話框。
在CDlgTestReportBox類的頭文件中: #include “GridCtrl.h”
http://004km.cn/
再定義成員變量: CGridCtrl* m_pGrid;添加OnShowWindow()消息處理函數(shù)如下:
voidCDlgTestReportBox::OnShowWindow(BOOL bShow, UINT nStatus){ CDialog::OnShowWindow(bShow, nStatus);// TODO: Add your message handler code here if(m_pGrid!=NULL){ deletem_pGrid;m_pGrid=NULL;} if(m_pGrid==NULL){ m_pGrid=new CGridCtrl;CRectrect;GetDlgItem(IDC_ReportAera)->GetWindowRect(rect);//得到顯示區(qū)域 ScreenToClient(&rect);m_pGrid->Create(rect,this,100);m_pGrid->SetEditable(false);m_pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));//黃色背景 try { m_pGrid->SetRowCount(10);//初始為10行
m_pGrid->SetColumnCount(11);//初始化為11列 m_pGrid->SetFixedRowCount(1);//表頭為一行 m_pGrid->SetFixedColumnCount(1);//表頭為一列 } catch(CMemoryException* e){ e->ReportError();e->Delete();// return FALSE;} for(int row = 0;row
http://004km.cn/
{ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(“報(bào)表顯示”),col);} else if(row < 1)//設(shè)置0行表頭顯示 { Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(“ 項(xiàng)目%d”),col);} else if(col < 1)//設(shè)置0列表頭顯示 { if(row
步驟二 嵌入上面的對話框 顯示數(shù)據(jù)
在你需要顯示數(shù)據(jù)的對話框上的頭文件中,假設(shè)為CDlgTest,加入 #include ”GridCtrl.h“ CDlgTestReportBox* m_pTestReportBox;將數(shù)據(jù)顯示對話框放入你的對話框相應(yīng)位置上,在CDlgTest::OnInitDialog()中:
if(!m_pTestReportBox){
m_pTestReportBox=new CDlgTestReportBox(this);} m_pTestReportBox->Create(IDD_DlgTestReportBox,this);
http://004km.cn/
//定義區(qū)域變量 CRectrectDraw;GetDlgItem(IDC_AeraReport)->GetWindowRect(rectDraw);ScreenToClient(&rectDraw);//動(dòng)態(tài)測試數(shù)據(jù)顯示區(qū)域rectDraw //將對應(yīng)的對話框放到指定區(qū)域 m_pTestReportBox->MoveWindow(rectDraw);m_pTestReportBox->ShowWindow(SW_SHOW);自定義填充數(shù)據(jù)的函數(shù):CDlgTest::FillGrid()如下: CGridCtrl* pGrid=m_pTestReportBox->m_pGrid;for(int row = pGrid->GetRowCount()-1;row >= pGrid->GetRowCount()-3;row--){ for(int col = 1;col <= pGrid->GetColumnCount();col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(row==pGrid->GetRowCount()-3&&col>0)//平均值 { if(col==10){ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(” %6.2f “),avjch);} else{ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(” %6.2f “),av[col-1]);} } pGrid->SetItem(&Item);//提交數(shù)據(jù) if(row==0||col==0){ COLORREF clr = RGB(0, 0, 0);pGrid->SetItemBkColour(row, col, clr);pGrid->SetItemFgColour(row, col, RGB(255,0,0));} }//循環(huán)結(jié)束
pGrid->Invalidate();} CGRIFCTRL原理:
DBGRID和一般的GRID的不同之處在于,一般的GRID并不適合顯示大的數(shù)據(jù)量,如果一個(gè)表中有上萬條記錄都要插入到GRID中,這將是一個(gè)很慢的過程,并且在GRID中移動(dòng)滾動(dòng)條時(shí),它的記錄的滾動(dòng)也是很慢。而DBGRID并不會(huì)真正把這些記錄的數(shù)據(jù)全部插入到控件中,當(dāng)DBGRID的滾動(dòng)條滾動(dòng)時(shí),它會(huì)根據(jù)DBGRID的顯示面積的大小和查詢得到的總記錄數(shù)計(jì)算出當(dāng)前應(yīng)該顯示哪些行,然后插入
http://004km.cn/
到表格中,這樣一來,速度肯定快,而且沒有數(shù)據(jù)量多少的限制。幸運(yùn)的是,CGridCtrl類已經(jīng)為我們提供了這種機(jī)制,它是采用虛模式實(shí)現(xiàn)的。使用這種方式,即使你向這個(gè)該控件插入一百萬條數(shù)據(jù),它并不會(huì)真的生成一百萬行,而是隨著你的滾動(dòng)條的滾動(dòng),計(jì)算出在屏幕上要顯示的行和列,然后會(huì)向你提供一個(gè)接口,通過這個(gè)接口,你可以在這兒設(shè)置你要顯示的數(shù)據(jù)。下面給出使用CGridCtrl控件的虛模式的步驟: 步驟一 初始化
在視圖的初始化函數(shù)里添加如下代碼:
void SetVirtualMode(TRUE)
設(shè)為虛模式
BOOL SetRowCount(intnRows)
設(shè)置總的行數(shù)。
BOOL SetFixedRowCount(intnFixedRows = 1)
設(shè)置固定的行數(shù)據(jù) BOOL SetColumnCount(intnCols)
設(shè)置列數(shù) BOOL SetFixedColumnCount(intnFixedCols = 1)設(shè)置固定的列數(shù) 步驟二 響應(yīng)消息 顯示數(shù)據(jù)
我們假設(shè)CGridCtrl是放在單文檔視圖中,而且它關(guān)聯(lián)的變量是m_GridCtrl,利用ClassWizard添加視圖的OnNotify響應(yīng)函數(shù)。這個(gè)響應(yīng)函數(shù)的寫法是固定的,類似下面的代碼:
BOOL CGridCtrlTestView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult){ if(wParam ==(WPARAM)m_Grid.GetDlgCtrlID()){ *pResult = 1;GV_DISPINFO *pDispInfo =(GV_DISPINFO*)lParam;if(GVN_GETDISPINFO == pDispInfo->hdr.code){ //這是添加的函數(shù),在這個(gè)函數(shù)里設(shè)置當(dāng)前要顯示的數(shù)據(jù) SetGridItem(pDispInfo);return TRUE;} } returnCGridCtrlTestView::OnNotify(wParam, lParam, pResult);} 在上面的代碼中,SetGridItem(pDispInfo)是添加的函數(shù),在這個(gè)函數(shù)里我們設(shè)置當(dāng)前要顯示的數(shù)據(jù)。pDispInfo是一個(gè)GV_DISPINFO的結(jié)構(gòu)體對象,它包含了每個(gè)單元格的信息,如行號(hào),列號(hào),有沒有位圖,背景色,前景色等。CGRIDCTRL會(huì)把當(dāng)前要顯示那個(gè)單元格行號(hào),列號(hào)傳遞給我們,我們只要設(shè)置里面顯示的數(shù)據(jù)就可以了。如下面是一個(gè)顯示數(shù)據(jù)的例子。
voidCGridCtrlTestView::SetGridItem(GV_DISPINFO *pDispInfo){
pDispInfo->item.strText.Format(”row%d,col%d",pDispInfo->it
http://004km.cn/
em.row, pDispInfo->item.col);}
第五篇:git使用小結(jié)
git使用小結(jié)
1.git-config 配置git,一般需要配置的是user.name,user.email,有時(shí)sendemail.smtpserver也要配置,比如,我使用msmtp:
git-config –global sendemail.smtpserver /usr/local/bin/msmtp 如果你僅僅是想給這一個(gè)項(xiàng)目配置,把–global選項(xiàng)去掉。查看配置的選項(xiàng)是–list。2.git-pull git-pull沒必要帶后面那長長的url(-_-b 我那么用了好多次,不過我用的是!git-pull)。如果你在給Linux內(nèi)核這樣的項(xiàng)目工作,記得git-pull之前檢查是不是在master分支。3.git-format-patch 如果發(fā)送多于一個(gè)補(bǔ)丁,最好用[PATCH n/m]的形式,加上-n。加signed-off-by那行是-s。指定為幾次commit生成補(bǔ)丁,直接加數(shù)字,比如,$ git-format-patch-3 檢查補(bǔ)丁是–check,最好加上這個(gè)。4.git-send-email 如果一次提交補(bǔ)丁比較多,最好用–no-chain-reply-to,因?yàn)槿绻挥玫脑?,在thread嵌套會(huì)太深,不利于別人閱讀。這個(gè)也可以通過選項(xiàng)sendemail.chainreplyto來控制。–signed-off-by-cc,要加上,可以省去手工處理的麻煩。–compose用來編輯[PATCH 0/m],這個(gè)一般是對整個(gè)patchset的描述。–smtp-server,如果你不想用git-config指定的話,用它也行。–cc和–to就不用說了。5.git-commit 在git-commit之前最好git-add。git-commit幾個(gè)常用的選項(xiàng)有:-s 會(huì)增加Signed-off-by行,-e編輯commit message,-a表示all,-m是指定commit信息。同樣,刪除文件是先git-rm。查看commit列表用git-rev-list,查看某個(gè)commit用git-show,查看commit的日志用git-log,-p是以補(bǔ)丁的形式查看。6.其它 git-diff也可以比較不同版本之間的差異,某個(gè)版本的某個(gè)文件的差異,如: $ git-diff v2.6.22 $ git diff v2.6.20 init/main.c $ git-diff v2.6.23 v2.6.24-rc1 init/main.c git-whatchanged也差不多: $ git-whatchanged-p init/main.c 7.錯(cuò)誤提交了commit怎么辦? a)git-revert 這個(gè)本身就會(huì)產(chǎn)生一個(gè)commit,如果用得多了會(huì)讓你的log看起來不那么干凈。;-)b)git-reset 用這個(gè)要當(dāng)心,它會(huì)把那個(gè)commit之后的commit全部刪除。一個(gè)好的辦法是:先建立一個(gè)臨時(shí)的分支,然后再git-reset,再git-rebase,最后再刪除臨時(shí)的分支。詳細(xì)可以看這里。