27
2012
06

VS2005如何连接SQL Server 2005数据库

VS2005连接SQL Server 2005数据库

本地连接、远程连接、数据库打包等问题整理

一、本地连接

首先,在Stdafx.h文件中加入如下语句:

#import "c:\program files\common files\system\ado\msado15.dll"  no_namespace  rename ("EOF", "adoEOF") 

注:语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。

其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit(); 

接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:

1、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。

——打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。代码如下所示: _ConnectionPtr m_pConnection; 

// 初始化COM,创建ADO连接等操作

AfxOleInit(); 

m_pConnection.CreateInstance(__uuidof(Connection)); 

try 

// 打开本地数据库Demo .mdb 

m_pConnection->Open("Provider=SQLOLEDB;Server=.;Database=Demo;Integrated Security=SSPI","","",adModeUnknown); 

catch(_com_error e) 

AfxMessageBox(e.Description()); 

return FALSE; 

——关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection->State) 

m_pConnection->Close(); 

m_pConnection= NULL; 

2、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。

——打开数据表。打开库内表名为DemoTable的数据表,代码如下: _RecordsetPtr m_pRecordset; 

m_pRecordset.CreateInstance(__uuidof(Recordset)); 

try 

m_pRecordset->Open("SELECT * FROM DemoTable", // 查询DemoTable表中所有字段

m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针

adOpenDynamic, 

adLockOptimistic, 

adCmdText); 

catch(_com_error *e) 

AfxMessageBox(e->ErrorMessage()); 

——读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。代码如下所示: _variant_t var; 

CString strName,strAge; 

try 

if(!m_pRecordset->BOF) 

m_pRecordset->MoveFirst(); 

else 

AfxMessageBox("表内数据为空"); 

return; 

// 读入库中各字段并加入列表框中

while(!m_pRecordset->adoEOF) 

var = m_pRecordset->GetCollect("Name"); 

if(var.vt != VT_NULL) 

strName = (LPCSTR)_bstr_t(var); 

var = m_pRecordset->GetCollect("Age"); 

if(var.vt != VT_NULL) 

strAge = (LPCSTR)_bstr_t(var); 

 

m_AccessList.AddString( strName + " --> "+strAge ); 

 

m_pRecordset->MoveNext(); 

 

// 默认列表指向第一项,同时移动记录指针并显示

m_AccessList.SetCurSel(0); 

catch(_com_error e) 

AfxMessageBox(e.Description());

}

——插入记录。可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示: try 

// 写入各字段值

m_pRecordset->AddNew(); 

m_pRecordset->PutCollect("Name", _variant_t(m_Name)); 

m_pRecordset->PutCollect("Age", atol(m_Age)); 

m_pRecordset->Update(); 

 

AfxMessageBox("插入成功!"); 

catch(_com_error *e) 

      //AfxMessageBox(e->ErrorMessage()); 

——移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示: try 

int curSel = m_AccessList.GetCurSel(); 

// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针

m_pRecordset->MoveFirst(); 

m_pRecordset->Move(long(curSel)); 

 

catch(_com_error *e) 

AfxMessageBox(e->ErrorMessage()); 

——修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示: try 

// 假设对第二条记录进行修改

m_pRecordset->MoveFirst(); 

m_pRecordset->Move(1); // 从0开始

m_pRecordset->PutCollect("Name", _variant_t(m_Name)); 

m_pRecordset->PutCollect("Age", atol(m_Age)); 

m_pRecordset->Update(); 

catch(_com_error *e) 

AfxMessageBox(e->ErrorMessage()); 

——删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示: try 

// 假设删除第二条记录

m_pRecordset->MoveFirst(); 

m_pRecordset->Move(1); // 从0开始

m_pRecordset->Delete(adAffectCurrent); // 参数adAffectCurrent为删除当前记录

m_pRecordset->Update(); 

catch(_com_error *e) 

     //AfxMessageBox(e->ErrorMessage()); 

——关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示: m_pRecordset->Close(); 

m_pRecordset = NULL; 

3、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。

——执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示: _CommandPtr m_pCommand; 

