在我的 CI应用程序设置中查询mssql
数据库。我想从stored procedure
执行active record
。但我无法掌握任何可靠的文件。
有没有人有使用CodeIgniter
和/或Active Record
调用存储过程并传入参数的经验?
谢谢,
比利
答案 0 :(得分:14)
是的,请在您的模型中尝试此操作。
$this->db->query("call {storedprocedure function name} ");
如果您在一次调用多个存储过程时遇到问题,则需要添加以下行
/* ADD THIS FUNCTION IN SYSTEM/DATABASE/DB_ACTIVE_REC */
/* USAGE $this->db->freeDBResource($this->db->conn_id); */
function freeDBResource($dbh){
while(mysqli_next_result($dbh)){
if($l_result = mysqli_store_result($dbh)){
mysqli_free_result($l_result);
}
}
}
答案 1 :(得分:3)
如果您使用带有mssql的更高版本的codeigniter或带有存储过程的sqlsrv,则使用query('CALL procedureName($param1,$params,....)')
中的“CALL”可能无效。
在使用MSSQL的情况下:
$this->db->query('EXEC procedureName')
OR
$this->db->query('EXEC procedureName $param1 $param2 $param3,...')
在某些情况下,您可能需要为驱动程序启用一些常量。在这种情况下运行:
$this->db->query('Set MSSQL constant ON )
在运行常规查询之前。
答案 2 :(得分:1)
我已将以下功能添加到/system/database/drivers/mysqli/mysqli_driver.php中的类CI_DB_mysqli_driver
function free_db_resource() { while(mysqli_next_result($this->conn_id)) { if($l_result = mysqli_store_result($this->conn_id)) { mysqli_free_result($l_result); } } }
并在程序调用
后使用它$this->db->free_db_resource();
答案 3 :(得分:1)
调用具有参数的存储过程的简单方法是使用Codeigniter的数据库库提供的query()方法。
在你的模特中: -
function call_procedure(){
$call_procedure ="CALL TestProcedure('$para1', '$para2', @para3)";
$this->db->query($call_procedure);
$call_total = 'SELECT @para3 as Parameter3';
$query = $this->db->query($call_total);
return $query->result();
}
答案 4 :(得分:1)
这是对上述答案的一点修改。如果您使用的是codeigniter 3,请将此代码放在/system/database/drivers/mysqli/mysqli_driver.php中:
function free_db_resource()
{
do
{
if($l_result = mysqli_store_result($this->conn_id))
{
mysqli_free_result($l_result);
}
}
while(mysqli_more_results($this->conn_id) && mysqli_next_result($this->conn_id));
}
然后像这里建议的其他人一样调用该函数。
答案 5 :(得分:0)
public function callSp_model{
$sql = "CALL Materialwise_PURC_report(?,?,?)";
$query = $this->lite_db->query($sql,array($supplierid,$fromdate,$todate));
return $query->result_array(); }