锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / Fatal error encountered during command execution问题解决办法和过程分析
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

Fatal error encountered during command execution问题解决办法和过程分析

背景

近期开发一个自动进行排名的功能,根据学生的成绩进行排名,使用了mysql的复杂SQL语句进行自动生成排名,SQL语句如下:

UPDATE (SELECT @a := @a + 1 AS rn, E_ID, E_Score FROM 
( select * from exambase where gradeclassshortname=sname and E_ID>=imin and E_ID<=imax ORDER BY E_Score desc ) h, 
(SELECT @a := 0 ) t ) t1, exambase t2 SET t2.classrank= t1.rn WHERE t2.E_ID = t1.E_ID;

在C#的代码里,用string.Format构造好SQL语句执行时,报如下异常:

Fatal error encountered during command execution

把语句检查再三,没发现错误啊,并且放在mysql的连接软件Workbench里执行,也没问题啊!觉得非常奇怪。

过程分析

我们都知道代码里的SQL语句不是直接发给服务器执行的,中间要经过ODBC、ADO.NET、JDBC或类似数据库连接工具接口才发到数据库里去执行,返回的结果也要通过接口给代码EXE,如果在代码EXE上不能执行,就放mysql服务器端执行,服务器端有函数和存储过程,我选择了存储过程,存储过程语句如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `examrank`(in sname varchar(64),in imin int,in imax int)
BEGIN
UPDATE (SELECT @a := @a + 1 AS rn, E_ID, E_Score FROM ( select * from exambase where gradeclassshortname=sname and E_ID>=imin and E_ID<=imax ORDER BY E_Score desc ) h, (SELECT @a := 0 ) t ) t1, exambase t2 SET t2.classrank= t1.rn WHERE t2.E_ID = t1.E_ID; END

C#的调用代码如下:

para= new MySqlParameter[2];
para[0] = new MySqlParameter("?imin", MySqlDbType.Int32);
para[0].Value = startid;
para[1] = new MySqlParameter("?imax", MySqlDbType.Int32);
para[1].Value = endid;
DbHelperMySQL.ExecuteProcedure("examgraderank", para);

ExecuteProcedure代码如下:

 public static int ExecuteProcedure(string SQLString, params MySqlParameter[] cmdParms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
try
{
PrepareCommand(cmd, connection, null, SQLString, cmdParms,CommandType.StoredProcedure);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (MySql.Data.MySqlClient.MySqlException e)
{
throw e;
}
}
}
}

解决办法

使用了存储过程,就没有Fatal错误了。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内