0

これは私のストアド プロシージャで、ローカル マシンでは問題なく動作しますが、PRODUCTION では上記のエラーが表示されます。最後の OUT パラメータについて不平を言っています。

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_projects`(
        IN userName varchar(20),
        IN projectName text,
        IN projectDescription text,
        IN projectCurrency text,
        IN projectBudget1 double,
        IN projectBudget2 double,
        IN projectEndDate DATETIME,
        IN expectedDelivDate DATETIME,
        IN projectMessageForBidder text,
        OUT projectCode bigint)
BEGIN

DECLARE 
    l_project_code bigint;

        insert into projects
        (PROJECT_CODE,
         SR_USER_NAME ,
         PROJECT_NAME,
         PROJECT_DESCRIPTION,
         PROJECT_CURRENCY,
         PROJECT_BUDGET1 ,
         PROJECT_BUDGET2 ,
         PROJECT_STATUS,
         PROJECT_END_DATE,
         PROJECT_PAID,
         EXPECTED_DELIV_DATE,
         PROJECT_MESSAGE_FOR_BIDDER,
         PROJECT_CREATION_DATE,
         PROJECT_UPDATE_DATE)
        values
        (
         0,
         userName,
         projectName,
         projectDescription,
         projectCurrency,
         projectBudget1,
         projectBudget2,
         'Active',
         projectEndDate,
         null,
         expectedDelivDate,
         projectMessageForBidder,
         NOW(),
         NOW());

         SELECT LAST_INSERT_ID() into l_project_code;

         SET projectCode = l_project_code;
END

以下は、パラメーターを設定する私の C# コードです。

                MySqlCommand command = new MySqlCommand("insert_projects", dbcontroller.conn);
                command.CommandType = System.Data.CommandType.StoredProcedure;

                // Add parameters for the insert_projects STORED PROC
                command.Parameters.Add(new MySqlParameter("userName", SessionBag.Current.UserName));
                command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input;

                command.Parameters.Add(new MySqlParameter("projectCode", MySqlDbType.Int64));
                command.Parameters["@projectCode"].Direction = System.Data.ParameterDirection.Output;

                command.Parameters.Add(new MySqlParameter("projectName", model.projectName));
                command.Parameters.Add(new MySqlParameter("projectDescription", model.projectDescription));
                command.Parameters.Add(new MySqlParameter("projectCurrency", model.projectCurrency));
                command.Parameters.Add(new MySqlParameter("projectBudget1", model.projectBudget1));
                command.Parameters.Add(new MySqlParameter("projectBudget2", model.projectBudget2));
                command.Parameters.Add(new MySqlParameter("projectEndDate", model.projectEndDate));
                command.Parameters.Add(new MySqlParameter("expectedDelivDate", model.expectedDelivDate));
                command.Parameters.Add(new MySqlParameter("projectMessageForBidder", model.projectMessageForBidder));

                try
                {
                    command.ExecuteNonQuery();

                    TempData["projectCode"] = (Int64)command.Parameters["?projectCode"].Value;
                    TempData["frompage"] = "AddProject";

                    dbcontroller.conn.Close();
                    return RedirectToAction("MyProjectsHeaderSR", "Projects");
                }

なぜこれについて不平を言っているのですか?私のローカルマシンは正常に動作します。テーブル「projects」には、BIGINT auto-increment に設定された project_code というフィールドが含まれています。残りのフィールドは通常のデータ型です。

OK、変数を作成しました..そしてそれを..同じエラーに渡しました

            if (dbcontroller.DBConnection())
            {
                Int64 projectCode = 0;

                MySqlCommand command = new MySqlCommand("insert_projects", dbcontroller.conn);
                command.CommandType = System.Data.CommandType.StoredProcedure;

                // Add parameters for the insert_projects STORED PROC
                command.Parameters.Add(new MySqlParameter("userName", SessionBag.Current.UserName));
                command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input;

                command.Parameters.Add(new MySqlParameter("projectCode", projectCode));
                command.Parameters["@projectCode"].Direction = System.Data.ParameterDirection.Output;

それはまだ動作しません

4

1 に答える 1

0

あなたが説明するエラーは、MySQL 5.5.3で解決された古いバージョンの MySQL のバグの結果です。おそらく、ローカル マシンではバグが修正されたバージョンの MySQL が実行されており、運用サーバーでは古いバージョンが実行されています。

最善の解決策はサーバーをアップグレードすることかもしれませんが、それまでの回避策LAST_INSERT_ID()として、単に(変数ではなく結果セットに) を選択し、その結果を変数に処理するように手順を変更できます。

なお、パラメータを使用する場合にも同様の状況が発生する可能性がありINOUTます。パラメータを使用していますがOUT(したがって、あなたのケースでは以下は当てはまりません)、INOUTパラメータを設定する変数を提供していない場合、以下が同様に適用されます。

この線:

command.Parameters.Add(new MySqlParameter("projectCode", MySqlDbType.Int64));

...コマンドオブジェクトに名前付きパラメーターとタイプを提供していますが、入力するものは何も提供していません。パラメータを使用している場合はINOUT、空の変数を指定して渡す必要があります。SPに出力先を提供します。

于 2012-08-03T10:36:50.607 に答える