终于成功弄好了Access的连接,Sybase的连接也搞定了,但Sybase的连接出现
中文乱码,我在想如何解决字符集的问题。
DFP与Access的连接主要是Database的设置问题,其它的按正常的连接就可以了。
Database属性中的DatabaseName很多人以为是
数据库的名字,其实就是access或者是
Microsoft.Jet.OLEDB.4.0
那么有人要问了,数据库名称在什么地方写,告诉你,是在hostname中,还要注意格式和内容,我写的是(DATA SOURCE="d:/My Documents/Delphi
for PHP Projects/DelphiForPHP_Test/oil_new.mdb")不含括号!!!里面的数据库名称记得要改,至于用户名和密码,如果没有设置可以不填写。
DriverName的值就是ado_access,这个要写死。
整个分析的过程如下(分析过程就是通过对IE浏览器错误的输出中涉及的
文件进行跟踪。因为是数据库的问题,所以分析与数据库相关的文件类):
下面的方法就是数据库的连接方法(adodb.inc.php文件的419行)
复制内容到剪贴板
代码:
function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
{
if ($argHostname != "") $this->host = $argHostname;
if ($argUsername != "") $this->user = $argUsername;
if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons
if ($argDatabaseName != "") $this->database = $argDatabaseName;
$this->_isPersistentConnection = false;
if ($forceNew) {
if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
} else {
if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
/*注意:这里要调用另一个文件中的方法,断点设在这里,注意参数的值,可以使用watches窗口Add watcher来看。
*先将设置的值写在纸上,等分析完后面的方法后,就知道该填写什么内容了
*/
}
if (isset($rez)) {
$err = $this->ErrorMsg();
if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
$ret = false;
} else {
$err = "Missing extension for ".$this->dataProvider;
$ret = 0;
}
if ($fn = $this->raiseErrorFn)
$fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
$this->_connectionID = false;
if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
return $ret;
}上面的方法调用了下面的方法:(adodb-ado5.inc.php文件的第65行开始)
复制内容到剪贴板
代码:
function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '')
{
// two modes
// - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat
// - if $argProvider is not empty, then $argDBorProvider holds db
/*
*我们使用access的时候,我们是无法设置$argProvider,设置界面没有为它赋值的地方。
*/
if ($argProvider) {
$argDatabasename = $argDBorProvider;
} else {
$argDatabasename = '';
/*注意下面这句就是对$argProvider赋值,那么$argDBorProvider又是谁赋的值呢,仔细看它的值就是$databasename
*的值。这下你该知道如何设置databasename了吧,如果还不知道,往下看
*到这里,连接access应该是没有问题了,有问题的大家跟踪一下。
*跟踪过程中,比较容易犯的错是下断点后,一定要回到你写的单元按F9运行,否则你的程序会出现莫名其妙的问题。
*注意一定要回到你自己的单元,才按F9运行。
*/
if ($argDBorProvider) $argProvider = $argDBorProvider;
else $argProvider = 'MSDASQL';
}
try {
$u = 'UID';
$p = 'PWD';
if (!empty($this->charPage))
$dbc = new COM('ADODB.Connection',null,$this->charPage);
else
$dbc = new COM('ADODB.Connection');
if (! $dbc) return false;
/* special support if provider is mssql or access */
if ($argProvider=='mssql') {
$u = 'User Id'; //User parameter name for OLEDB
$p = 'Password';
$argProvider = "SQLOLEDB"; // SQL Server Provider
// not yet
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
//use trusted conection for SQL if username not specified
/**如果对上面的赋值还不清楚的,看到这句该明白了,databasename的内容。。。。。**/
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
} else if ($argProvider=='access')
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
if ($argProvider) $dbc->Provider = $argProvider;
/**$argDatabasename这个值也没法在界面上赋值,所以大家干脆直接把
*DATA SOURCE="d:/My Documents/Delphi for PHP Projects/DelphiForPHP_Test/oil_new.mdb"
*这句写到&argHostName中就可以了,而要写入这句,只需要对界面上的host赋值就可以了。
*目前我还没有查到为什么要这样设置,估计是为了兼容mssql而牺牲了access,毕竟用mssql的比较多,大家查查看,
*有时间真得要对全部的源码进行分析,这个地方的赋值很容易造成误会。
*/
if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename";
if ($argUsername) $argHostname .= ";$u=$argUsername";
if ($argPassword)$argHostname .= ";$p=$argPassword";
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
// @ added below for php 4.0.1 and earlier
@$dbc->Open((string) $argHostname);
$this->_connectionID = $dbc;
$dbc->CursorLocation = $this->_cursor_location;
return $dbc->State > 0;
} catch (exception $e) {
}
return false;
}