请教如何获取数据库内一个表的主键列名?

goldappleit 2017-05-02 05:25:50
VC++2013MFC应用程序采用ADO方式链接 SQL Server2012数据库,链接已成!
现在想获取一个给定表名的表的主键名称,在百度了一下大多建议“”利用sp_pkeys查询表的主键信息”。
/*****************以下为百度内容****************************************************************************************************/
返回当前环境中单个表的主键信息,如果表是联合主键,则每一个主键列都会返回一列数据。

语法:
sp_pkeys [ @table_name = ] 'name'
[ , [ @table_owner = ] 'owner' ]
[ , [ @table_qualifier = ] 'qualifier' ]


参数说明:
[ @table_name = ] 'name'--要查询的表名
[ @table_owner = ] 'owner'--表的所有者

返回列:
TABLE_QUALIFIER--表限定符的名称,该字段可以为 NULL。
TABLE_OWNER--表的所有者,该字段始终返回值。
TABLE_NAME--表的名称,该字段始终返回值。
COLUMN_NAME--表中主键列中每一列的列名,该字段始终返回值。
KEY_SEQ--多列主键中每一列对应的序列号。
PK_NAME--主键的名称。

注意:
1,sp_pkeys只能返回一个提定表的主键信息
2,只有第一个参数@table_name是必须,其它两个参数可以不传值。

示例代码:
比如我们要查看表table1的主键名及所有的主键列
sp_pkeys 'table1'
/*****************以上为百度内容****************************************************************************************************/


/*****************我自己写代码如下****************************************************************************************************/
CDBMG mydb;
mydb.ConnectDB();
CString sSQL;
sSQL = _T("sp_pkeys 'HirePictures'");
try
{
mydb.m_pConnection->Execute((_bstr_t)sSQL, NULL, adCmdText);
}
catch (_com_error&e)
{
mydb.GetErrors(e); //则捕获错误信息并显示。
}

//获取主键列名代码如何写?

mydb.UnConnectDB();
/*****************我自己写代码如上****************************************************************************************************/

编译通过,无错误!
请问各位高手,获取主键列名代码如何写?
先谢谢了!
...全文
685 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldappleit 2017-05-03
  • 打赏
  • 举报
回复
自己搞定了
使用语句
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '表名'

查到的第一个字段为表名,第二个字段为主键字段名!
非常感谢大家的帮助!尤其感谢zyq5945版主,提醒我使用了查询分析器,使问题最终得到解决!
goldappleit 2017-05-03
  • 打赏
  • 举报
回复


这是我要查询的表:
zgl7903 2017-05-03
  • 打赏
  • 举报
回复
键名的话 用 GetFieldInfo
zyq5945 2017-05-03
  • 打赏
  • 举报
回复
引用 3 楼 goldappleit 的回复:
谢谢您的指点, 我将代码修改为:

CString sSQL;

	sSQL = _T("select * from sysobjects where parent_obj in(select id from sysobjects where name = 'HirePictures') and xtype = 'pk'");
	
	try
	{
		mydb.OpenRecordSet(sSQL);
	 }
	catch (_com_error&e)
	{
		mydb.GetErrors(e);             //则捕获错误信息并显示。

	}

	short sI = mydb.GetFieldsCount();
	CString sTemp = _T("");
	sTemp= mydb.GetFieldValue(0);
        
        mydb.UnConnectDB();
代码执行后,读出的字段名和字段值都没有我要信息———表HirePictures的主键列名 还请不吝赐教!
先在SQL Server的查询分析器来查询看看。
goldappleit 2017-05-02
  • 打赏
  • 举报
回复
谢谢您的指点, 我将代码修改为:

CString sSQL;

	sSQL = _T("select * from sysobjects where parent_obj in(select id from sysobjects where name = 'HirePictures') and xtype = 'pk'");
	
	try
	{
		mydb.OpenRecordSet(sSQL);
	 }
	catch (_com_error&e)
	{
		mydb.GetErrors(e);             //则捕获错误信息并显示。

	}

	short sI = mydb.GetFieldsCount();
	CString sTemp = _T("");
	sTemp= mydb.GetFieldValue(0);
        
        mydb.UnConnectDB();
代码执行后,读出的字段名和字段值都没有我要信息———表HirePictures的主键列名 还请不吝赐教!
zyq5945 2017-05-02
  • 打赏
  • 举报
回复
在查询分析器中查看返回了那些列,列名称是什么,根据列名称来读取,初学的话看下这个例子
zyq5945 2017-05-02
  • 打赏
  • 举报
回复
利用系统表sysobjects查询。
select * from sysobjects where parent_obj in (select id from sysobjects where name='表名') 
and xtype='pk'

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