簡體   English   中英

存儲過程不返回int值

[英]Stored procedure doesn't return an int value

MySql過程代碼:

CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_CreateCliente`(IN nome_cliente VARCHAR(45))
BEGIN
    Select 20;
    INSERT INTO clienti ( nome_cliente )
    VALUES ( nome_cliente );
    Select id_cliente from clienti;
END

控制器頁面中的C#代碼:

ClienteInfo CI = new ClienteInfo();
DboUser objdbo = new DboUser();
int id_cliente = 0;

CI.nome_cliente = txtNomeCliente.Text;

id_cliente = objdbo.CreateClienteInfo(CI);

DboUser類別:

public int CreateClienteInfo(ClienteInfo CI)
{
        int result;
        MySqlConnection conn = new MySqlConnection();
        DbConnection db = new DbConnection();
        conn = db.ConnessioneDb();

        MySqlCommand cmd = new MySqlCommand(Costanti.StoredProcedures.USP_CreateCliente, conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@nome_cliente", CI.nome_cliente);

        result = cmd.ExecuteNonQuery();
        conn.Close();
        return result;
    }

我希望我的C#代碼在將其ID插入數據庫后檢索其客戶ID,因此我可以將其保存到會話中,稍后再在將打印包含客戶信息的文檔的頁面中再次檢索它。

我的id_cliente返回0,您是否注意到任何語法錯誤? 我做錯什么了嗎?

我有90%的決心要解決存儲過程中的問題,導致客戶正確插入

更改此行

result = cmd.ExecuteNonQuery();

result = Convert.ToInt32(cmd.ExecuteScalar());

但您還應該更改存儲過程,因為它不會返回AUTO_INCREMENTid_cliente為您生成的最后一個id

CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_CreateCliente`(IN nome_cliente VARCHAR(45))
BEGIN
    INSERT INTO clienti ( nome_cliente ) VALUES ( nome_cliente );
    Select LAST_INSERT_ID();
END

在MySql中,要獲取生成的auto_increment值,可以使用LAST_INSERT_ID() ,接下來,您的C#代碼不需要使用ExecuteNonQuery,該函數僅返回您已更改,添加或刪除的行數,但是您可以使用ExecuteScalar它返回由您的存儲過程執行的最后一個SELECT命令的第一行的第一列。 (這是SELECT LAST_INSERT_ID())

同樣,要完成答案,您實際上不需要這種簡單工作的存儲過程。 優點應該是最小的,而與要維護的另一軟件相關的問題是顯而易見的。

您的C#代碼可能是(刪除了DbConnection類的用法,因為尚不清楚它的作用)

public int CreateClienteInfo(ClienteInfo CI)
{

    int result;
    string cmdText = @"INSERT INTO clienti ( nome_cliente ) VALUES ( nome_cliente );
                       Select LAST_INSERT_ID();";

    using(MySqlConnection conn = new MySqlConnection(....connectionstring .....))
    using(MySqlCommand cmd = new MySqlCommand(cmdText, conn);
    {
        conn.Open()
        cmd.Parameters.AddWithValue("@nome_cliente", CI.nome_cliente);
        result = Convert.ToInt32(cmd.ExecuteScalar())
        return result;
    }
}

在這里,您可以將批處理命令傳遞到MySql引擎,這意味着兩個具有相同MySqlCommand的命令文本以分號分隔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM