数据集状态怎么设置?(在线等待)

wf2091139 2005-08-03 10:26:00
请问!(下面 TQuery * qry,TDataSouces *dsMain,其中 dsMain->DataSet = qry)
qry->Close();
qry->SQL->Clear();
qry->SQL->Add("Select * from a");
qry->Open();
if(dsMain->DataSet->State == dsBrowse)
{
ShowMessage("browse");//这句显示了!
}
由上面可以看出state处于 browse 状态(readonly),请问我该在什么地方,用什么语句可以
是状态为可写(canmodify)?
...全文
208 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wf2091139 2005-08-03
没有滚动

(这些控件都是在TFrame窗体中的)

在最先的时候,得到数据集是用 “Select * from ....”,此时DBGrid 是可以写数据的,
但我后来 把它改成了存储过程“Exec pr_SelectTable...”形式,DBGrid 就不可以写如数据
且提示那个东东只读,郁闷

回复
LocustWei 2005-08-03
DataSet是否有滚动?导致自动Post()
回复
setdefault 2005-08-03
是的,必须是它的数据集。可以查看一下dsMain的DataSet属性。DataSet所指定的数据集应该是被设置为只读状态。
而且应该是在未打开之前才能更改ReadOnly属性。
回复
wf2091139 2005-08-03

“dsMain->ReadOnly = false;”
这个不可以,DataSouce 没有 readonly 属性
回复
setdefault 2005-08-03
那就是你的dsMain连接的数据源是ReadOnly
如果数据源是ADOTable
TADOTable * dd = (TADOTable*)dsMain->DataSet;
dsMain->ReadOnly = false;
if (dsMain->DataSet->State==dsBrowse)
dsMain->DataSet->Edit();
}
回复
wf2091139 2005-08-03
不是post(),DBGrid根本就写不进去任何数据!
比如我在dbgrid双击事件中是这样操作的
void __fastcall TfrmEditbl::DBGrid3DblClick(TObject *Sender)
{
if (dsMain->DataSet->State == dsBrowse )
dsMain->DataSet->Edit(); (*)
/*以下是操作*/
//根据双击的字段选择对dbgrid中该字段使用不同的字符
}
可是当他运行到(*)是就出错!(错误提示是:qry:cannot modify a read-only dataset)
回复
setdefault 2005-08-03
是Post()时出错么?DBGrid更改完会自动调用Post(),调用完Post(),数据集的State就不是Edit了,这时再Post()就会出现这样的错误。
回复
NetSpider9804040 2005-08-03
dsMain->DataSet->Edit();
回复
wf2091139 2005-08-03
现在数据集一直显示是只读。(有错误提示“qry:Dataset not in edit or insert mode”)
这要什么改?
回复
wf2091139 2005-08-03
可是dgEditing 已经为 true了(默认的情况下就是为true的)
回复
setdefault 2005-08-03
dbgrid是自己维护数据集的状态的。在Options选项中设置dgEditng为true
回复
wf2091139 2005-08-03
to: setdefault
我试了,好象还是不行。

(上面忘了说,我另有dbgrid (dbgrid->DataSouces = dsMain))

dbgrid里面还是不能修改!



回复
setdefault 2005-08-03
if (dsMain->DataSet->CanModify) dsMain->DataSet->Edit();
回复
YoungMonkey 2005-08-03
TStoredProc同样继承于TBDEDataSet,TQuery、TTable相关的操作(Edit,Post,Cancel,Locate,Delete等)同样适应于TStoredProc,不能修改的大部分原因是违反数据库逻辑。
回复
YoungMonkey 2005-08-03
数据库允许的话是可以改的,关键取决于数据库。
回复
wf2091139 2005-08-03
那么TStoredProc 读出的数据集可以支持用户修改?
回复
YoungMonkey 2005-08-03
存储过程直接用TStoredProc控件,一样可以用Open()打开,出这个错误可以是你的存储过程是多表查询或者读出的为只读数据(直接Pos()的话会破坏数据库的数据完整性所以数据库拒绝更新)
回复
YoungMonkey 2005-08-03
存储过程直接用TStoredProc控件,一样可以用Open()打开,出这个错误可以是你的存储过程是多表查询或者读出的为只读数据(直接Pos()的话会破坏数据库的数据完整性所以数据库拒绝更新)
回复
wf2091139 2005-08-03
应该是存储过程查询结果是只读的原因!
那么怎么才可以设置为可写?

如过将 qry->RequestLive 设置为 true,
在用“Select * from ...”时,dbgrid 可以修改数据,

可是如果换成存储过程就只能把 qry->RequestLive 设置为 false,
否则会出错!错误提示:
....'Token not found.

Token: Exec

Line Number:1'

真不懂到底是为什么?
回复
setdefault 2005-08-03
ADOQuery上有一个LockType
回复
发动态
发帖子
数据库及相关技术
创建于2007-08-02

1156

社区成员

C++ Builder 数据库及相关技术
申请成为版主
社区公告
暂无公告