set @Id := 9;select * from `table` WHERE `Id`=@Id;该句在mysql中执行正确。
但是用.net封装的数据库对象执行就出现异常:
cmd.commandtext = sql语句;
cmd.commandtype = commandtype.text;
cmd.ExecuteScalar();//这样的话在执行的时候会出错。
异常信息为:at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
  at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
  at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
  at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
  at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
  at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)ps,mssql类似的有变量的sql语句通过.net是可以执行成功的,但是mysql有变量的查询在.net中却不能执行成功,是不是.net不支持mysql包含变量的sql语句啊?!

解决方案 »

  1.   

    奇怪的是 我在mysql数据库中运行是通过的,但是到.net里面就出现问题,这是什么原因呢?
      

  2.   

    你试试 
    select 1; select 1;是否能够执行,估计是不允许执行多条语句。
      

  3.   

    select 1; select 1;是可以执行的。什么原因呢?》?》!
      

  4.   

    那试一下 set @Id=9;select @Id;
      

  5.   

    cmd.ExecuteScalar()
    估计你得用cmd.ExecuteReader()
      

  6.   


    cmd.Text = "set @Id=9;select @Id;";
    cmd.ExecuteReader();还是报那个异常!!!
      

  7.   


    问个问题,如果这个代码只是抛砖引玉的话,那么两种可能:
    1 前面计算Id的代码太复杂,仍然有两种可能:
     a) 数据库可能要重新设计,简化计算过程
     b) 一定不能存储过程的话,相关计算过程请放入.net代码中2 就是简单的select * from `table` WHERE `Id`= 变量的话,SqlCommand+SqlParameter要做的事情,何必使用mysql变量
    BTW,个人不是太喜欢存储过程,但不完全排斥。这与能否迁移无关,只是存储过程不能用到好的API,不能使用缓存、多线程等优化手段。而且,我深信,好的效率更多是在设计表结构的时候就决定了的,靠存储过程替代程序代码,优化不了多少性能。
      

  8.   

    受教!
    其实我就是感觉奇怪而已,sqlserver的语句在.net中可以运行的,但是mysql的语句在.net中不能运行了,仅此而已,我只是想弄清楚为什么有的mysql语句在mysql库中执行是可以的,但是到了.net中就不行了。
    再次感谢你的讲解。
      

  9.   

    .net和sqlserver是一家人  兼容性当然最好