我想要解决的问题描述如下:
我的树型控件是来连接数据库的,我已经在树型控件中加载了节点,根节点是服务器,下一级节点是数据库,再下一级是数据表,因为每一级是不同的类型,我想通过选择某个节点后,就可以判断它是哪中类型,从而能根据不同的类型对数据库进行不同的操作?希望大家能给个帮助?先谢谢了
我的树型控件是来连接数据库的,我已经在树型控件中加载了节点,根节点是服务器,下一级节点是数据库,再下一级是数据表,因为每一级是不同的类型,我想通过选择某个节点后,就可以判断它是哪中类型,从而能根据不同的类型对数据库进行不同的操作?希望大家能给个帮助?先谢谢了
我已经设计了类(PgServer, PgDatabase)
但是如果点击了那个数据库的节点,怎么关联上那个PgDatabase数据类?
因为可能有几个数据库的节点,所以你还要判断究竟是哪个PgDatabase实例?
0:服务器
1:数据库
2:表格
3:视图
......
SetItemData(hRoot, 0);//表示服务器
if (GetItemData(hItem) == 0)
{
//对服务器操作
}
在数据类中再添加一些相应的方法。点击hItem的时候,传进去,得到相应的信息。比如是不是数据库,数据库的名字是什么,表名是什么。这样就可以做扩展了。
TreeCtrlItem.hInsertAfter=TVI_LAST;
TreeCtrlItem.item.mask=TVIF_TEXT|TVIF_PARAM;
TreeCtrlItem.hParent=TVI_ROOT;
TreeCtrlItem.item.pszText=L"sdfsdfdf";
TreeCtrlItem.item.lParam=0; m_trcLayer.InsertItem(&TreeCtrlItem);
充分利用好item的lParam,这是一个DWORD型的数字,你可以放一个指针吗!?
//CPgServer和CPgDatabase 都派生于CPgObject,type 用来说明pgObject的类型
//PGresult PGconn 是数据库中一些内部的东西,不用管
void CPgTreeCtrl::SetBindData(HTREEITEM hItem, int type, CPgObject *pgObject)
{
PGresult *res;
PGconn *conn;
string sql;
int i;
char *result;
HTREEITEM h1,h2; TV_INSERTSTRUCT tvinsert; tvinsert.hInsertAfter=TVI_LAST;
tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
tvinsert.item.hItem=NULL;
tvinsert.item.cchTextMax=6;
tvinsert.item.cChildren=0;
tvinsert.item.lParam=0; switch(type)
{
case 0:
sql = "select datname from pg_database where datname not in ('template1','template0','template_postgis')";
conn = pgObject->GetConn();
// conn = PQconnectdb("host=127.0.0.1 user=postgres password=postgres");
res = PQexec(conn, sql.data()); for(i = 0; i < PQntuples(res); i++)
{
result = PQgetvalue(res, i, 0);
tvinsert.hParent = hItem;
tvinsert.item.iImage = 1;
tvinsert.item.iSelectedImage=1;
tvinsert.item.pszText = result;
h1 = InsertItem(&tvinsert);// SetItemData(h1, pgObject); //出错
CPgDatabase database(pgObject->m_host,pgObject->m_username,pgObject->m_pwd,result);
if(!database.PGCreateConn())
{
return;
}
SetBindData(h1, 1, &database);
}
break;
case 1:
tvinsert.hParent = hItem;
tvinsert.item.iImage = 2;
tvinsert.item.iSelectedImage=2;
tvinsert.item.pszText = "public";
h2= InsertItem(&tvinsert);
sql = "select tablename from pg_tables where schemaname = 'public' and tablename not in('geometry_columns','spatial_ref_sys')"; conn = pgObject->GetConn();
res = PQexec(conn, sql.data()); for(i = 0; i < PQntuples(res); i++)
{
result = PQgetvalue(res, i, 0);
tvinsert.hParent = h2;
tvinsert.item.iImage = 3;
tvinsert.item.iSelectedImage=3;
tvinsert.item.pszText = result;
InsertItem(&tvinsert); }
break;
default:
break;
}}按照大家的意思,我只能取得它的类型,但是不能判断究竟是哪个实例.例如,我有postgres和gisdb两个数据库,都加到了节点里面,并且数据库都连接上了。如果我点击postgres节点,我就要取得跟这个节点相关的CPgDatabase实例,接着它就可以操作连接的postgres数据库了!
请问各位大侠该怎么办?
谢谢大家的帮助!