m_pCommand.CreateInstance(__uuidof(Command)); 

m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它

m_pCommand->CommandText = "SELECT * FROM DemoTable"; // SQL语句

m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集

——执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息,并将其赋于_CommandPtr中Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN。执行存储过程的代码如下所示: _CommandPtr m_pCommand; 

m_pCommand.CreateInstance(__uuidof(Command)); 

m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它

m_pCommand->CommandText = "Demo"; 

m_pCommand->Execute(NULL,NULL, adCmdStoredProc); 

 

二、远程连接

首先配置Sql 2005:

1. 配置SQL Server外围应用服务器,开启SQL Server 2005远程连接功能:

 “配置工具”->“SQL Server外围应用配置器”-> 选择“服务和连接的外围应用配置器”->选择Database Engine节点下的 “远程连接”-> 选择“本地连接和远程连接”-> 选择“同时使用TCP/IP和named pipes”-> 点击确定,重新启动数据库服务。

2. 把登陆设置改为SQL Server 和 Windows 身份验证模式:

  打开SQL Server Management Studio管理器,点击服务器上面右键然后查看属性,在安全性选项里面对服务身份验证选择“SQL Server 和 Windows 身份验证模式”。

3.修改SQL Server sa的密码:

  在SQL Server Management Studio管理器中,展开服务器上的“安全性”->登陆名->在sa帐号上点右键属性,这样在“常规”的选择页中更改sa登陆帐号的密码。注意SQL Server2005中,不允许密码设置简单,否则会通不过。然后在选择页的“状态”的登录修改为启用。

4.设置SQL Server 的端口号

     在SQL Server Configuration Manager管理器中,展开SQL Server 2005 Network Configuration项目 -> 单击下面的 Protocols for 'dbname' -> 在右侧的窗口中,右键单击"TCP/IP"项,选择"属性" -> 打开"TCP/IP properties"窗口 - > 单击"IP Address"选项卡 -> 将所有IP地址下面的 "TCP Port" 值设置成1433

5.确保开启SQL Server服务

     在SQL Server Configuration Manager管理器中, 选中SQL Server 2005 Services,在右侧的窗口中启动SQL Server ('YourInstance'),

6. 修改连接字符串,在字符串中加入SQl Server 服务的端口号.

"Provider=SQLOLEDB;Server=192.168.0.54,1433;Database= Demo;User ID=sa;pwd=sql; "(我的服务器ip是192.168.0.54,1433,为sql server端口,大家就实际情况修改ip密码等)。

三、数据库打包

远程访问数据库的方法不必考虑这个问题,本地连接要打包数据库。

最简单的方法是分离数据库,在安装前加载到目标主机的服务器上。

另一种方法是生成数据库的脚本文件,方法如下:

1. 在自己的 SQL 数据库 DB 上 ( 例如数据库名称为 :DB), 右击 -> 任务 -> 生成脚本 . 将该脚本存储为 Mydb2005.sql

2. 编辑 ”Mydb2005.sql”, 并在文档前段附加以下内容 :

-- 生成数据库

use master

if not exists( select name from sysdatabases where name = ' 你要生成的数据库名称 ' )

begin

create database 你要生成的数据库名称

end

go

 

-- 创建登录名 / 密码

IF not   EXISTS ( SELECT * FROM sys.server_principals WHERE name = N' 你的登录名 ' )

begin

create login [succeed] with PASSWORD =  '你的密码'  , CHECK_EXPIRATION= OFF , CHECK_POLICY= ON

end

go

use 你创建的数据库名

后面是 SQL 自动生成的脚本 , 主要是创建表格 , 存储过程之类的 .

 

在dos下用osql命令运行sql脚本的方法:

Dos命令行后输入osql –E –i c:\ Mydb2005.sql

注意就实际情况修改路径。

asp.net还可以使用代码进行连接:<add key="SQLConnection" value="Data Source=.;Initial Catalog=数据库名;User ID=用户名;PWD=密码"/>

在调用方法得到连接字符:

        public static String getConnectionString()
        {
            return ConfigurationManager.AppSettings["SQLConnection"];
        }

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。