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"];
}
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。