??xml version="1.0" encoding="utf-8" standalone="yes"?>
3、第二张54k的速度
4、解军_法:(x)清理一下(f)时表QBLOG字段的事
1、数据库q接对象(ADODB. Connection)
该对象用于与ODBC数据库徏立连接,所有对数据库的操作均通过该连接进行?br />
数据库连接对象ADODB. Connection的作用象Delphi中的TDatabase对象?br />
建立一个连接对象的Ҏ(gu)?AConnection为Variantcd变量)Q?br />
AConnection:=CreateOleObject(’A DODB.Connection’)
用于建立q接的方法ؓ(f)OpenQ用语法ؓ(f)(以对象AConnectionZ)Q?br />
AConnection.Open( ConnectionString, UserId, Password )
三个参数均ؓ(f)字符串类型,其中UserId和Password为用户名U和用户密码Q用于访问数据库使用时可以省略,因ؓ(f)?ConnectionString同样可以指定用户名称和用户密码。ConnectionString是用来说明ODBC数据源信息的字符Ԍ其格式ؓ(f)Q?br />
’Provider=ProviderName; DSN=DSNName; DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password’
其中Q?br />
ProviderQ数据提供者,默认状态下为MSDASQLQؓ(f)微YOLEDBQ通常省略Q?br />
DSNQ要打开的数据库对应的OBDCpȝ数据?DSN)Q是可选参敎ͼ
DRIVERQ要打开的数据库所用的驱动E序名称Q如Access对应Microsoft Access Driv (*.mdb)Q是可选参敎ͼ
SERVERQ要打开的数据库所在的服务器名Uͼ本机可用(local)Q是可选参敎ͼ
DATABASEQ要打开的数据库名称Q是可选参敎ͼ
UIDQ用户名Uͼ用来讉K数据库,是可选参敎ͼ
PWDQ用户密码,用来讉K数据库,是可选参数?br />
以上参数均ؓ(f)可选参敎ͼ但必L供够的信息来描qC个系l数据源?br />
假如已经定义了一个ODBC的系lDSNQ名UCؓ(f)MyDsnQ那么就可用以下语句建立一个数据库q接Q?br />
AConnection.Open(’DSN=MyDsn’);
Z防止DSN不存在或其设|被他h修改旉成应用E序q行错误Q可以用ADODB.Connection 创徏一个(f)时ODBC数据源,q样可以保证我们使用的系lDSN的参数设|是正确的。下面的语句可以创徏一个(f)时ODBCpȝDSNQ对应一?strong style="color: black; background-color: rgb(160,255,255)">ACCESS数据库,路径为C:\Inetpub\ wwwroot\ test.mdbQ?br />
AConnection.open(’Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:\inetpub \wwwroot\test.mdb’)
建立一个ADODB.Connection后,如果不需要返回操作结?如删除,修改Q更新等操作)可以对数据库进行正常的SQL操作了,此时应用ADODB.Connection的另外一个方法ExecuteQ用语法ؓ(f)Q?br />
AConnection.Execute( strSQL );
其中strSQL为执行操作的SQL语句Q如删除操作可以为:(x)delete from wfjcommu。用AConnection.Close关闭一个数据库q接?br />
2、数据集对象(ADODB. RecordSet)
如果要执行查询操作ƈq回查询l果Q或者要更方便地操作数据表,那就需要用到数据集对象了?br />
数据集对象ADODB.RecordSet的作用象Delphi中的TTable或TQuery对象?br />
建立一个数据集对象的方法ؓ(f)(ARecordSet为Variantcd变量)Q?br />
ARecordSet:=CreateOleObject (’ADODB.RecordSet’)
从数据表取得数据的方法ؓ(f)OpenҎ(gu)Q具体用方法ؓ(f)Q?br />
ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType );
其中Q?br />
strCommandQ字W串Qؓ(f)命o(h)参数Q可以是一个Table名称Q可以是一个SQL语句Q也可以是一个服务器上的存储q程(StoredProc)名称Q具体需要后面的参数intCommandType来指定?br />
ActiveConnectionQ要使用的数据库q接Q是一个ADODB. Connection对象?br />
intCursorTypeQ长整数Q数据集的CursorcdQ可选参敎ͼ请参见程序中注释?br />
intLockTypeQ长整数Q对数据表的加锁cdQ可选参敎ͼ请参见程序中注释?br />
intCommandTypeQ长整数Q命令参数的cdQ用来指明strCommand的作用,可以指定strCommand为命令(如SQL语句Q或数据?TTable)或储存过E?StoredProc)Q可选参敎ͼ请参见程序中注释?br />
如执行一个SQL查询Q可以采用如下语句:(x)
ARecordSet.Open(’Select * from wfjcommu’,adOpenStatic,ad LockOptimistic,adCmdText);
其它常见属性和Ҏ(gu)与TTable和TQuery相比较如下(具体误ASP帮助文gQ:(x)
eof,bof: eof,bofQMoveFirst, MoveLast: First, LastMovePrevious, MoveNext: Prior, NextMove: MoveByAddNew: appendUpdate: PostClose: close
Delete加UpdateQdeleteQ所有对数据表的修改均须用Update使操作有效,q与Delphi不同?br />
Fields[FieldNo]: Fields[FieldNo]
Fields[’FieldName’]: FieldByName(’FieldName’)
3、其他常见对??strong style="color: black; background-color: rgb(255,255,102)">Delphi对应的对?Q?br />
ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
ADODB.CommandQ无 ADODB.PropertyQ无
下面来看一个应用例子:(x)
procedure TForm1.Button1Click(Sender: TObject);
{*****************************************************
用ADO操作ODBC数据?br />
本程序中Q将创徏一个(f)时的ODBCpȝ数据源,指向一个MsAccess数据库,然后对其中的数据表进行显C、增加、修攏V删除和查询操作
注意Q请在Uses语句中包含ComObj单元
*****************************************************}
const{一些常量声明,详细请参见adovbs.inc}
{---- CommandType的常量说?----}
adCmdUnknown = 0008;//未知,需要系l来判断,速度?为缺省?br />
adCmdText = 0001;//命o(h)语句如SQL语句
adCmdTable = 0002;//数据表名U?br />
adCmdStoredProc = 0004;//存储q程名称
{---- CursorType的常量说?----}
adOpenForwardOnly = 0;//只能由前向后单向讉K,为缺省?br />
adOpenKeyset = 1;//可见其他用户Ҏ(gu)据的修改,但对其它用户的增加和删除不可?br />
adOpenDynamic = 2;//其他用户Ҏ(gu)据的增加修改和删除均可见
adOpenStatic = 3;//其他用户Ҏ(gu)据的增加修改和删除均不可?br />
{---- LockType的常量说?---}
adLockReadOnly = 1;//只读,为缺省?br />
adLockPessimistic = 2;//在修Ҏ(gu),按单个记录锁?br />
adLockOptimistic = 3;//在修改后更新?按单个记录锁?br />
adLockBatchOptimistic = 4;//在成Ҏ(gu)新时记录锁定
var
AConnection, ARecordSet : variant;
longintTemp : integer;
strTemp : string;
intIndex : integer;
begin
{创徏一个(f)时的ODBC数据?指向一个MsAccess数据?q利用此DSN建立一个数据库q接}
AConnection := CreateOleObject(’ADODB.Connection’);
AConnection.Open(’Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\inetpub\wwwroot\test’);
{建立一个数据集对象,q从数据表中提取数据}
ARecordSet := CreateOleObject(’ADODB.RecordSet’);
ARecordSet.open( ’wfjcommu’,AConnection,adOpenStatic,adLockOptimistic,adCmdTable );
memo1.lines.clear;
memo1.lines.add(’********数据表原有的内容如下********’);
{昄各个域的域名}
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].name+’;’;
memo1.lines.add( strTemp );
{昄各个域的内容}
while not ARecordSet.eof do
begin
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+’;’;
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Ud下条QNext
end;
{增加一个记录}
ARecordSet.AddNew;//增加,Append
ARecordSet.Fields[’AName’] := ’1’;//以FieldByName的方式存?br />
ARecordSet.Fields[’Portable’] := ’2’;
ARecordSet.Fields(2) := ’3’;//以Fields[index]的方式存?br />
ARecordSet.Fields(3) := ’4’;
ARecordSet.Fields(4) := ’5’;
ARecordSet.Update;//更新QPost
ARecordSet.MoveFirst;//Ud首条QFirst
memo1.lines.add(’********增加了一条记录后的数据表的内容如?*******’);
{昄各个域的内容}
while not ARecordSet.eof do
begin
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+’;’;
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Ud下条QNext
end;
{修改最后一条记录}
ARecordSet.MoveLast;
ARecordSet.Fields[’AName’] := ’11’;//以FieldByName的方式存?br />
ARecordSet.Fields[’Portable’] := ’22’;
ARecordSet.Fields(2) := ’33’;//以Fields[index]的方式存?br />
ARecordSet.Fields(3) := ’44’;
ARecordSet.Fields(4) := ’55’;
ARecordSet.Update;//更新QPost
ARecordSet.MoveFirst;//Ud首条QFirst
memo1.lines.add(’********修改了最后一条记录后的数据表的内容如?*******’);
{昄各个域的内容}
while not ARecordSet.eof do
begin
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+’;’;
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Ud下条QNext
end;
{删除最后一条记录}
ARecordSet.MoveLast;//Ud末条QLast
ARecordSet.delete;//删除Qdelete
ARecordSet.Update;//更新Q在Delphi不需?br />
ARecordSet.MoveFirst;//Ud首条QFirst
memo1.lines.add(’********删除了最后一条记录后的数据表的内容如?*******’);
{昄各个域的内容}
while not ARecordSet.eof do
begin
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+’;’;
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Ud下条QNext
end;
ARecordSet.Close;{关闭数据集}
{用SQL语句q行查询,查询姓名?#8220;张三”的记录}
{注意Q在SQL语句中,字符串应该用单引号包括v来}
ARecordSet.open( ’select * from wfjcommu where AName = ’’张三’’’,
AConnection,adOpenStatic,adLockOptimistic,adCmdText );
memo1.lines.add(’********张三的内容如?*******’);
memo1.lines.add( ’共有’ + IntToStr( ARecordSet.RecordCount ) + ’条匹配的记录’ );
{昄各个域的内容}
while not ARecordSet.eof do
begin
strTemp := ’’;
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+’;’;
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Ud下条QNext
end;
{关闭数据集和数据库连接}
ARecordSet.close;
AConnection.close;
end;
听别M如自q实际的例子来体会(x)。在q个例子中,演C如何利用ADO对象来对一个数据表q行查询、增加记录、修改记录和删除记录操作。具体的用法请参见程序中的注释,如果有点Delphi数据库编E经验,怿不难理解?br />
在我们的例子使用的数据库为Test.MDBQ其中有一个数据表为wfjcommuQ有五个字段A(ch)Name、Portable、Tel、BP、PostAddressQ分别表C姓名、手机号、电(sh)话号码、呼机号码和通信地址?br />
以上E序在PWIN98+ Delphi 3.0+PWS(Personal Web Server)4.0下调试通过.
http://hi.baidu.com/mrlong2000/blog/item/f3748d09fb927a206a60fb05.html
转:(x)http://blog.csdn.net/nxyc_twz/archive/2004/06/16/16061.aspx
ODAC lg支持 Oracle 8 ?BLOB ?CLOB 数据cd。你可以使用 TOraQuery lg来获?LOB 字段的|使用同样的方法,你也可以获取 LONG ?LONG ROW 字段?当你需要?SQL DML ?PL/SQL 语句存取q些字段Ӟ你就?x)发?LOB 数据cd的用法有明显的不同?br />BLOB ?CLOB 数据cd通过 LOB 定位?指定数据地址) 存储在表列中Q实际的 BLOB ?CLOB 数据存储在独立的表空间中。与之不同的是,LONG ?LONG RAW cd存储在数据库中,表中存放着它们的实际倹{?br />
当存?LOB 列时Q返回的是定位器Q而不?LONG ?LONG RAW 数据cd那样q回它的实际倹{?
例如Q分析这个表的定义:(x)
CREATE TABLE ClobTable (
Id NUMBER,
Name VARCHAR2(30),
Value CLOB
)
如果我们不通过值参数初始化 LOB 定位器, Oracle 不允许使用下面的语句来更新数据表:(x)
UPDATE ClobTable
SET
Name = :Name,
Value = :Value
WHERE
Id = :Id
要初始化 LOB 定位器,你必M?EMPTY_BLOB ?EMPTY_CLOB Oracle 函数。要q回初始化后的定位器Q应在同L(fng)语句中?RETURNING 子句。例如:(x)
UPDATE ClobTable
SET
Name = :Name,
Value = EMPTY_CLOB()
WHERE
Id = :Id
RETURNING
Value
INTO
:Value
ODAC ?LOB 数据?Oracle 且返回初始值字D,需使用Q值参数?br />存储q程允许自动初始?LOB |Ҏ(gu)如下Q?br />
CREATE OR REPLACE
PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,
p_Value OUT CLOB)
is
begin
UPDATE ClobTable
SET
Name = p_Name,
Value = EMPTY_CLOB()
WHERE
Id = p_Id
RETURNING
Value
INTO
p_Value;
end;
注意Q值参数被声明?OUT。同Ӟ讄 LOB 数据cd的参数的 ParamType 属性ؓ(f) ptInput Q且指定它到所需的数据前来实际调用存储过E。我们可以这栯用前面声明的存储q程Q?br />
OraStroredProc1.StoredProcName := 'ClobTableUpdate';
OraStroredProc1.Prepare;
OraStroredProc1.ParamByName('p_Id').AsInteger := Id;
OraStroredProc1.ParamByName('p_Name').AsString := Name;
OraStroredProc1.ParamByName('Value').ParamType := ptInput;
OraStroredProc1.ParamByName('Value').AsCLOBLocator.
LoadFromFile(FileName);
OraStroredProc1.Execute;
?ODAC 来说Q在 LOB 操作中?ParamType 属性是非常重要的。如?ParamType ?ptInput Q?ODAC 写数据到服务器,如果 ParamType ?ptOutputQ它则读取数据?br />
你可以?LOB 参数?dtBlob ?dtMemo 数据cd来编写普通的 DML 语句。在q种情况下, Oracle 自动?LONG ?LONG ROW cd的D{换ؓ(f) CLOB ?BLOB 数据?br />
http://support.microsoft.com/kb/322796/en-us
q样可以了,但是要求
--q个存储q程得到了解?br />create or replace procedure pro_upd(
sid in string,
bblob out blob)
is
begin
insert into aaa(id,img) values(sid,empty_blob())
RETURNING img INTO bblob;
end;
l箋前进Q看看原来的存储q程什么原因不可以Q?br />
ȝQlob 文g4k以内的内Ҏ(gu)到表D,其他的放到blob的表I间Q?br />插入Ӟ首先要插入empty_blob,然后select for update!q样才能更新blob字段
另外如果是存储过E,则注意参敎ͼ想下面的一P(x)
bblob out blob
q样才能得到blob字段的定位器Q;Q更新内容!
但是现在q不知道 bblob in blob q种方式下如何修改,上传囄
W三天:(x)
l过3天的努力LQ终于找C完美的解x案居然就是一句话的问题,完全可以解决 in blob的问题了
TemporaryLobUpdate := True;
加一句就好了
到此在存储过E里面解决上传blob的问题解军_毕?br />到此可以圆满l束Q明天的合同q了?br />注意文章转蝲注明出处Qhttp://blogjava.net/badboyryan
<SqlMain>
<property name="1" table="索引ID_Tpu_Menu3_Cyzgxz">
create unique index ID_Tpu_Menu3_Cyzgxz on Tpu_Menu3_Cyzgxz(CyzgxzID)
</property>
<property name="3" table="T_CYRY_MZ">
drop table T_CYRY_MZ
</property>
<property name="2" table="TPu_Menu8_Clxx">
alter table tpu_menu8_clxx alter column dzw decimal(6,2)
</property>
</SqlMain
procedure TFrmMain.UpDataStruct(aFileName:String);
var
vNode,vChildNode:IXMLNode;
iLen,i:integer;
fSqlText,fName,fTable:string;
begin
try
XMLDoc.LoadFromFile(aFileName);
XMLDoc.Active:=True;
vNode:=XMLDoc.ChildNodes.FindNode('SqlMain');
iLen:=vNode.ChildNodes.Count;
pb1.Max:=iLen*10;
for i:=0 to iLen-1 do
begin
vChildNode:=vNode.ChildNodes.Get(i);
fSqlText:=vChildNode.NodeValue;
fName:=vChildNode.Attributes['name'];
fTable:=vChildNode.Attributes['table'];
DoSqlText(fSqlText,fName,fTable);
end;
except
on e:Exception do
Showmessage('XML文gd错误Q请与开发商联系Q?+chr(13)+e.Message);
end;
end;
procedure TFrmMain.DoSqlText(aSqlText,aName,aTable:string);
var
it:Integer;
begin
ADOExec.SQL.Clear;
ADOExec.SQL.Add(aSqlText);
try
it:=StrToInt(aName);
case it of
1:lb1.Caption:='建立?+aTable;
2:lb1.Caption:='更新?+aTable;
3:lb1.Caption:='删除?+aTable;
10:
begin
lb1.Caption:='d数据?+aTable;
ClearData(aTable);
end;
11:lb1.Caption:='更新数据?+aTable;
else
lb1.Caption:='更新?+aTable;
end;
ADOExec.ExecSQL;
memo1.Lines.Add('信息?+lb1.Caption+'操作成功Q?);
except
on e:Exception do
memo1.Lines.Add('警告?+e.Message);
end;
pb1.StepIt;
pb1.Refresh;
lb1.Refresh;
memo1.Refresh;
end;
注明出处Q?a href="/badboyryan/archive/2007/05/28/120510.html">http://m.tkk7.com/badboyryan/archive/2007/05/28/120510.html
procedure StreamToVariant (Stream : TMemoryStream; var v : OleVariant);
var
p : pointer;
begin
v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock (v);
end;
4、这个函C是非帔R的,
function ByteType(const S: string; Index: Integer): TMbcsByteType;
IsDBCSLeadByte
告诉你一个非常有用的函数?/p>
bytetype 它可以判断一个字W串中,某个 Char 是单个字母,q是双字节的前一位或
后一位?br />mbSingleByte 单字?br />mbLeadByte 双字节第一?br />mbTrailByte 双字节第二位
在copyQStrQ?Q?2Q中l果有个全角?Q,Q过不去了居然quotedstrQ)的结果也出现了?我怎么?br />
function TFrmMain.procQJWT(olds: String): String;
var
tmp : string;
begin
tmp := Trim(olds);
Result := tmp;
if Length(tmp)>12 then
begin
//是单个字W?br /> if ByteType(tmp,12)=mbLeadByte then
result := Copy(tmp,1,11)
else
result := Copy(tmp,1,12);
end;
end;
写了一个函数就解决战斗了!