【问题标题】:MySQL Stored Procedure: Works manually & not with C#MySQL 存储过程:手动工作,不使用 C#
【发布时间】:2016-08-08 14:24:26
【问题描述】:

我是第一次使用存储过程。我很难弄清楚这背后的问题。 如果我从 PhpMyAdmin 手动执行存储过程,它工作正常。但是当我将它与 C# 程序一起使用时。它显示错误。

存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `Save`(INOUT `id` INT, IN `cId` INT, IN `date` DATE, IN `randomNum` INT, IN `debitAmount` VARCHAR(20), IN `descr` VARCHAR(255))
NO SQL

BEGIN
INSERT INTO dc (status, dcDate, clientId) VALUES ('1', date, cId);
SET id = last_insert_id();

INSERT INTO bill (dcId, clientId, billDate, referenceNo) VALUES (
    id,
    clientId,
    date,
    randomNum
);

INSERT INTO ledger (clientId, debit, ledgerDate, description, dcId, referenceNo) 
VALUES (
    cId,
    debitAmount,
    date,
    descr,
    id,
    randomNum
);


SELECT @id;

END

当我使用这些参数执行此过程时:

var reader = connection.StoredProcedureInOut("Save", new String[] { "0", theDate, clientId, randomNumber.ToString(), totalDebit.ToString(), description }, new String[] { "id", "date", "cId","randomNum", "debitAmount", "descr" });            

定义是:

 public MySqlDataReader StoredProcedureInOut(String procedureName, String[] values, String[] keys)
    {
        openConnection();
        MySqlDataReader reader;
        try
        {
            MySqlCommand cmd = new MySqlCommand(procedureName, connection);
            cmd.CommandType = CommandType.StoredProcedure;
            for (int i = 0; i < values.Length; i++)
            {
                cmd.Parameters.AddWithValue("@" + keys[i], values[i]);

            }
            reader = cmd.ExecuteReader();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            reader = null;
        }
        return reader;
    }

我收到这条消息:

OUT or INOUT argument 1 for routine noorani.Save is not a variable or NEW pseduo-variable in Before trigger

【问题讨论】:

标签: c# mysql stored-procedures


【解决方案1】:

通过修改代码解决了这个问题:

var reader = connection.StoredProcedureInOut("Save", new String[] {theDate, clientId, randomNumber.ToString(), totalDebit.ToString(), description }, new String[] {"date", "cId","randomNum", "debitAmount", "descr" }, new String[] {"id"});            

定义:

public String[] StoredProcedureInOut(String procedureName, String[] values, String[] keys, String[] outputParameters)
    {
        openConnection();
        String[] newlyInsertedID = new String[outputParameters.Length];
        try
        {
            MySqlCommand cmd = new MySqlCommand(procedureName, connection);
            cmd.CommandType = CommandType.StoredProcedure;

            for (int i = 0; i < outputParameters.Length; i++)
            {
                cmd.Parameters.AddWithValue("@" + outputParameters[i], "0");
                var parameterName = "@"+outputParameters[i];
                cmd.Parameters[parameterName].Direction = ParameterDirection.Output;
            }

            for (int i = 0; i < values.Length; i++)
            {
                cmd.Parameters.AddWithValue("@" + keys[i], values[i]);
                var parameterName = "@" + keys[i];
                cmd.Parameters[parameterName].Direction = ParameterDirection.Input;
            }
            //reader = cmd.ExecuteReader();
            cmd.ExecuteNonQuery();
            for(int i = 0; i < outputParameters.Length; i++)
            {
                var parameterName = "@"+outputParameters[i];

                newlyInsertedID[i] = cmd.Parameters[parameterName].Value.ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            //reader = null;
        }
        closeConnection();
        return newlyInsertedID;
    }

代码中缺少的是方向。此外,这是可以为所有类型的 Out/InOut 存储过程执行的通用代码。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多