c#调用mysql存储过程insert新记录(没抛任何异常)后,select不到新记录,但是自增列的值已经+1了,就是select不到,不知道为什么?哪位大侠知道。

解决方案 »

  1.   

    很显然你的程序有问题,或者存储过程有问题。可是怎么继续分析呢?猜是很难猜中的。 建议你贴出你的相关代码。可以做如下检测。1。直接在MYSQL命令行工具中,测试一下你的这个存储过程,以确认存储过程正确。
    2。打开MYSQL的一般查询日志,(如果没有打开),看一下实际提交到数据库中的命令是什么?以断定故障在程序还是服务器。可以原因, 字符集问题。
      

  2.   

    我是楼主。
    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();  
    ENDc#调用代码如下:(测试程序)
     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)
                {
                    
                }
      

  3.   

    估计是字符集问题。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  4.   

    select不到新记录:解释一下,代码基本可以了
      

  5.   

    我是楼主。
    字符集问题,应该有乱码写入啊。
    另外,(1)在navicat工具中测试时,测试过字符问题,可以写入汉字,无乱码。
          (2)c#程序insert数据时(直接语句写入,不是调用存储过程),也可以写入汉字,无乱码。
    不过,我再测试一下,调用存储过程不传汉字看看。呵呵
      

  6.   


    存储过程中有:
    insert into login_log_tb.....
    c#调用后,select * from login_log_tb。没新数据。
      

  7.   

    呵呵,不知道在你的SP中是否有COMMIT,你开启了事务
      

  8.   

    没有COMMIT,但没禁止autocommit。不过我还是set一下看看。
    另外,我在navicat工具中单独测试过这个存储过程,可以写入数据。c#调就select不出来。
      

  9.   

    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.
      

  10.   


    就是这个问题。
    但是我有几点不明白,第一次接触mysql,呵呵。
    1.为什么用客户端工具navicat调用时可以?
    2.为什么自增列+1了?
      

  11.   

    1、估计在navicat中将AUTOCOMMIT设为自动了;
    2、按道理讲,如果没有COMMIT,自增字段不会加1,要看看MYSQL的源码才行。
      

  12.   

    WWWWA,不好意思,没给你分。很抱歉啦
      

  13.   

    插入后备回滚了。原因有二:
    一:插入代码本身就造成了出错导致的回滚。
    二:你用了事务,如果你没有COMMIT的话,同样会造成数据没有被提交。
    在你的C#代码中的catch{}里加上异常信息输出语句,看看问题究竟是不是由于原因一造成的,若不是就是原因二了。