两层数据库中获得表的主关键字。(200分)

  • 主题发起人 主题发起人 程云
  • 开始时间 开始时间

程云

Unregistered / Unconfirmed
GUEST, unregistred user!
两层数据库中获得表的主关键字。
不知有谁知道,给区区一个提示好吗?

灌水有分。
 
不要没人理我好不好啊!
这可是个小问题啊!
 
请问您后端数据库是什么?
 
没用过...
 
我做过一个函数,针对sql server,其他系统不知道。
 
to mech:
后台数据库是Access、SQL Server。

to 温柔一刀:
望多多帮助一下。
 
我好难过啊!200分,没人要。
这个年代怎么没有人爱钱啊!

这可是200大富翁元啊!
 
sorry
对我来说是难题
 
SQL Sever Books Onlines 上的例子不知是否合用

======================================

This example creates a primary key index.

// This CREATE TABLE statement shows the referential integrity and
// PRIMARY KEY constraint on the OrderDetails table that will be created
// by the following example code.

//

// CREATE TABLE OrderDetails

// (

// OrderID int NOT NULL

// ProductID int NOT NULL

// CONSTRAINT PK_OrderDetails

// PRIMARY KEY CLUSTERED (OrderID, ProductID),

// UnitPrice money NOT NULL,

// Quantity int NOT NULL,

// Discount decimal(2,2) NOT NULL

// DEFAULT 0

// )

//

HRESULT CreatePrimaryKey

(

IIndexDefinition* pIIndexDefinition

)

{

HRESULT hr = S_OK;



DBID dbidTable;

DBID dbidIndex;

const ULONG nCols = 2;

ULONG nCol;

const ULONG nProps = 2;

ULONG nProp;



DBINDEXCOLUMNDESC dbidxcoldesc[nCols];

DBPROP dbpropIndex[nProps];

DBPROPSET dbpropset;



DBID* pdbidIndexOut = NULL;



// Set up identifiers for the table and index.

dbidTable.eKind = DBKIND_NAME;

dbidTable.uName.pwszName = L"OrderDetails";



dbidIndex.eKind = DBKIND_NAME;

dbidIndex.uName.pwszName = L"PK_OrderDetails";



// Set up column identifiers.

for (nCol = 0; nCol < nCols; nCol++)

{

dbidxcoldesc[nCol].pColumnID = new DBID;

dbidxcoldesc[nCol].pColumnID->eKind = DBKIND_NAME;



dbidxcoldesc[nCol].eIndexColOrder = DBINDEX_COL_ORDER_ASC;

}

dbidxcoldesc[0].pColumnID->uName.pwszName = L"OrderID";

dbidxcoldesc[1].pColumnID->uName.pwszName = L"ProductID";



// Set properties for the index. The index is clustered,

// PRIMARY KEY.

for (nProp = 0; nProp < nProps; nProp++)

{

dbpropIndex[nProp].dwOptions = DBPROPOPTIONS_REQUIRED;

dbpropIndex[nProp].colid = DB_NULLID;



VariantInit(&amp;(dbpropIndex[nProp].vValue));



dbpropIndex[nProp].vValue.vt = VT_BOOL;

}

dbpropIndex[0].dwPropertyID = DBPROP_INDEX_CLUSTERED;

dbpropIndex[0].vValue.boolVal = VARIANT_TRUE;



dbpropIndex[1].dwPropertyID = DBPROP_INDEX_PRIMARYKEY;

dbpropIndex[1].vValue.boolVal = VARIANT_TRUE;



dbpropset.rgProperties = dbpropIndex;

dbpropset.cProperties = nProps;

dbpropset.guidPropertySet = DBPROPSET_INDEX;



hr = pIIndexDefinition->CreateIndex(&amp;dbidTable, &amp;dbidIndex, nCols,

dbidxcoldesc, 1, &amp;dbpropset, &amp;pdbidIndexOut);



// Clean up dynamically allocated DBIDs.

for (nCol = 0; nCol < nCols; nCol++)

{

delete dbidxcoldesc[nCol].pColumnID;

}



return (hr);

}
 
to zwhc:

象是C的程序,有Delphi的吗?
我是在Delphi上用啊!

to 温柔一刀:

来帮帮我啊!
 
呵呵.. "大富翁元"
瞎灌水:是否有这个惯例,"主关键字为表的第一个字段";
 
如果是SQL SERVER, 您可以用系统存储过程
SP_HELPINDEX检索所有INDEX, 并判定其中
的PRIMARY KEY。
当然, 您也可以分析SP_HELPINDEX, 并
写出自已的程序。
 
to 程云:

我的函数,原理与mech说的一样,先帖在这里,
这几天身体不太好,别的事情以后再说。

function PrimaryKey(TableName: string): TStrings;
var
strPKeys:string;
begin
result:=TStringList.Create;
with qryUtil do
begin
SQL.Text:='sp_helpindex '+TableName;
Open;
First;
while not (qryUtil.EOF) and (pos('primary key',LowerCase(FieldByName('index_description').AsString))=0) do
Next;

if qryUtil.EOF then FreeAndNil(result)
else
begin
strPKeys:=FieldByName('index_keys').AsString;
StrPKeys:=StringReplace(StrPKeys,' ','',[rfReplaceAll]);
StrPKeys:=StringReplace(StrPKeys,',',#13+#10,[rfReplaceAll]);
result.Text:=StrPKeys;
end;
Close;
SQL.Clear;
end;
end;
 
感谢两位了,我回去试试再说。
 
我试过了方法是没问题。
但如果我不去考虑数据库的类型,要如何作?

我的意思是:如果让这种程序能工作在任何数据库上该如果作。
其马也要是常见的几种数据库上。

还请各位多多帮忙。
 
在sybase数据库中,他所有的表、视图的信息都是存在系统表中的。例如
select Rtrim(c.name)
from sysobjects o,syscolumns c
where c.id=o.id and o.name='tablename' and o.type='U'
可以得到tablename这个表的所有字段英文名

其他的数据也是类似的
 
是你叫我来的喔,我来了,不过我当场昏厥过去,所以你要负责我的医疗费和营养费!!
恐怕这区区200不够吧? :-)
 
SQL server中也有thtfsyh说系统表,我查了一下,在sysindexes中.
 
to thtfsyh:
十分感谢,看来,在一些大型数据库上的的问题也解决。
介小型数据库上如何作?
如果是Access要如何作呢?
我是打算作为通用的,因为不能肯定数据库要哪一种。
还请多多帮忙。

to elan:
你是中暑了吧,还是得什么病了,不要紧。我是作药店MIS的同各药店都是铁哥们。
保证进价给你。先来两卡车够吗?
不要装病了,这点小问题都难倒你不成,没有这么严重吧?

to ArJianzeng:
不要犯晕,你不会也中暑了吧?也给你两卡车药解解暑?
赶快回答,我等着发分呢?

to wumeng:
非常感谢,对我很有用,但还请帮帮忙,看在Access中如何作。
 
后退
顶部