_bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=student;uid=sa; pwd=123;";
ERROR:用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。请按任意键继续. .
.会出现上面错误
我用的是 SQL2005 用windows账户登陆的 ,uid 和 pwd 在哪设置的?
ERROR:用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。请按任意键继续. .
.会出现上面错误
我用的是 SQL2005 用windows账户登陆的 ,uid 和 pwd 在哪设置的?
企业管理/安全性(security)/选择账号sa属性/更改方法二:
alter login [sa] with password=N'123'
配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->打开SQLEXPRESS下的DataBase Engine节点,选择远程连接,选择“同时使用TCP/IP和named pipes”,确定后,重启数据库服务。
2:登录改为混合模式
打开管理器,用windows方式连接进入数据库,右键点击数据服务器-属性,安全性,在“服务器身份验证”下选择“SQL SERVER和windows身份验证模式”,"登录审核"选“失败和成功的登录”确定。
3:新建用户和密码,与sql2000类似,不做介绍
这样就可以用数据连接字符串进行连接了,比如(server=.\\sqlexpress;uid=sa;pwd=密码;database=数据库名称")
如果在用SQLServer模式连接的时候,报错“已成功与服务器建立连接,但是在登录过程中发生错误”
展开服务器上的"安全性"->登陆名->选中SA登陆帐号(右键)->状态->登陆修改为启用。
/*--创建一个只允许特定程序使用的数据库用户 创建一个用户,这个用户只有用我们特定的应用程序登录
才具有访问数据库的权限,用其他工具登录没有任何权限 在下面的示例中,演示了如何控制登录l_test
使其登录后只允许访问pubs数据库的titles表
而对jobs表的访问权限,只允许在某些许可的应用程序中访问。--邹建 2004.09(引用请保留此信息)--*/--创建测试环境
USE pubs--创建一个登录 l_test, 密码 pwd, 默认数据库 pubs
EXEC sp_addlogin 'l_test','pwd','pubs' --为登录 l_test 在数据库 pubs 中添加安全帐户 u_test
EXEC sp_grantdbaccess 'l_test','u_test'--授予安全帐户 u_test 对 titles 表的 SELECT 权限
GRANT SELECT ON titles TO u_test--创建一个应用程序角色 r_p_test, 密码 abc
EXEC sp_addapprole 'r_p_test','abc'--授予角色 r_p_test 对 jobs 表的 SELECT 权限
GRANT SELECT ON jobs TO r_p_test
GO
--创建好上面的测试后,现在来测试如何使用应用程序角色
--我们把用户及密码告诉使用者,即告诉使用者,用户是: l_test,密码是: pwd
--使用者可以用我们这个用户在任何地方登录,包含查询分析器
--但是,用户只能访问 titles 表,不能访问其他对象,如果建立用户时不授予它任何权限,则它不访问除guest用户和public角色允许访问外的任何对象
--OK,到这里,我们是把用户控制住了--下面我们再来说在程序中的处理,因为用户在程序中登录后,需要对jobs表有访问权限的
--我们只需要在用户登录后,执行一句
EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'
--这样,我们登录的用户就转变为 r_p_test 角色的权限,而它自身的权限丢失
--只要这个用户不退出应用程序,他的权限就会保持
--如果用户退出了当前应用程序,则他的权限自动收回
--同时,这个用户即使没有退出应用程序,他也是只在我们的应用程序中有权限,在其他地方登录,也不会有权限
--因为这个密码我们是不用给用户的,所以,用户没有这个角色的密码,也就限制了他只能在程序中使用我们的数据--激活应用程序角色 r_p_test 前,登录具有表 titles 的访问权,但无表 jobs 的访问权
SELECT titles_count=COUNT(*) FROM titles
SELECT jobs_count=COUNT(*) FROM jobs
/*--结果:
titles_count
------------
18(所影响的行数为 1 行)服务器: 消息 229,级别 14,状态 5,行 2
拒绝了对对象 'jobs'(数据库 'pubs',所有者 'dbo')的 SELECT 权限。
--*/
GO--用密码 abc 激活 r_p_test 应用程序角色,并且在将此密码发送到SQL Server之前对其加密
EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'
GO--激活应用程序角色 r_p_test 后,登录失去表 titles 的访问权,获取表 jobs 的访问权
SELECT titles_count=COUNT(*) FROM titles
SELECT jobs_count=COUNT(*) FROM jobs
/*--结果
服务器: 消息 229,级别 14,状态 5,行 2
拒绝了对对象 'titles'(数据库 'pubs',所有者 'dbo')的 SELECT 权限。
jobs_count
-----------
14(所影响的行数为 1 行)
--*/
go--删除测试
EXEC sp_dropapprole 'r_p_test'
EXEC sp_revokedbaccess 'u_test'
EXEC sp_droplogin 'l_test'
用的代码是
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <iostream>
#include <iomanip> //for setw()
using namespace std;
class STU
{
public:
char snum[10]; //学号
char sname[10]; //姓名
char ssex[2]; //姓别
long sage; //年龄
char smajor[20]; //专业
public:
STU(){}
~STU(){}
};
int main()
{
STU student;
::CoInitialize(NULL); //初始化OLE/COM库环境,为访问ADO接口做准备
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
_bstr_t bstrSQL("select * from stu_info"); //查询语句
char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";
try
{
//创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串,必须是BSTR型或者_bstr_t类型
//_bstr_t strConnect = "Provider=SQLOLEDB;Server=(local);Database=vbdb; uid=sa; pwd=123;";
//_bstr_t strConnect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.1.10\\共享\\EASSON.mdb;Mode=Share Deny Read|Share Deny Write;Persist Security Info=False";
_bstr_t strConnect = "Provider=SQLOLEDB;Server=(local);Database=vbdb; uid=sa; pwd=sa;";
//若数据库在网络上则Server为形如(192.168.1.5,3340)
//用户sa和密码123只是针对我的库
m_pConnection->Open(strConnect,"","",adModeUnknown);
if(m_pConnection==NULL)
cerr<<"Lind data ERROR!\n";
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t vsnum,vsname,vsage,vssex,vsmajor; //对应库中的snum,sname,sage,ssex,smajor
cout << "学号 姓名 年龄 姓别 专业";
cout << "\n----------------------------------------------------------------\n";
while(!m_pRecordset->EndOfFile)
{
vsnum = m_pRecordset->GetCollect(_variant_t((long)0)); //这儿给字段编号和字段名都可以
vsname = m_pRecordset->GetCollect("sname");
vsage = m_pRecordset->GetCollect("sage");
vssex = m_pRecordset->GetCollect("ssex");
vsmajor = m_pRecordset->GetCollect("smajor");
if(vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL && vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
{
cout.setf(ios::left);
cout << setw(14) << (char*)(_bstr_t)vsnum;
cout << setw(14) << (char*)(_bstr_t)vsname;
cout << setw(8) << vsage.lVal;
cout << setw(8) << (char*)(_bstr_t)vssex;
cout << setw(20) << (char*)(_bstr_t)vsmajor;
cout.unsetf(ios::left);
cout << endl;
}
m_pRecordset->MoveNext(); ///移到下一条记录
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n请输入你要添加的学生信息\n";
cout << "学号:";
cin >> student.snum;
cout << "\n姓名:";
cin >> student.sname;
cout << "\n年龄:";
cin >> student.sage;
cout << "\n姓别:";
cin >> student.ssex;
cout << "\n专业:";
cin >> student.smajor;
m_pRecordset->MoveFirst(); //移动到第一条记录
m_pRecordset->AddNew(); //添加新记录
m_pRecordset->PutCollect("snum",_variant_t(student.snum));
m_pRecordset->PutCollect("sname",_variant_t(student.sname));
m_pRecordset->PutCollect("sage",_variant_t(student.sage));
m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
m_pRecordset->Update();
m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来删除
m_pRecordset->Close(); //关闭记录集
}catch(_com_error e) //捕捉异常
{
//显示错误信息
cerr << "\nERROR:" << (char*)e.Description(); //抛出异常
}
if(m_pConnection->State)
m_pConnection->Close();
::CoUninitialize();
return 0;
}
给出的错误是:
ERROR:无法打开登录 'vbdb' 中请求的数据库。登录失败。
我的数据库的名称叫做"vbdb",请高手指教!!!