C++ 使用SQLConfigDataSource创建SQL Server DSN失败:关键字-值对无效
当C++ 使用SQLConfigDataSource创建SQL Server DSN失败:关键字-值对无效,c++,sql-server,winapi,odbc,C++,Sql Server,Winapi,Odbc,当Trusted\u Connection=yes并且没有用户id和密码时,它会工作。但当使用用户id和密码时,它会失败并显示错误消息: 关键字值对驱动程序的ConfigDSN、ConfigDriver或 ConfigTranslator失败 我尝试了UID字段的“用户id”、“UID”和“用户名”以及密码字段的“密码”、“PWD”,但都失败了。驱动程序不允许将用户名和密码存储为DSN的一部分,因为这不安全。因此,在创建DSN时不要指定UID和PWD属性,这些属性应该在连接阶段指定 static
Trusted\u Connection=yes
并且没有用户id和密码时,它会工作。但当使用用户id和密码时,它会失败并显示错误消息:
关键字值对驱动程序的ConfigDSN、ConfigDriver或
ConfigTranslator失败
我尝试了UID字段的“用户id”、“UID”和“用户名”以及密码字段的“密码”、“PWD”,但都失败了。驱动程序不允许将用户名和密码存储为DSN的一部分,因为这不安全。因此,在创建DSN时不要指定UID和PWD属性,这些属性应该在连接阶段指定
static bool DBBase::CreateDSN(const TCHAR* sDriver, const TCHAR * sCreateDsnString)
{
if (SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, sDriver, sCreateDsnString))
{
return true;
}
else
{
WORD wErrNum = 1;
WORD cbRet;
DWORD pErr;
TCHAR szErrMsg[SQL_MAX_MESSAGE_LENGTH];
while (SQLInstallerError(wErrNum, &pErr, szErrMsg, SQL_MAX_MESSAGE_LENGTH, &cbRet) != SQL_NO_DATA)
{
_WRITELOGN(szErrMsg);
wErrNum++;
};
return false;
}
}
void test()
{
const TCHAR* sDriver = _T("SQL Server");
const TCHAR* sCreateDsnString = _T("DSN=myDSN\0Server=myIP\\MyDbInstance\0Database=myDB\0Trusted_Connection=no\0UID=sa\0PWD=sa\0\0");
DBBase::CreateDSN(sDriver, sCreateDsnString);
}