没玩过数据库(SQL SERVER),没弄明白,大家来帮我

The_facE 2009-06-30 05:46:24
公司让我来弄这个,没弄明白。闲话不扯了,直接上代码。

先是一个建立数据库的,这是测试用的,以前别人的代码。

CString strDrive="";
int r= LoadKey("ODBC\\ODBCINST.INI\\SQL SERVER", "Driver", strDrive); // 关于LoadKey: 注册表读取
if(0==r ||strDrive=="")
{
MessageBox("系统未安装SQL server 驱动程序,无法创建数据源");
return FALSE;
}

CString strKey="ODBC\\ODBC.INI\\";
strKey+=m_ODBC_Name; // m_ODBC_Name == "tst"

// 关于SaveKey: 注册表写入
SaveKey(strKey,"Database",m_ODBC_Database); // m_ODBC_Database == "tst"
SaveKey(strKey,"Driver",strDrive);
SaveKey(strKey,"LastUser",m_ODBC_UserName); // m_ODBC_UserName == "sa"
SaveKey(strKey,"Server",m_ODBC_Server); // m_ODBC_Server == "127.0.0.1"

strKey="ODBC\\ODBC.INI\\ODBC Data Sources";
SaveKey(strKey,m_ODBC_Name,"SQL Server");


注册表各项写入没有问题,各个键值都写入了。

下面是连接函数,我自己写的。



// 各个返回值都是枚举常量,自定义的。

HRESULT hResult; // 保存函数返回值
strConn = "Provider=sqloledb;Data source=tst;Initial Catalog =master";

try
{
hResult = m_pConnection.CreateInstance( __uuidof(Connection) ); // 建立一个实例
if ( FAILED(hResult) )
{
return INIT_ERROR_CREATE_INSTANCE; // 返回创建失败
}

// 打开一个连接
hResult = m_pConnection->Open( (_bstr_t)strConn, (_bstr_t)m_strUserID, (_bstr_t)m_strPassword, adModeUnknown ); // 用户名与上一段相同,密码为空,异常由此抛出
if ( FAILED(hResult) )
{
return INIT_ERROR_OPEN_DATASOURCE; // 返回打开数据源失败
}
}
// 异常处理
catch( _com_error &e )
{
long lErrorCode = e.WCode();
if ( 3149 == lErrorCode )
{
return INIT_ERROR_BAD_LOGIN;
}
::AfxMessageBox( (LPCTSTR)e.Description(), MB_ICONERROR ); // 每次走这里
return INIT_ERROR_EXCEPTION;
}
catch( ... )
{
TRACE( _T("Unknown Error") );
return INIT_ERROR_EXCEPTION;
}

return CONNECTION_SUCCESS;



每次连接时的异常Description是:[DBNETLIB][ConnectionOpen(Connect()).]SQL Server不存在或拒绝访问。

另问一句
USER [MASTER]
UPDATE [patchtemp] SET flag=2 WHERE [ID] =1
GO
在sql文档里具体做什么,我只知道是修改什么值。
...全文
32 点赞 收藏 23
写回复
23 条回复
一条晚起的虫 2009年07月01日
//建立数据库连接字符串,可以用个保险的方法。
//1、建立一个.udl文件,双击打开;
//2、在【提供程序】中选择 【Microsoft OLE DB Provider For Sql Server】
//3、在【连接】中,输入服务器名称、用户名,密码,数据库等内容
//4、测试连接,如果通过,则用记事本打开udl文件,拷贝出连接字符串。
回复 点赞
永生天地 2009年07月01日
"Provider=SQLOLEDB.1;Initial Catalog=master;Data Source=localhost;User ID=sa;Password=sa";

Data Source=localhost

Data Source=127.0.0.1

Data Source=计算机名
回复 点赞
永生天地 2009年07月01日
tst换成自己的机器名或127.0.0.1看看
回复 点赞
The_facE 2009年07月01日
[Quote=引用 11 楼 happyparrot 的回复:]
CoInitialize(NULL);
调用了么?
[/Quote]

调用了,在类的构造函数里。

我觉得问题还是出在我不会用数据库上。
回复 点赞
快乐鹦鹉 2009年07月01日
CoInitialize(NULL);
调用了么?
回复 点赞
The_facE 2009年07月01日
[Quote=引用 7 楼 happyparrot 的回复:]
你要进行调试,看看是哪一句抛出的异常,这样才能帮你定位。
strConn = "Provider=sqloledb;Data source=tst;Initial Catalog =master";
好像现在Provider=sqloledb.1
[/Quote]

抛出异常的位置我在注释里面写了。就是Connection15::Open函数。

