为什么vsql可以返回所有记录,而使用ODBC驱动程序的程序不能?

时间:2014-11-27 06:17:43

标签: odbc vertica unixodbc dbvisualizer

我对Vertica做了一个简单的测试:

ha=> insert into test(Name, City) values( 'Nan', 'Nanjing');
 OUTPUT 
--------
      1
(1 row)

ha=> select node_name, wos_row_count, ros_row_count from projection_storage where anchor_table_name = 'test';
   node_name   | wos_row_count | ros_row_count 
---------------+---------------+---------------
 v_ha_node0001 |             1 |             3
(1 row)

ha=> select * from test;
   ID   | Name |  City   
--------+------+---------
 250001 | Nan  | Nanjing
 250002 | Nan  | Nanjing
 250003 | Nan  | Nanjing
 250004 | Nan  | Nanjing
(4 rows)

select操作显示OK(WOSROS中的数据全部显示)。

然后我写了一个使用ODBC的简单程序:

ret = SQLExecDirect(stmt_handle, (SQLCHAR*)"select * from test", SQL_NTS);
if (!SQL_SUCCEEDED(ret))
{
    printf("Execute statement failed\n");
    goto ERR;
}

while ((ret = SQLFetch(stmt_handle)) == SQL_SUCCESS)
{
    row_num++;
}

printf("Row number is %d\n", row_num);

但结果是:

Row number is 3

它不会计算WOS中的数据。

DbVisualizer也显示3行数据:
VXTML

使用ODBC是否需要一些特殊选项?非常感谢提前!

1 个答案:

答案 0 :(得分:2)

默认情况下,vsql处于事务模式。只要你打开会话, vsql中,你就会看到你所期望的,就像你在交易中一样。

只要您的会话外部(odbc,dbvis),该交易就不会(现在)可见。要使其对其他会话可见,您需要发出' COMMIT;'在vsql里面。然后(如已确认),您可以从odbc和dbvis访问数据。

您可以使用

将您的交易(仅限vsql)设置为autocommit
\set AUTOCOMMIT on
-- disable with
\set AUTOCOMMIT off

要知道是否启用了自动提交,您可以使用show

show AUTOCOMMIT;
    name    | setting
------------+---------
 autocommit | off
(1 row)

您甚至可以使用--set autocommit=onvsql来电时进行此操作。这是一个好主意还是不是另一个问题。

ODBC允许您以不同方式设置自动提交,请参阅odbc doc