c#调用mysql存储过程写数据问题

liqiang8 2010-02-26 03:39:11
c#调用mysql存储过程insert新记录(没抛任何异常)后,select不到新记录,但是自增列的值已经+1了,就是select不到,不知道为什么?哪位大侠知道。
...全文
274 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
老哥讲数据库 2010-02-26
  • 打赏
  • 举报
回复
插入后备回滚了。原因有二:
一:插入代码本身就造成了出错导致的回滚。
二:你用了事务,如果你没有COMMIT的话,同样会造成数据没有被提交。
在你的C#代码中的catch{}里加上异常信息输出语句,看看问题究竟是不是由于原因一造成的,若不是就是原因二了。
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
WWWWA,不好意思,没给你分。很抱歉啦
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
解决啦,感谢大家了,以后继续请教你们。
wwwwb 2010-02-26
  • 打赏
  • 举报
回复
1、估计在navicat中将AUTOCOMMIT设为自动了;
2、按道理讲,如果没有COMMIT,自增字段不会加1,要看看MYSQL的源码才行。
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
引用 12 楼 wwwwb 的回复:
MTSQL HELP:
To disable autocommit mode for a single series of statements, use the START TRANSACTION statement:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.


就是这个问题。
但是我有几点不明白,第一次接触mysql,呵呵。
1.为什么用客户端工具navicat调用时可以?
2.为什么自增列+1了?
wwwwb 2010-02-26
  • 打赏
  • 举报
回复
MTSQL HELP:
To disable autocommit mode for a single series of statements, use the START TRANSACTION statement:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
引用 9 楼 wwwwb 的回复:
呵呵,不知道在你的SP中是否有COMMIT,你开启了事务

没有COMMIT,但没禁止autocommit。不过我还是set一下看看。
另外,我在navicat工具中单独测试过这个存储过程,可以写入数据。c#调就select不出来。
ACMAIN_CHM 2010-02-26
  • 打赏
  • 举报
回复
引用
2。打开MYSQL的一般查询日志,(如果没有打开),看一下实际提交到数据库中的命令是什么?以断定故障在程序还是服务器。
wwwwb 2010-02-26
  • 打赏
  • 举报
回复
呵呵,不知道在你的SP中是否有COMMIT,你开启了事务
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
存储过程不传汉字也不行
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
引用 5 楼 wwwwb 的回复:
select不到新记录:解释一下,代码基本可以了


存储过程中有:
insert into login_log_tb.....


c#调用后,select * from login_log_tb。没新数据。
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
我是楼主。
字符集问题,应该有乱码写入啊。
另外,(1)在navicat工具中测试时,测试过字符问题,可以写入汉字,无乱码。
(2)c#程序insert数据时(直接语句写入,不是调用存储过程),也可以写入汉字,无乱码。
不过,我再测试一下,调用存储过程不传汉字看看。呵呵
wwwwb 2010-02-26
  • 打赏
  • 举报
回复
select不到新记录:解释一下,代码基本可以了
ACMAIN_CHM 2010-02-26
  • 打赏
  • 举报
回复
估计是字符集问题。

http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
liqiang8 2010-02-26
  • 打赏
  • 举报
回复
我是楼主。
1.在navicat工具中测试过存储过程,一切正常。
2.用c#调用存储过程。

存储过程代码:(以in开头的为输入参数;以out开头的为输出参数)
BEGIN
#out_log_code。-1为异常情况;大于0为返回的正确值
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
set out_log_code=-1;
start transaction;
insert into login_log_tb(game_id,server_name,account,user_password,login_ip) values (in_game_id,in_server_name,in_account,in_user_password,in_login_ip);#记录日志

set out_log_code=LAST_INSERT_ID();
END

c#调用代码如下:(测试程序)
try
{
string connStr = System.Configuration.ConfigurationManager.AppSettings.Get("MySqlString").ToString().Trim();
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = new MySqlCommand("sp_insert_login_log", conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("in_game_id", 1);
cmd.Parameters.AddWithValue("in_server_name", "存储过程");
cmd.Parameters.AddWithValue("in_account", "liqiang");
cmd.Parameters.AddWithValue("in_user_password", "pwd");
cmd.Parameters.AddWithValue("in_login_ip", 1234567890);

MySqlParameter outPara = new MySqlParameter("?out_log_code", MySqlDbType.Int32);
outPara.Direction = ParameterDirection.Output;

cmd.Parameters.Add(outPara);
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{

}
WWWWA 2010-02-26
  • 打赏
  • 举报
回复
SP代码,怎么调用sp?
ACMAIN_CHM 2010-02-26
  • 打赏
  • 举报
回复
很显然你的程序有问题,或者存储过程有问题。

可是怎么继续分析呢?猜是很难猜中的。 建议你贴出你的相关代码。

可以做如下检测。

1。直接在MYSQL命令行工具中,测试一下你的这个存储过程,以确认存储过程正确。
2。打开MYSQL的一般查询日志,(如果没有打开),看一下实际提交到数据库中的命令是什么?以断定故障在程序还是服务器。

可以原因, 字符集问题。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