我数据库太菜了,基本上是从来没用过。真该死。
回复 点赞
The_facE 2009年07月01日
[Quote=引用 1 楼 wozhaolala 的回复:]
不懂,
是不是连接字符串有问题哦,试试这个?
"Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=master;Data Source=tst"
SQL是哪个版本?
[/Quote]

SQL Server 2000

我试过不用程序,直接用4楼的udl文件方法连接,在服务器的编辑框敲进"127.0.0.1"是找不到任何数据源的,如果选自己的主机名却看不到tst。可是,为什么会在管理工具->数据源里面找到tst呢?(tst是系统DSN)。

另外,我手动到系统DSN中建立任何数据源,只有选择使用网络登录ID的Windows NT验证才能通过测试连接到下一步,选择使用用户登录输入ID和密码的SQL Server验证是无论如何连接不上的。错误提示是未与信任SQL Server相关联。这是意味着用户名和密码错误?而前一步的服务器选择"127.0.0.1"时出现的错误却和程序连接时一样。
回复 点赞
小木头 2009年07月01日
4楼方法可行且不错
回复 点赞
快乐鹦鹉 2009年07月01日
你要进行调试,看看是哪一句抛出的异常,这样才能帮你定位。
strConn = "Provider=sqloledb;Data source=tst;Initial Catalog =master";
好像现在Provider=sqloledb.1
回复 点赞
Ghost90 2009年07月01日
看下这几篇文章吧

http://www.vckbase.com/document/viewdoc/?id=1669

这个类的代码可能对你有帮助
http://www.vckbase.com/document/viewdoc/?id=597

http://www.vckbase.com/document/viewdoc/?id=441
回复 点赞
huabinsir 2009年07月01日
数据库连接可能没有建立成功。

数据库连接成功后,通过连接才可以 以某种方式 打开表, 以某种方式 对表进行操作。

回复 点赞
marrco2005 2009年07月01日
顶一下4楼的方法
回复 点赞
The_facE 2009年07月01日
谢谢大家,结贴去了。
回复 点赞
The_facE 2009年07月01日
[Quote=引用 20 楼 xys_777 的回复:]
"isql -S localhost -U %s -P %s -d master -i %s\\serverini\\Create_tst%d.sql"
改一下啊
"isql -S 计算机名 -U %s -P %s -D master -i %s\\serverini\\Create_tst%d.sql"

你这怎么又搞到sybase上去了?
[/Quote]

哦哦,我错了。晕死我了,我这脑子欠揍啊。
回复 点赞
永生天地 2009年07月01日
"isql -S localhost -U %s -P %s -d master -i %s\\serverini\\Create_tst%d.sql"
改一下啊
"isql -S 计算机名 -U %s -P %s -D master -i %s\\serverini\\Create_tst%d.sql"

你这怎么又搞到sybase上去了?
回复 点赞
The_facE 2009年07月01日
这样建立起来,数据库倒是连上了。哈哈,可是......

后面我程序里有一段写批处理的代码又麻烦了,还是先上代码大家批阅哈

这一段是格式化SQL语句的,在一个循环里,后面会把他们往批处理文件里写,循环结束后就写成一个批处理文件,最后起控制台进程执行它。

// 格式化SQL命令
strSQLCommand.Format(
_T("isql -S localhost -U %s -P %s -d master -i %s\\serverini\\Create_tst%d.sql"),
m_strUserID, m_strPassword, strCurrentDir, i
); // 这里的ID和密码怎么处理? 我试过把它们kill掉,可惜,到了批处理时会提示Password:停住。
回复 点赞
The_facE 2009年07月01日
[Quote=引用 16 楼 lfchen 的回复:]
只有选择使用网络登录ID的Windows NT验证才能通过测试连接到下一步
//SSPI = true; //windows身份验证,不需要数据库用户和密码。
[/Quote]

我再试一下,大家先别着急。
兄台能否告诉我为什么用SQL SERVER的ID和密码不好用?难道真的是用户名和密码不正确?
回复 点赞
永生天地 2009年07月01日
学习到
[Quote=引用 16 楼 lfchen 的回复:]
只有选择使用网络登录ID的Windows NT验证才能通过测试连接到下一步
//SSPI = true; //windows身份验证,不需要数据库用户和密码。
[/Quote]
回复 点赞
一条晚起的虫 2009年07月01日
只有选择使用网络登录ID的Windows NT验证才能通过测试连接到下一步
//SSPI = true; //windows身份验证,不需要数据库用户和密码。
回复 点赞
popahqiu 2009年06月30日
Connection语句不用提供地址 用户名 密码吗

USER [MASTER]
UPDATE [patchtemp] SET flag=2 WHERE [ID] =1
GO

在patchtemp表中ID=1的元组的flag属性设置为2
回复 点赞
发动态
发帖子
数据库
创建于2007-09-28

3443

社区成员

3.9w+

社区内容

VC/MFC 数据库
社区公告
暂无公告