存储过程不返回int值

时间:2015-01-14 11:03:50

标签: c# mysql select stored-procedures return

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_cliente返回0,您是否注意到语法错误? 我做错了吗?

我90%确定处理存储的操作难度很大,导致客户插入正确

1 个答案:

答案 0 :(得分:2)

更改此行

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的命令集用分号分隔它们