2011-03-08 14 views
0
#include <iostream> 
#include <mysql++.h> 
using namespace std; 

int main() { 
    // Get database access parameters from command line 
    const char* db = "enet", *server = "192.168.1.108", *user = "root", *pass = 
      "123456"; 
    // Connect to the sample database. 
    mysqlpp::Connection conn(false); 
    conn.set_option(new mysqlpp::MultiStatementsOption(true)); 
    if (conn.connect(db, server, user, pass)) { 
     mysqlpp::Query query = conn.query(); 
     query << "call CreateTable('test1', 'generic', 0, 1, 2, 3,4,5,6,7,8,9,10,NOW());"; 
     query.execute(); 
     query.reset(); 

     query << "call CreateTable('test2', 'generic', 0, 1, 2, 3,4,5,6,7,8,9,10,NOW());"; 
     query.execute(); 
     query.reset(); 

     return 0; 
    } else { 
     cerr << "DB connection failed: " << conn.error() << endl; 
     return 1; 
    } 

    return 0; 
} 

我想用mysql ++查询来执行过程“CreateTable”多次,并且我重置查询在最后,但不管怎么样,只是第一个查询有效,最后一个没有,我的问题是: 如何使所有的查询工作?如何重新使用MySQL ++查询对象来调用多个存储过程?

-- create table -- 
delimiter $$ 
drop procedure if exists CreateTable $$ 
create procedure CreateTable(
    IN tableName VARCHAR(20), 
    IN dbName VARCHAR(20), 
    IN INT_RegDevID INTEGER, 
    IN Dec_Long DECIMAL(24,16), 
    IN Dec_Lat DECIMAL(24,16), 
    IN Dec_Height DECIMAL(10,6), 
    IN Dec_Direction DECIMAL(10,6), 
    IN AverageSpeed DECIMAL(10,6), 
    IN Dec_Base VARCHAR(10), 
    IN MCC INTEGER, 
    IN MNC INTEGER, 
    IN LAC INTEGER, 
    IN CI INTEGER, 
    IN Dec_LocaDate TIMESTAMP) 
-- ------------------------------------------------------------------------------- 
-- ------------------------------------------------------------------------------- 
begin 
    -- the test variable 
    -- Warning: the encoding can result many problem!!! 
    declare varTableName VARCHAR(32) default NULL; 
    set @varTableName = NULL; 
    set @table_prefix = "posinfo_"; 
    set @table_params = "(
      `Int_LocaID` int(11) NOT NULL auto_increment, 
      `INT_RegDevID` int(11) NOT NULL default '0', 
      `Dec_Long` decimal(24,16) NOT NULL default '0.0000000000000000', 
      `Dec_Lat` decimal(24,16) NOT NULL default '0.0000000000000000', 
      `Dec_Height` decimal(10,6) NOT NULL default '0.000000', 
      `Dec_Direction` decimal(10,6) NOT NULL default '0.000000', 
      `Dec_ MaxSpeed` decimal(10,6) NOT NULL default '0.000000', 
      `Dec_ MinSpeed` decimal(10,6) NOT NULL default '0.000000', 
      `AverageSpeed` decimal(10,6) NOT NULL default '0.000000', 
      `Var_PosInfo` varchar(50) character set latin1 NOT NULL default '', 
      `Var_Remark` varchar(200) character set latin1 NOT NULL default '', 
      `Date_LocaDate` timestamp NOT NULL default CURRENT_TIMESTAMP, 
      `Dec_Base` varchar(10) character set latin1 NOT NULL, 
      `MCC` int(11) NOT NULL COMMENT '', 
      `MNC` int(11) NOT NULL COMMENT '', 
      `LAC` int(11) NOT NULL COMMENT '', 
      `CI` int(11) NOT NULL COMMENT '', 
      PRIMARY KEY (`Int_LocaID`) 
     ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=gbk;"; 
    set @varCreate = CONCAT("create table ", dbName,".",@table_prefix, tableName, @table_params); 
    -- the insert operation 
    set @insertOperation = CONCAT("insert into ", dbName,".",@table_prefix, tableName, 
     "(INT_RegDevID,Dec_Long,Dec_Lat,Dec_Height,Dec_Direction,AverageSpeed, 
     Dec_Base,MCC,MNC,LAC,CI,Date_LocaDate) values(",INT_RegDevID,",",Dec_Long, 
     ",",Dec_Lat,",",Dec_Height,",",Dec_Direction,",",AverageSpeed,",",Dec_Base, 
     ",",MCC,",",MNC,",",LAC,",",CI,",NOW())"); 
    -- find the target table 
    -- Look care about the "' '" ! 
    set @getTargetTable = CONCAT("select TABLE_NAME into @varTableName from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='", 
     dbName, "' and TABLE_NAME='", @table_prefix, tableName,"'"); 

    -- ------------------------------------------------------------------------------- 
    -- ------------------------------------------------------------------------------- 
    PREPARE getTargetTable from @getTargetTable; 
    execute getTargetTable; 
    select @varTableName; 
    set varTableName = @varTableName; 

    if varTableName is NULL then 
     -- create new table 
     PREPARE newTable 
     from @varCreate; 
     execute newTable; 
     -- do insert operation 
     PREPARE insertOperation 
     from @insertOperation; 
     execute insertOperation; 

    else 
     -- do insert operation 
     PREPARE insertOperation 
     from @insertOperation; 
     execute insertOperation; 
    end if; 

end $$ 
delimiter ; 

以上是程序。

+0

这是什么意思“它不工作”? – 2011-03-08 07:03:19

+0

这意味着,代码只是创建表'test1',表'test2'丢失,为什么? – liunx 2011-03-08 07:49:01

回答

1

有几种错误的位置:

  1. 您关闭了异常(conn(false)),但你也不能为错误代码检查返回值。您的第二个​​呼叫失败,但没有询问Query对象为什么,您正在失明。尽管如此,我认为它允许MySQL ++抛出异常(conn())并将整个事件包装在try块中,而不是将错误检查添加到所有MySQL ++调用中。

  2. 您不需要MultiStatementsOption就可以按照您当前显示的方式进行操作。你在这里有两个单独的陈述,而不是一个复合陈述。结合分号可能会让MySQL感到困惑,这就是为什么第二次调用失败的原因。

    mysql命令行工具需要分号来终止SQL语句,但是当使用数据库API(如MySQL ++)时,它们只需要分隔多个语句。

    您可以将两个CREATE语句组合成一个字符串(和一个​​),或者可以删除分号和MultiStatementsOption

  3. reset()查询之间的调用自从MySQL ++ 2. x以来没有必要。该方法仍然可用的唯一原因是,如果要重用已用于模板查询的Query对象,则有必要;他们是唯一仍然不能自动重置的类型,原因相当明显。

+0

非常感谢您的提示! – liunx 2011-03-09 01:38:15

相关问题