存储过程不 return 一个 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 class:
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 returns0,你有没有发现语法错误?
我是不是做错了什么?
我 90% 确定这是处理存储过程的问题,因为客户插入正确
更改此行
result = cmd.ExecuteNonQuery();
到
result = Convert.ToInt32(cmd.ExecuteScalar());
但是您还应该更改您的存储过程,因为它不是 return AUTO_INCREMENT
列 id_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,returns 只是您更改、添加或删除的行数,但您使用 ExecuteScalar,它 returns 存储过程执行的最后一个 SELECT 命令的第一行的第一列。 (就是 SELECT LAST_INSERT_ID())
此外,要完成答案,您实际上不需要存储过程来完成这种简单的工作。优点应该是最小的,而与要维护的不同软件相关的问题是不言而喻的。
您的 C# 代码可能是(删除了 DbConnection class 的用法,因为不清楚它的作用)
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 引擎的可能性,这意味着两个命令文本具有相同的 MySql命令,用分号分隔它们
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 class:
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 returns0,你有没有发现语法错误? 我是不是做错了什么?
我 90% 确定这是处理存储过程的问题,因为客户插入正确
更改此行
result = cmd.ExecuteNonQuery();
到
result = Convert.ToInt32(cmd.ExecuteScalar());
但是您还应该更改您的存储过程,因为它不是 return AUTO_INCREMENT
列 id_cliente
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,returns 只是您更改、添加或删除的行数,但您使用 ExecuteScalar,它 returns 存储过程执行的最后一个 SELECT 命令的第一行的第一列。 (就是 SELECT LAST_INSERT_ID())
此外,要完成答案,您实际上不需要存储过程来完成这种简单的工作。优点应该是最小的,而与要维护的不同软件相关的问题是不言而喻的。
您的 C# 代码可能是(删除了 DbConnection class 的用法,因为不清楚它的作用)
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 引擎的可能性,这意味着两个命令文本具有相同的 MySql命令,用分号分隔它们