最近有个项目比较麻烦,客户原来的系统是基于Microsoft SQL Server数据库的,现在要求采用Yii框架和MySQL数据库在这基础上新开发一些功能,这就意味着这个系统要同时访问两个数据库,我们采用如下的方法解决的:
首先我们需要安装wamp服务,并且在wamp中打开MS SQL扩展服务【相关文章:在WAMP中安装Microsoft SQL Server驱动】。然后使用Yii连接数据库。
1、找到protected/config文件夹并打开main.php文件,添加如下代码来连接MySQL和MSSQL。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
'db'
=>
array
(
// default mysql connection
'connectionString'
=>
'mysql:host=localhost;port=3306;dbname=db_name'
,
'emulatePrepare'
=> true,
'username'
=>
'db_username'
,
'password'
=>
'db_password'
,
'charset'
=>
'utf8'
,
'tablePrefix'
=>
'tbl_'
,
// if have prefix in database tables
),
'msdb'
=>
array
(
// microsoft sql server connection
'class'
=>
'CDbConnection'
,
'connectionString'
=>
'sqlsrv:Server=host_name or ip_address;Database=db_name'
,
'username'
=>
'db_username'
,
'password'
=>
'db_password'
,
'charset'
=>
'GB2312'
,
),
?>
|
2、现在,我们需要通过CDbCommand连接MSSQL并在整个程序中访问。
1
2
3
4
5
6
7
8
|
<?php
$company_name
=Yii::app()->msdb->createCommand(
"Select TOP 1 CompanyName from Company_Details Where CompanyID="
ezeelive")->queryRow();
if
(isset(
$company_name
) && !
empty
(
$company_name
[
"CompanyName"
])):
echo
$company_name
[
"CompanyName"
];
// it will print company name Ezeelive Technologies
else
:
echo
''
;
end
if
;
?>
|
3、在数据处理过程中,免不了会出现把数据从一个数据库的表复制/插入到另一个数据库的表,此时我们可以使用createCommand自定义比编写循环或者在模型类中切换数据库实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
class
Company
extends
CActiveRecord
{
public
function
init()
{
$this
->attachEventHandler(
'OnBeforeSave'
,
array
(
$this
,
'switchToWriter'
));
$this
->attachEventHandler(
'OnAfterSave'
,
array
(
$this
,
'switchToReader'
));
}
public
function
switchToWriter()
{
self::
$db
=Yii::app()->db;
return
true;
}
public
function
switchToReader()
{
self::
$db
=Yii::app()->msdb;
return
true;
}
//...
}
?>
|
在这个例子中,当需要执行数据提取或插入时,数据库的连接自动改变。使用switchToReader函数从SQL Server数据库获取数据,使用switchToWriter函数插入或保存数据到MySQL数据库中
http://www.uncletoo.com/html/yii/797.html