为什么老是出现这个错误?Parameter(id) not found!(50分)

飞骐

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我写的一段更新Blob类型数据的代码,结果老是出现parameter xxx not found的错误
var
ms: TMemoryStream;
begin
ms:= TMemoryStream.Create;
try
try
ClientDataSet1.Close;
RichViewEdit1.SaveRVFToStream(ms,false);
ms.Position := 0;
ClientDataSet1.CommandText := 'Update test set content=:content where id=:id';
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.CreateParam(ftBlob, 'content', ptInput);
ClientDataSet1.Params.CreateParam(ftSmallInt, 'id', ptInput);
ClientDataSet1.Params.ParamByName('id').AsInteger := StrToIntDef(Edit1.Text,10);
TBlobField(ClientDataSet1.Params.ParamByName('content')).LoadFromStream(ms);
ClientDataSet1.Execute;
ClientDataSet1.ApplyUpdates(0);
except
on e: Exception do
MessageDlg('save 失败!', mtError, [mbOK], 0);
end; // try/except
finally // wrap up
ClientDataSet1.Close;
ms.Free;
end; // try/finally
MessageDlg('Save 成功!', mtWarning, [mbOK], 0);
end;
 
把这几行去掉看
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.CreateParam(ftBlob, 'content', ptInput);
ClientDataSet1.Params.CreateParam(ftSmallInt, 'id', ptInput);


-----
http://www.8421.org
 
试过了,不行
 

CommandText := 'Update test set content=:content where id=' + Edit1.Text;
 
改成这样试试吧
ClientDataSet1.CommandText := 'select content from test where id='+Edit1.Text;
ClientDataSet1.Open;
TBlobField(ClientDataSet1.FieldByName('content')).LoadFromStream(ms);
ClientDataSet1.ApplyUpdates(0)
另外,ClientDataSet1所对应的DataSetProvider控件的Options属性也要试试改动。
 
我遇到过类似的问题
你在所以对数据库操作前先执行'select * from ~~~~~~'
我以前遇到和你一样的问题,我加了这一句就好了,不知道这个能不能帮你
 
我感觉是DELPHI的数据操作控件对参数解析问题,很容易出问题。
建议你的参数都最好不要和FIELD取一个名字,加个A什么的,试下
 
这样试一试:
var
ms: TMemoryStream;
begin
ms:= TMemoryStream.Create;
try
try
ClientDataSet1.Close;
RichViewEdit1.SaveRVFToStream(ms,false);
ms.Position := 0;
ClientDataSet1.CommandText := 'Update test set content=:content where id=:id';
ClientDataSet1.Params.ParamByName('id').AsInteger := StrToIntDef(Edit1.Text,10);
ClientDataSet1.Params.ParamByName('content').LoadFromStream(ms);
ClientDataSet1.Execute;
except
on e: Exception do
MessageDlg('save 失败!', mtError, [mbOK], 0);
end; // try/except
finally // wrap up
ClientDataSet1.Close;
ms.Free;
end; // try/finally
MessageDlg('Save 成功!', mtWarning, [mbOK], 0);
end;
 
我觉得在CommandText中不大可能装入流数据的,除非作编码转换才行(但太麻烦了,而且跟字段类型有关)。

to 独孤九键:
你在一个try..except块中把程序抛出来的异常吃掉了,然后在最后来一个"Save 成功!",
它显示成功,但也不见得真的成功了呀,这样子不大好吧~~~
 
好像是不能保存流数据
to szf:
你有什么好办法保存流数据吗?
 
一种折衷的方法,可以保存流数据:
var
ms : TMemoryStream;
CDS : TClientDataSet;
begin
........
ms := TMemoryStream.Create;
try
CDS.Active := False;
ms.Position := 0;
CDS.CommandText := '';
CDS.CommandText := 'select fieldname from tablename where id=:idname'
CDS.Open;
CDS.Edit;
TBlobField(CDs.Fields.FieldByName(fieldname)).LoadFromStream(ms);
CDS.Post;
CDS.ApplyUpdates(0);
finally // wrap up
CDS.Close;
FreeAndNil(ms);
end; // try/finally
...........
end;
 
接受答案了.
 
顶部