【发布时间】:2011-10-24 17:30:23
【问题描述】:
我必须移植一个基于 LAMP 的项目,该项目使用 PHP-MSSQL 连接到 SQL Server 数据库。它必须移植到使用 PHP-SQLSRV 连接到 SQL Server 数据库的基于 WAMP 的机器上。
我可以通过执行存储过程来获取/设置数据。似乎大多数类型的输入变量都很容易上手。但我无法让bit 类型的输入参数工作。
我尝试在 PHP 中使用“真实”或“虚假”的各种值,但没有一个能让我摆脱错误:
-
“真实”的东西不起作用:
1"1"true"True"
-
“虚假”的东西不起作用:
0"0"false"False"
我尝试使用各种方法将项目添加到$params 数组,包括省略可选参数以及定义 PHP 和 SQL 数据类型。没有任何效果。
我来自 SQL Server(转换为 JSON 对象)的错误消息是:
[{
"0":"42000",
"SQLSTATE":"42000",
"1":8114,
"code":8114,
"2":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit.",
"message":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit."
}]
为了生成此错误消息,我传递了一个值 0 或 1,它们都不是 varchar 甚至是字符串。
为了保持最大的兼容性,我不想将存储过程更改为在 SQL Server 上转换/转换数据。我希望通过 PHP 保持存储过程不变。
PHP 代码:
<?php
$link = sqlsrv_connect($host,Array("Database"=>$database,"UID"=>$username,"PWD"=>$password));
$sql = " { call StoredProcedureName ( @input_param_of_bit_type=? ) } ";
$param1 = 1;
$params = Array(
Array(&$param1, SQLSRV_PARAM_IN)
);
$stmt = sqlsrv_prepare($link,$sql,$params);
if ($stmt===false) {
// handle error
print_r(sqlsrv_errors,true);
} else {
if (sqlsrv_execute($stmt)===false) {
// handle error. This is where the error happens
print_r(sqlsrv_errors,true);
} else {
// success! It never gets here, though.
}
}
?>
【问题讨论】:
-
可能必须修改查询以包含
CAST(0 AS BIT)以强制位数据类型。 -
@Marc B:实际的 SQL 查询位于 SQL Server 上的存储过程中。我想保持存储过程不变。
-
请发布调用 PHP,问题可能出在此处,特别是如果您正在参数化您的 proc 调用。
标签: php sql-server tsql stored-procedures