最近在学使用Delphi编写ASP组件,遇到了一个问题,我使用的是原生ADO。在做数据储存的时候出了问题,提示“操作必须使用一个可更新的查询”的错误。小弟不思其解。贴出源代码让大家帮帮忙,看是哪里出了问题,或者应该换成什么方式来储存进入数据库?unit Unit1;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
ComObj, ActiveX, AspTlb, Project2_TLB, StdVcl,ADOint,SysUtils;type
Tguestbook = class(TASPObject, Iguestbook)
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure LinkDatabase; safecall;
procedure SaveArticle; safecall;
end;implementationuses ComServ;var conn:oleVariant;procedure Tguestbook.OnEndPage;
begin
inherited OnEndPage;
end;procedure Tguestbook.OnStartPage(const AScriptingContext: IUnknown);
begin
inherited OnStartPage(AScriptingContext);
end;procedure Tguestbook.LinkDatabase;
var DB_Path:string;
begin
DB_Path := ExtractFilePath (ParamStr(0))+'database.mdb';
DB_Path := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=;Data Source='+DB_Path+';Persist Security Info=False';
conn := CreateOleObject('ADODB.Connection');
conn.open(DB_Path);
end;procedure Tguestbook.SaveArticle;
var fatherid:integer;
subject,body:String;
addposttime:TDatetime;
sql:String;
rs:oleVariant;
begin
rs := CreateOleObject('ADODB.Recordset');
fatherid := 1;
subject := request.Form.Item ['subject'];
body := request.Form.Item ['body'];
addposttime:=now; //就是这段出了错,一但执行了conn.execute(sql),就说“操作必须使用一个可更新的查询” sql := 'Insert into [guestbook] (fatherid,subject,body,addposttime) values ('+IntToStr(fatherid)+','''+subject+''','''+body+''','''+DatetimeToStr(addposttime)+''')';
conn.execute(sql); //难道得换成下面这样的方法吗?为什么SQL语句会提示这样的错误呢? //sql := 'Select top 1 * From [guestbook] order by id desc';
//rs.open (sql,conn,1,3,1);
//rs.addnow;
//rs.fields['fatherid'].value := 1;
//rs.update; rs.close;
end;initialization
TAutoObjectFactory.Create(ComServer, Tguestbook, Class_guestbook,
ciMultiInstance, tmApartment);
end.
ComObj, ActiveX, AspTlb, Project2_TLB, StdVcl,ADOint,SysUtils;type
Tguestbook = class(TASPObject, Iguestbook)
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure LinkDatabase; safecall;
procedure SaveArticle; safecall;
end;implementationuses ComServ;var conn:oleVariant;procedure Tguestbook.OnEndPage;
begin
inherited OnEndPage;
end;procedure Tguestbook.OnStartPage(const AScriptingContext: IUnknown);
begin
inherited OnStartPage(AScriptingContext);
end;procedure Tguestbook.LinkDatabase;
var DB_Path:string;
begin
DB_Path := ExtractFilePath (ParamStr(0))+'database.mdb';
DB_Path := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=;Data Source='+DB_Path+';Persist Security Info=False';
conn := CreateOleObject('ADODB.Connection');
conn.open(DB_Path);
end;procedure Tguestbook.SaveArticle;
var fatherid:integer;
subject,body:String;
addposttime:TDatetime;
sql:String;
rs:oleVariant;
begin
rs := CreateOleObject('ADODB.Recordset');
fatherid := 1;
subject := request.Form.Item ['subject'];
body := request.Form.Item ['body'];
addposttime:=now; //就是这段出了错,一但执行了conn.execute(sql),就说“操作必须使用一个可更新的查询” sql := 'Insert into [guestbook] (fatherid,subject,body,addposttime) values ('+IntToStr(fatherid)+','''+subject+''','''+body+''','''+DatetimeToStr(addposttime)+''')';
conn.execute(sql); //难道得换成下面这样的方法吗?为什么SQL语句会提示这样的错误呢? //sql := 'Select top 1 * From [guestbook] order by id desc';
//rs.open (sql,conn,1,3,1);
//rs.addnow;
//rs.fields['fatherid'].value := 1;
//rs.update; rs.close;
end;initialization
TAutoObjectFactory.Create(ComServer, Tguestbook, Class_guestbook,
ciMultiInstance, tmApartment);
end.
解决方案 »
- dataset does not support bookmarks,which are required for mulit-record data controls 这是什么错误??
- 在线等待-这个键盘按键的问题怎么解决?
- 连接安装在win2003上的sqlserver2000(在先急等)
- 各位,问一下你们平时收集资料(编程方面的)都用怎么软件管理?
- 请问如何用delphi写一个刻录程序,有没有好的控件或例子,可以再加分
- 高分求教F1BOOK的用法。
- 怎样读取实时语音数据?(通过麦克风)
- 两表之间是否可以通过sql语句直接update一个符合条件的记录,至少要两个query吗?
- 如何把D:\abc目录下的一个文件复制到C:\bcd目录下啊!
- pascal的问题
- 关于ado
- 求教:联结oracle世,用错误的用户名和密码登录数据库,为什么不按照例外中的错误提示进行显示,而显示英文的"invalid username/password
conn.execute(sql);不能执行呢?而一定要addnow,update这样落后的方法呢?
是可以的,记得那个CoInit什么的,就OK
Dim DelphiASPObj
Set DelphiASPObj = Server.CreateObject("Project2.guestbook")
DelphiASPObj.LinkDatabase()
DelphiASPObj.SaveArticle()
Set DelphiASPObj = Nothing
%>
另外,要执行更新语句最好使用"ADODB.Command"对象
"ADODB.RecordSet"主要是用来返回结果集的,它所执行的应该是一条查询语句