新聞中心
在.NET開(kāi)發(fā)中,處理數(shù)據(jù)庫(kù)是很常見(jiàn)的任務(wù)。在處理數(shù)據(jù)庫(kù)時(shí),我們經(jīng)常需要讀取數(shù)據(jù)類(lèi)型以便進(jìn)行進(jìn)一步的操作。本文將介紹。

1.連接數(shù)據(jù)庫(kù)
我們需要連接到數(shù)據(jù)庫(kù)。在.NET中可以使用System.Data.SqlClient命名空間提供的SqlConnection類(lèi)來(lái)連接到SQL Server數(shù)據(jù)庫(kù)。
以下是一個(gè)示例連接字符串:
“`
string connString = “Server=MyServer;Database=MyDatabase;User Id=MyUserName;Password=MyPassword;”
SqlConnection conn = new SqlConnection(connString);
conn.Open();
“`
在這里,我們指定了服務(wù)器的名稱(chēng)以及要連接到的數(shù)據(jù)庫(kù)。還可以指定登錄憑據(jù),如果數(shù)據(jù)庫(kù)需要登錄憑據(jù)才能訪問(wèn)的話。
2.獲取表信息
一旦連接到數(shù)據(jù)庫(kù),就可以獲取表的信息。
“`
string query = “SELECT * FROM MyTable”;
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader reader = cmd.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();
“`
在這里,我們執(zhí)行了一個(gè)查詢(xún),獲取了表中所有數(shù)據(jù)的reader,然后通過(guò)調(diào)用GetSchemaTable方法獲取了表的元數(shù)據(jù)信息。
3.獲取列信息
一旦我們有了表的元數(shù)據(jù)信息,就可以輕松地獲取列的信息。
“`
DataColumnCollection columns = schemaTable.Columns;
foreach (DataRow row in schemaTable.Rows)
{
foreach (DataColumn column in columns)
{
Console.WriteLine(column.ColumnName);
Console.WriteLine(column.DataType);
}
}
“`
在這里,我們遍歷了每一行元數(shù)據(jù)信息(每一行對(duì)應(yīng)于表中的一個(gè)列),然后遍歷了每一列的元數(shù)據(jù)信息。
通過(guò)使用DataType屬性,我們可以獲取每個(gè)列的數(shù)據(jù)類(lèi)型。這對(duì)于以后在代碼中使用數(shù)據(jù)類(lèi)型非常有用。
4.關(guān)閉連接
我們不要忘記關(guān)閉連接。
“`
reader.Close();
conn.Close();
“`
這將斷開(kāi)與數(shù)據(jù)庫(kù)的連接,釋放資源。
在本文中,我們學(xué)習(xí)了。通過(guò)連接到數(shù)據(jù)庫(kù),獲取表信息,獲取列信息,我們可以輕松地讀取數(shù)據(jù)類(lèi)型并進(jìn)行進(jìn)一步的操作。為了使代碼更易于理解和維護(hù),請(qǐng)注意使用有意義的變量和注釋。
相關(guān)問(wèn)題拓展閱讀:
- .net如何從數(shù)據(jù)庫(kù)取出二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為rtf文件
.net如何從數(shù)據(jù)庫(kù)取出二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為rtf文件
Oracle的Blob字段比較特殊,他比long字段的性能要好很多,可以用來(lái)保存例如圖片之類(lèi)的二進(jìn)制數(shù)據(jù)。
寫(xiě)入Blob字段和寫(xiě)入其它類(lèi)型字段的方式非常不同,因?yàn)锽lob自身有一個(gè)cursor,你必須使用cursor對(duì)blob進(jìn)行操作,因而你在寫(xiě)入Blob之前,必須獲得cursor才能進(jìn)行寫(xiě)入,那么如何獲得Blob的cursor呢?
這需要你先插入一個(gè)empty的blob,這將創(chuàng)建一個(gè)blob的cursor,然后你再把這個(gè)empty的blob的cursor用select查詢(xún)出來(lái),這樣通過(guò)兩步操作,你就獲得了blob的cursor,可以真正的寫(xiě)入blob數(shù)據(jù)了。
舉例如下:
Oracle系列:LOB大對(duì)滑租象處理
主要是用來(lái)存儲(chǔ)大量數(shù)據(jù)的數(shù)據(jù)庫(kù)字段,更大可以存儲(chǔ)4G字節(jié)的非結(jié)構(gòu)化數(shù)據(jù)。
主要介紹字符類(lèi)型和二進(jìn)制文件類(lèi)型LOB數(shù)據(jù)的存儲(chǔ),單獨(dú)介紹二進(jìn)制類(lèi)型LOB數(shù)據(jù)的存儲(chǔ)。
一,Oracle中的LOB數(shù)據(jù)類(lèi)型分類(lèi)
1,按存儲(chǔ)數(shù)據(jù)的類(lèi)型分:
①字符類(lèi)型:
CLOB:存儲(chǔ)大量 單字節(jié) 字符數(shù)據(jù)。
NLOB:存儲(chǔ)定寬 多字節(jié) 字符數(shù)據(jù)。
②二進(jìn)制類(lèi)型:
BLOB:存儲(chǔ)較大無(wú)結(jié)構(gòu)的二進(jìn)制數(shù)據(jù)。
③二進(jìn)制文件類(lèi)型:
BFILE:將二進(jìn)制文件存儲(chǔ)在數(shù)據(jù)庫(kù)外部的操作系統(tǒng)文件中。存放文件路徑。
2,按存儲(chǔ)方式分:
①存儲(chǔ)在內(nèi)部表空間:
CLOB,NLOB和BLOB
②指向外部操作系統(tǒng)文件:
BFILE
二,大對(duì)象數(shù)據(jù)的錄入
1,聲明LOB類(lèi)型列
/*
conn scott/tiger;
Create TableSpace ts5_21
DataFile ‘E:\Oracle\ts5_21.dbf’
Size 5m;
*/
Create Table tLob (
no Number(4),
name VarChar2(10),
resume CLob,
photo BLob,
record BFile
)
Lob (resume,photo)Store As (
Tablespace ts5_21 –指定存儲(chǔ)的表空間
Chunk 6k –指定數(shù)據(jù)塊大小
Disable Storage In Row
);
2,插入大對(duì)象列
①先插入普通列數(shù)據(jù)
②遇到大對(duì)象列時(shí),插入空白構(gòu)造函數(shù)。
字符型:empty_clob(),empty_nclob()
二進(jìn)制型:empty_blob()
二進(jìn)制文件類(lèi)型:BFileName函數(shù)指向外部文件。
BFileName函數(shù):
BFileName(‘邏輯目錄名’,‘文件名’);
邏輯目錄名只能大寫(xiě),因?yàn)閿?shù)據(jù)詞典是以大寫(xiě)方式存儲(chǔ)。Oracle是區(qū)分大小寫(xiě)的。
在創(chuàng)建時(shí),無(wú)需將BFileName函數(shù)邏輯目錄指向物理路徑,使用時(shí)才做檢查二者是否關(guān)聯(lián)。
例子:
Insert Into tLob Values(1,’Gene’,empty_clob(),empty_blob(),bfilename(‘MYDIR’,’IMG_0210.JPG’));
③將邏輯目錄和物理目錄關(guān)聯(lián)。(如果是二進(jìn)制文件類(lèi)型)
授予枯笑 CREATE ANY DIRECTORY 權(quán)限
Grant CREATE ANY DIRECTORY TO 用戶(hù)名 WITH ADMIN OPTION;
關(guān)聯(lián)邏輯目錄和物理目錄
本地
Create Directory 邏輯目錄名 As ‘文件的物理目錄’;
網(wǎng)絡(luò):
Create Directory 邏輯目錄名 As ‘\\主機(jī)名(IP)\共享目錄’;
例子:
Create Directory MYDIR As ‘E:\Oracle’;
插入例子:
insert into tlob values(1,’Gene’,’CLOB大對(duì)象列’,empty_blob(),bfilename(‘MYDIR’,’IMG_0210.JPG’信敗兆));
三,大對(duì)象數(shù)據(jù)的讀取和操作:DBMS_LOB包
DBMS_LOB包:包含處理大對(duì)象的過(guò)程和函數(shù)
/*
insert into tlob values(1,’Gene’,’CLOB大對(duì)象列’,empty_blob(),bfilename(‘MYDIR’,’IMG_0210.JPG’));
insert into tlob values(2,’Jack’,’CLOB大對(duì)象列’,empty_blob(),bfilename(‘MYDIR’,’IMG_0210.JPG’));
insert into tlob values(3,’Mary’,’大對(duì)象列CLOB’,empty_blob(),bfilename(‘MYDIR’,’IMG_0210.JPG’));
*/
1,讀取大對(duì)象數(shù)據(jù)的過(guò)程和函數(shù)
①:DBMS_LOB.Read():從LOB數(shù)據(jù)中讀取指定長(zhǎng)度數(shù)據(jù)到緩沖區(qū)的過(guò)程。
DBMS_LOB.Read(LOB數(shù)據(jù),指定長(zhǎng)度,起始位置,存儲(chǔ)返回LOB類(lèi)型值變量);
例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := DBMS_LOB.GetLength(varC);
Strt := 1;
DBMS_LOB.Read(varC, ln, Strt, vRStr);
DBMS_output.put_line(‘Return: ‘||vRStr);
End;
②:DBMS_LOB.SubStr():從LOB數(shù)據(jù)中提取子字符串的函數(shù)。
DBMS_LOB.SubStr(LOB數(shù)據(jù),指定提取長(zhǎng)度,提取起始位置):
例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := 4;
Strt := 1;
vRStr := DBMS_LOB.SubStr(varC, ln, Strt);
DBMS_output.put_line(‘結(jié)果為: ‘||vRStr);
End;
③:DBMS_LOB.InStr():從LOB數(shù)據(jù)中查找子字符串位置的函數(shù)。
DBMS_LOB.InStr(LOB數(shù)據(jù), 子字符串);
例子:
Declare
varC clob;
vSubStr varchar2(1000);
vRStr varchar2(1000);
ln number(4);
Begin
select resume into varC from tlob where no = 1;
vSubStr := ‘大對(duì)象’;
ln := DBMS_LOB.InStr(varC,vSubStr);
DBMS_output.put_line(‘位置為: ‘||ln);
vRStr := DBMS_LOB.SubStr(varC, Length(vSubStr), ln);
DBMS_output.put_line(‘位置為’||ln||’長(zhǎng)度為’||Length(vSubStr)||’的子字符串為:’||vRStr);
End;
④:DBMS_LOB.GetLength():返回指定LOB數(shù)據(jù)的長(zhǎng)度的函數(shù)。
DBMS_LOB.GetLength(LOB數(shù)據(jù));
⑤:DBMS_LOB.Compare():比較二個(gè)大對(duì)象是否相等。返回?cái)?shù)值0為相等,-1為不相等。
DBMS_LOB.Compare(LOB數(shù)據(jù),LOB數(shù)據(jù));
例子:
Declare
varC1 clob;
varC2 clob;
varC3 clob;
ln number(4);
Begin
select resume into varC1 from tlob where no = 1;
select resume into varC2 from tlob where no = 2;
select resume into varC3 from tlob where no = 3;
ln := DBMS_LOB.Compare(varC1,varC1);
DBMS_output.put_line(‘比較的結(jié)果為: ‘||ln);
ln := DBMS_LOB.Compare(varC2,varC3);
DBMS_output.put_line(‘比較的結(jié)果為: ‘||ln);
End;
2,操作大對(duì)象數(shù)據(jù)的過(guò)程
操作會(huì)改變數(shù)據(jù)庫(kù)中原有數(shù)據(jù),需要加上Updata鎖鎖上指定數(shù)據(jù)列,修改完后提交事務(wù)。
①:DBMS_LOB.Write():將指定數(shù)量的數(shù)據(jù)寫(xiě)入LOB的過(guò)程。
DBMS_LOB.Write(被寫(xiě)入LOB, 寫(xiě)入長(zhǎng)度(指寫(xiě)入LOB數(shù)據(jù)),寫(xiě)入起始位置(指被寫(xiě)入LOB),寫(xiě)入LOB數(shù)據(jù));
例子:
Declare
varC clob;
vWStr varchar2(1000);
vStrt number(4);
ln number(4);
Begin
vWStr := ‘CLOB’;
ln := Length(vWStr);
vStrt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Write(varC, ln, vStrt, vWStr);
DBMS_output.put_line(‘改寫(xiě)結(jié)果為: ‘||varC);
Commit;
End;
②:DBMS_LOB.Append():將指定的LOB數(shù)據(jù)追加到指定的LOB數(shù)據(jù)后的過(guò)程。
DBMS_LOB.Append(LOB數(shù)據(jù),LOB數(shù)據(jù));
例子:
Declare
varC clob;
vAStr varchar2(1000);
Begin
vAStr := ‘,這是大對(duì)象列’;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Append(varC, vAStr);
commit;
DBMS_output.put_line(‘追加結(jié)果為: ‘||varC);
End;
③:DBMS_LOB.Erase():刪除LOB數(shù)據(jù)中指定位置的部分?jǐn)?shù)據(jù)的過(guò)程;
DBMS_LOB.Erase(LOB數(shù)據(jù),指定刪除長(zhǎng)度, 開(kāi)始刪除位置);
例子:
Declare
varC clob;
ln number(4);
strt number(4);
Begin
ln := 1;
strt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Erase(varC, ln, strt);
commit;
DBMS_output.put_line(‘擦除結(jié)果為: ‘||varC);
End;
④:DBMS_LOB.Trim():截?cái)郘OB數(shù)據(jù)中從之一位置開(kāi)始指定長(zhǎng)度的部分?jǐn)?shù)據(jù)的過(guò)程;
DBMS_LOB.Trim(LOB數(shù)據(jù),截?cái)嚅L(zhǎng)度);
例子:
Declare
varC clob;
ln number(4);
Begin
ln := 4;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Trim(varC, ln);
COMMIT;
DBMS_output.put_line(‘截?cái)嘟Y(jié)果為: ‘||varC);
End;
⑤:DBMS_LOB.Copy():從指定位置開(kāi)始將源LOB復(fù)制到目標(biāo)LOB;
DBMS_LOB.Copy(源LOB,目標(biāo)LOB,復(fù)制源LOB長(zhǎng)度,復(fù)制到目標(biāo)LOB開(kāi)始位置,復(fù)制源LOB開(kāi)始位置)
例子:
Declare
vDEST_LOB clob;
vSRC_LOB clob;
AMOUNT number;
DEST_OFFSET number;
SRC_OFFSET number;
Begin
select resume into vDEST_LOB from tlob where no = 1 FOR UPDATE;
select resume into vSRC_LOB from tlob where no = 2 ;
AMOUNT := DBMS_LOB.GetLength(vSRC_LOB);
DEST_OFFSET := DBMS_LOB.GetLength(vDEST_LOB)+1;
SRC_OFFSET := 1;
DBMS_LOB.Copy(vDEST_LOB, vSRC_LOB, AMOUNT, DEST_OFFSET, SRC_OFFSET);
DBMS_output.put_line(‘拷貝結(jié)果為: ‘||vDEST_LOB);
End;
關(guān)于使用LOB數(shù)據(jù)類(lèi)型的性能問(wèn)題:
Clob/blob實(shí)現(xiàn)是比較復(fù)雜的,這里只提提幾個(gè)和性能相關(guān)的點(diǎn),當(dāng)然能不用lob盡量不用:
a、 一個(gè)lob字段包括lobindex和lobsegment
b、 Lob缺省可以存放在表中(表字段),條件是:
1.它的大小小于4kb
2.并且在定義的時(shí)候沒(méi)有使用(disable storage inrow)字句(缺省是enable)
當(dāng)lob大于4kb的時(shí)候它會(huì)被存放到lobsegment中
c、 當(dāng)lob存放在表中的時(shí)候,它可以被緩存,對(duì)于它的操作效率遠(yuǎn)遠(yuǎn)高于存儲(chǔ)在lobsegment中的lob(不用lobindex)
d、 存儲(chǔ)在lobsegment中的lob缺省不在緩沖區(qū)緩存,對(duì)于lob的讀寫(xiě)都是物理IO,代價(jià)非常高,所以對(duì)于大于4kb的lob字段千萬(wàn)不要頻繁更新,效率非常低
e、 存儲(chǔ)在lobsegment中的lob可以在定義的時(shí)候指定使用cache(默認(rèn)是nocache),這對(duì)于中等大小的lob(比如幾k~幾十k)很有效果,減少物理IO
使用其他數(shù)據(jù)類(lèi)型需要考慮的性能問(wèn)題:
1、 Char
定長(zhǎng)格式字符串,在數(shù)據(jù)庫(kù)中存儲(chǔ)時(shí)不足位數(shù)填補(bǔ)空格,不建議使用,會(huì)帶來(lái)不必要的麻煩
a、 字符串比較的時(shí)候,如果不注意(char不足位補(bǔ)空格)會(huì)帶來(lái)錯(cuò)誤
b、 字符串比較的時(shí)候,如果用trim函數(shù),這樣該字段上的索引就失效(有時(shí)候會(huì)帶來(lái)嚴(yán)重性能問(wèn)題)
c、 浪費(fèi)存儲(chǔ)空間
2、 Varchar2/Varchar
不定長(zhǎng)格式字符串,對(duì)于4000字節(jié)以?xún)?nèi)的字符串,建議都用該類(lèi)型
a、 網(wǎng)上有說(shuō)char比varchar2性能好,但是如果你有興趣做測(cè)試的話,會(huì)發(fā)現(xiàn)沒(méi)有區(qū)別(如果發(fā)生行遷移,可以通過(guò)pctfree來(lái)調(diào)整)
b、 充分利用存儲(chǔ)空間
3、 Long/long raw
Oracle已經(jīng)廢棄,只是為了向下兼容保留著,應(yīng)該全部升級(jí)到lob
Long類(lèi)型有很多限制
a、 表中只能有一列l(wèi)ong類(lèi)型
b、 Long類(lèi)型不支持分布式事務(wù)
c、 太多的查詢(xún)不能在long上使用了
4、 Number
定義Number的方法:Number(p,s)
其中p,s都是可選的:
a、 p代表精度,默認(rèn)為38
b、 s代表小數(shù)位數(shù),取值范圍-84~127,默認(rèn)取值要看是否指定了p,如果制定了p,默認(rèn)s為0,如果沒(méi)有指定p,默認(rèn)取更大值。
幾個(gè)例子:
a、 Number(5,0)=Number(5) 取值范圍99999~-99999
b、 Number(5,2) 取值范圍999.99~-999.99
注意:其中的整數(shù)位數(shù)只有3位,小數(shù)位數(shù)有2位,按照如下方法計(jì)算:
整數(shù)位數(shù)b>c
a、Where date_colum>=to_date(’01-jan-2023’,’dd-mon-yyyy’)
and date_colum
b、Where trunc(date_colum,’y’)=to_date(’01-jan-2023’,’dd-mon-yyyy’)
c、Where to_char(date_colum,’yyyy’)=’2023’
.net讀取數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于.net讀取數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型,如何在.NET中讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型,.net如何從數(shù)據(jù)庫(kù)取出二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為rtf文件的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專(zhuān)業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專(zhuān)注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶(hù)提供專(zhuān)業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
網(wǎng)頁(yè)標(biāo)題:如何在.NET中讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型 (.net讀取數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型)
轉(zhuǎn)載來(lái)于:http://www.dlmjj.cn/article/dhgcshp.html


咨詢(xún)
建站咨詢(xún)
