精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
近期开发一个自动进行排名的功能,根据学生的成绩进行排名,使用了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错误了。