2
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Get_Next_Processing_Video`(   
    OUT out_IDVideo                   INT ,
    OUT out_YoutubeIDVideo            VARCHAR(15) 
)
BEGIN

    DECLARE a INT;
    DECLARE b VARCHAR(15);

    set a = 0;
    set b = "ciao";

    SELECT  NP.IDVideo, NP.YoutubeIDVideo INTO a, b 
    FROM    next_processing AS NP
    LIMIT 1; 

    UPDATE  Video AS V 
    SET     V.SchedulingFlag = TRUE
    WHERE   IDVideo = a;

SET out_IDVideo = a;
SET out_YoutubeIDVideo = b;

END

MySQL は次を返します。

ルーチン youtubedb.Get_Next_Processing_Video の OUT または INOUT 引数 1 は、BEFORE トリガーの変数または NEW 疑似変数ではありません。

何が問題ですか?コードは正しいようです。

これは、呼び出しプロシージャの C# コードです。

using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["AxWaveConnection"].ToString()))
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            MySqlCommand cmd = new MySqlCommand("Get_Next_Processing_Video", conn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("out_IDVideo", idVideo));
            cmd.Parameters.Add(new MySqlParameter("out_YoutubeIDVideo", youtubeId));

            try
            {
                cmd.ExecuteNonQuery();  
            }
            catch (Exception e)
            {

            }

            conn.Close();
        }
4

3 に答える 3

3

問題はプロシージャへの呼び出しにあると思います。

パラメータをサポートしていない MySQL コネクタのバージョンではOUT、通常の回避策は、MySQL ユーザー変数を使用して戻り値を保持し、クエリを実行してそれらの変数の値を取得することです。

まず、ストアド プロシージャを実行し、MySQL に OUT 引数の値を変数に入れさせます。

CALL `Get_Next_Processing_Video`(@IDVideo, @YoutubeIDVideo);

これらの変数はコマンド パラメータではないことに注意してください。これらは、MySQL セッションで保持される変数です。同じ MySQL 接続を使用して、プロシージャの呼び出し直後にこれらの変数の値を取得するには、次のようにします。

SELECT @IDVideo, @YoutubeIDVideo ;

そして、そのクエリからの結果セットを、1 行を返すことが期待される他の SELECT ステートメントと同じように処理します。


アップデート:

OUT パラメータをサポートする MySQL コネクタの最近のバージョンでは、メンバー属性を設定して、これらのパラメータが OUT パラメータであることを指定する必要があると思います。

cmd.Parameters["out_IDVideo"].Direction = ParameterDirection.Output;
cmd.Parameters["out_YoutubeIDVideo"].Direction = ParameterDirection.Output;

先に指摘した通り…

OUT パラメータをサポートしていない古いバージョンの MySQL コネクタでは、MySQL 変数を引数として使用してプロシージャを呼び出すことが回避策でした。プロシージャ コールから返された値は、MySQL セッションに保持されます。プロシージャを呼び出した直後に、SELECT を実行してユーザー変数の内容を取得します。

于 2013-01-29T15:58:41.233 に答える
0

ビルダー c++ からストアド プロシージャを呼び出してバッチ レコードを作成するという同じ問題に遭遇しました。

CREATE DEFINER=`root`@`localhost` PROCEDURE `article_import`(IN `idclient` INT(11) UNSIGNED, IN `code` VARCHAR(16), IN `shortdesc` VARCHAR(16),
                                        IN `descrip` VARCHAR(32),IN `status` VARCHAR(12), IN `fifo` SMALLINT(1), IN `maxfifo` SMALLINT(3),
                                        IN `flvduration` SMALLINT(3),IN `retendays` SMALLINT(3), IN `maxconserv` SMALLINT(3),
                                        IN `flcduration` SMALLINT(3), IN `flvunits` SMALLINT(1),IN `conservunits` SMALLINT(1),
                                        IN `flcunits` SMALLINT(1), IN `entrymode` SMALLINT(1), IN `exitmode` SMALLINT(1),
                                        IN `section` SMALLINT(1), IN `family` SMALLINT(1), IN `origen` SMALLINT(1), IN `mgroup` SMALLINT(1),
                                        IN `sgroup` SMALLINT(1), IN `invclass` SMALLINT(1), IN `created` DATE, INOUT `result` VARCHAR(64)) 
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
  GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
  SET result = CONCAT('KO:', @text,':',@errno);
END;

INSERT INTO articles_imp (`idclient`,`code`,`shortdesc`,`descrip`,`status`,`fifo`,`maxfifo`,`flvduration`,`retendays`,`maxconserv`,
                                        `flcduration`,`flvunits`,`conservunits`,`flcunits`,`entrymode`,`exitmode`,`section`,`family`,
                                        `origen`,`mgroup`,`sgroup`,`invclass`,`created`)
      VALUES  (idclient,code,shortdesc,descrip,status,fifo,maxfifo,flvduration,retendays,maxconserv,
                                        flcduration,flvunits,conservunits,flcunits,entrymode,exitmode,section,family,
                                        origen,mgroup,sgroup,invclass,created);
SET result = CONCAT('OK:inserted:',LAST_INSERT_ID());
END

MySql Connector/ODBC Data Source Configuration の [Debug] タブにある [ Log queries to... ] チェックボックスを設定して生成された myodbc.sql を調べたところ、成功した呼び出しと失敗した呼び出しの違いがわかりました。

1418923873:プリペアド ステートメントを使用しています。
1418923873: article_import(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? を呼び出す、?) ;
1418923873:ssps が実行されました。
1418923873:クエリが実行されました。

1418923873: コール article_import(355, '20804', '', 'ANCHOAS ACEITE TIRAS90GRS', '', 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, '2014-12-18', '') ;
1418923873:直接実行の使用;
1418923873:クエリが実行されました。
1418923873:ルーチン gedispa.article_import の OUT または INOUT 引数 24 は、BEFORE トリガーの変数または NEW 疑似変数ではありません。

Builder では、ADOStoredProc に Prepared 属性がありますが、true に設定しても違いはありませんでした。最後に、結果パラメーターを OUT パラメーターではなく INOUT パラメーターとして宣言し、それを修正しました。

ログなしでは何もありません。

于 2014-12-18T18:59:39.983 に答える