初学MySQL,想问一个问题,有劳各位。
做一个日志功能,对于每个系统都有两个表,一个Log表,一个Exception表。由于这两个表的表结构是一模一样的,只是表名不一样,于是乎想将表名作为参数传入。比如:
系统1有两个表,分别是:系统1_Log,系统1_Exception。
系统2有两个表,分别是:系统2_Log,系统2_Exception。
系统3有两个表,分别是:系统3_Log,系统3_Exception。
以此类推。对于系统1、2、3的Log表的字段和字段类型都是一模一样的,就想写一句SQL,将表名作为参数传递进去就OK。我写的SQL如下:
set @a = '`test`.`tbluser`';
set @t = concat('select * from ', @a, ' where `id` = 1');
prepare col from @t;
execute col;
deallocate prepare col;
这个语句在MySQL Workbench里面已经成功执行了。
不过在代码里面,使用Connector /.NET作为连接器使用的时候,将@a参数在C#代码里面定义好,但是,@t只是一个临时变量,不需要在C#代码里面定义,运行的时候,一直出错,错误说的是:请定义参数@t。弄了半天,实在不知道应该怎么定义这个参数@t才好。有劳各位了~~~
我这个参数

解决方案 »

  1.   

    我把declare也用了,还是报这个错。Message:Fatal error encountered during command execution.InnerException:{"Parameter '@t' must be defined."}
      

  2.   

    我是将SQL语句写在xml文件里面的,自己封装的访问方法,标准的MySQL语句执行完全没有问题。我的SQL代码如下:
    <DataCommand Name="GetUserFromMySQL">
        <CommandText>
            <![CDATA[
                SET @t = CONCAT('SELECT * FROM ', ?TableName, ' WHERE `ID` = ?ID');
                PREPARE col FROM @t;
                EXECUTE col;
                DEALLOCATE PREPARE col;
            ]]>
        </CommandText>
        <Parameters>
            <Parameter Name="?TableName" DbType="AnsiString" Size="100"/>
            <Parameter Name="?ID" DbType="Int32"/>
        </Parameters>
    </DataCommand>
    我的C#代码如下:
    [Test]
    public void Get()
    {
        var dm = new DataManager("GetUserFromMySQL");
        dm.SetParameters("TableName", "tbluser");
        dm.SetParameters("ID", 1);
        var result = dm.ExecuteEntity<UserInfo>();
    }