CString CTCDlg::QueryPrimaryKey(CString strDestTable)
{
SQLHENV henv;
SQLRETURN retcode;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLCHAR szPkCol[COL_LEN];
SQLINTEGER cbPkCol;
CString strSQLQueryPK, PKColName;
LPSTR pSQLQueryPK; strSQLQueryPK.Format("sp_pkeys @table_name = 'JHMY.dbo.%s'",strDestTable);
pSQLQueryPK = strSQLQueryPK.GetBufferSetLength(strSQLQueryPK.GetLength());
//分配环境句柄
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配连接句柄
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
//retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, 5, 0);
retcode = SQLConnect(hdbc, (SQLCHAR*) "JHMY", SQL_NTS,
(SQLCHAR*) "SA", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
//分配语句句柄
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//执行SQL语句
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLExecDirect(hstmt,(unsigned char*)pSQLQueryPK, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLBindCol(hstmt, 4, SQL_C_CHAR, szPkCol, COL_LEN, &cbPkCol);
SQLFetch(hstmt);
PKColName.Format((LPCTSTR)szPkCol);
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
strSQLQueryPK.ReleaseBuffer();
return PKColName;
}
以上是例子,其实用SQLPrimaryKey()也可以。
{
SQLHENV henv;
SQLRETURN retcode;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLCHAR szPkCol[COL_LEN];
SQLINTEGER cbPkCol;
CString strSQLQueryPK, PKColName;
LPSTR pSQLQueryPK; strSQLQueryPK.Format("sp_pkeys @table_name = 'JHMY.dbo.%s'",strDestTable);
pSQLQueryPK = strSQLQueryPK.GetBufferSetLength(strSQLQueryPK.GetLength());
//分配环境句柄
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配连接句柄
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
//retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, 5, 0);
retcode = SQLConnect(hdbc, (SQLCHAR*) "JHMY", SQL_NTS,
(SQLCHAR*) "SA", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
//分配语句句柄
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//执行SQL语句
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLExecDirect(hstmt,(unsigned char*)pSQLQueryPK, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLBindCol(hstmt, 4, SQL_C_CHAR, szPkCol, COL_LEN, &cbPkCol);
SQLFetch(hstmt);
PKColName.Format((LPCTSTR)szPkCol);
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
strSQLQueryPK.ReleaseBuffer();
return PKColName;
}
以上是例子,其实用SQLPrimaryKey()也可以。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货