私のCIアプリケーションmssql
データベースを照会するように設定しました。私はstored procedure
をactive record
から実行したいと思います。しかし、私は確かなドキュメントを手に入れることはできません。CodeIgniterのActive Recordクラスからストアドプロシージャを呼び出す
CodeIgniter
および/またはActive Record
のストアドプロシージャを呼び出してパラメータを渡す経験がある人はいますか?
おかげで、
ビリー
私のCIアプリケーションmssql
データベースを照会するように設定しました。私はstored procedure
をactive record
から実行したいと思います。しかし、私は確かなドキュメントを手に入れることはできません。CodeIgniterのActive Recordクラスからストアドプロシージャを呼び出す
CodeIgniter
および/またはActive Record
のストアドプロシージャを呼び出してパラメータを渡す経験がある人はいますか?
おかげで、
ビリー
はい、お使いのモデルでこれを試してみてください。あなたはトラブル時に1以上のストアドプロシージャを呼び出すことが発生した場合は
$this->db->query("call {storedprocedure function name} ");
は、私は/システム/データベースにクラスCI_DB_mysqli_driverに以下の機能を追加した
/* 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);
}
}
}
次の行を追加する必要があります
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); } } }
を/drivers/mysqli/mysqli_driver.phpとプロシージャ・コールの後にそれを使用
パラメータを持っているあなたのストアドプロシージャを呼び出すための$this->db->free_db_resource();
のおかげで、単に方法は、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();
}
あなたが動作しない場合がありquery('CALL procedureName($param1,$params,....)')
のように「CALL」を使用して、MSSQLまたはストアドプロシージャとSQLSRVとCodeIgniterのそれ以降のバージョンを使用している場合。 MSSQL利用の場合
:あなたはドライバーのためのいくつかの定数をオンにする必要がありますいくつかのケースで
$this->db->query('EXEC procedureName')
OR
$this->db->query('EXEC procedureName $param1 $param2 $param3,...')
。この場合、通常のクエリを実行する前に
$this->db->query('Set MSSQL constant ON)
を実行してください。
これは上記の回答からの少しの変更です。あなたは/system/database/drivers/mysqli/mysqli_driver.phpでCodeIgniterの3位にこのコードを使用している場合:
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));
}
を他の人がここで提案のようにそれからちょうど関数を呼び出します。
パーフェクト。複数のレコードがない場合、上記の関数はエラーをスローする可能性があります。これは正確に動作します。ありがとう –
ヒントありがとう! – iamjonesy
ありがとう、私はほとんど5時間この問題を把握するために無駄に、最終的に私は正しい場所を得た。オブジェクトを解放する関数を呼び出すためのコードにいくつか間違いがありましたが、 "$ this-> db-> freeDBResource($ this-> db-> conn_id);"を変更しました。 "$ this-> freeDBResource($ this-> db-> conn_id);"それは完璧に働いた –