delphi oracle 保存文件路径,怎么用Delphi将一个文件保存到BLOB字段中,还有读取这个文件,在线等!!!...

下面这段程序将一个文件(文本文件,doc文件,图象文件等)保存到数据库中,并可以将其从数据库读出。

需要两个commandbutton

cmd1 名称 cmdsave caption 保存

cmd2 名称 cmdread caption 读取

一个cmddialog控件

Option Explicit

Dim rn As ADODB.Connection

Public Function CreateDataSource(DataSource As String, UserID As String, Password As String) As Boolean

On Error GoTo DbConErr:

Set rn = New ADODB.Connection

With rn

.ConnectionString = "Provider=OraOledb.Oracle.1;" & _

"password=" & Password & ";" & _

"User ID =" & UserID & ";" & _

"Data Source=" & DataSource & ";" & _

"Locale Identifier=2052"

.Open

End With

CreateDataSource = True

Exit Function

DbConErr:

CreateDataSource = False

End Function

Private Sub cmdRead_Click()

Dim rs As New ADODB.Recordset

rs.ActiveConnection = rn

rs.LockType = adLockOptimistic

rs.CursorLocation = adUseClient

rs.Source = "select * from t_demo"

rs.Open

ComDlgDir.DialogTitle = "保存文件"

ComDlgDir.Filter = "*.*"

ComDlgDir.ShowSave

Call BlobToFile(rs.Fields("text&quot

9f7588d3b12cd5d674b5f81c0b8fc6cb.gif, ComDlgDir.filename)

Set rs = Nothing

Exit Sub

Set rs = Nothing

End Sub

Private Sub cmdsave_Click()

Dim rs As New ADODB.Recordset

rs.ActiveConnection = rn

rs.LockType = adLockOptimistic

rs.CursorLocation = adUseClient

rs.Source = "select * from t_demo"

rs.Open

rs.AddNew

ComDlgDir.DialogTitle = "选取文件"

ComDlgDir.ShowOpen

rs.Fields("id&quot

9f7588d3b12cd5d674b5f81c0b8fc6cb.gif.Value = 1

If ComDlgDir.filename <> "" Then

Call FileToBlob(rs.Fields("text&quot

9f7588d3b12cd5d674b5f81c0b8fc6cb.gif, ComDlgDir.filename)

rs.Update

End If

Set rs = Nothing

Exit Sub

Set rs = Nothing

End Sub

Private Sub Form_Load()

If Not CreateDataSource("sid", "systemp", "manager&quot

9f7588d3b12cd5d674b5f81c0b8fc6cb.gif Then

MsgBox "Connection failure!"

End If

End Sub

Sub FileToBlob(ByRef fld As ADODB.Field, filename As String, Optional ChunkSize As Long = 8192)

Dim fnum As Integer, bytesleft As Long, bytes As Long

Dim tmp() As Byte

If (fld.Attributes And adFldLong) = 0 Then

Err.Raise 1001, , "field doesn't support the GetChunk method."

End If

If Dir$(filename) = "" Then Err.Raise 53, , "File not found"

fnum = FreeFile

Open filename For Binary As fnum

bytesleft = LOF(fnum)

Do While bytesleft

bytes = bytesleft

If bytes > ChunkSize Then bytes = ChunkSize

ReDim tmp(1 To bytes) As Byte

Get fnum, , tmp

fld.AppendChunk tmp

bytesleft = bytesleft - bytes

Loop

Close #fnum

End Sub

Sub BlobToFile(fld As ADODB.Field, filename As String, Optional ChunkSize As Long = 8192)

Dim fnum As Integer, bytesleft As Long, bytes As Long

Dim tmp() As Byte

If (fld.Attributes And adFldLong) = 0 Then

Err.Raise 1001, , "field doesn't support the GetChunk method."

End If

If Dir$(filename) <> "" Then Kill filename

fnum = FreeFile

Open filename For Binary As fnum

bytesleft = fld.ActualSize

Do While bytesleft

bytes = bytesleft

If bytes > ChunkSize Then bytes = ChunkSize

tmp = fld.GetChunk(bytes)

Put #fnum, , tmp

bytesleft = bytesleft - bytes

Loop

Close #fnum

End Sub

处理CLOB字段的动态PL/SQL

动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name,记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob

修改CLOB的PL/SQL过程:updateclob

create or replace procedure updateclob(

table_name in varchar2,

field_id in varchar2,

field_name in varchar2,

v_id in number,

v_pos in number,

v_clob in varchar2)

is

lobloc clob;

c_clob varchar2(32767);

amt binary_integer;

pos binary_integer;

query_str varchar2(1000);

begin

pos:=v_pos*32766+1;

amt := length(v_clob);

c_clob:=v_clob;

query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id for update ';

--initialize buffer with data to be inserted or updated

EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;

--from pos position, write 32766 varchar2 into lobloc

dbms_lob.write(lobloc, amt, pos, c_clob);

commit;

exception

when others then

rollback;

end;

/

用法说明:

在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),

然后调用以上的过程插入大于2048到32766个字符。

如果需要插入大于32767个字符,编一个循环即可解决问题。

查询CLOB的PL/SQL函数:getclob

create or replace function getclob(

table_name in varchar2,

field_id in varchar2,

field_name in varchar2,

v_id in number,

v_pos in number) return varchar2

is

lobloc clob;

buffer varchar2(32767);

amount number := 2000;

offset number := 1;

query_str varchar2(1000);

begin

query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id ';

--initialize buffer with data to be found

EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;

offset:=offset+(v_pos-1)*2000;

--read 2000 varchar2 from the buffer

dbms_lob.read(lobloc,amount,offset,buffer);

return buffer;

exception

when no_data_found then

return buffer;

end;

/

用法说明:

用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;

可以从CLOB字段中取2000个字符到partstr中,

编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值