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

Posted

技术标签:

【中文标题】为啥 vsql 可以返回所有记录,而使用 ODBC 驱动程序不能?【英文标题】:Why does vsql can return all the records, while program using ODBC driver can't?为什么 vsql 可以返回所有记录,而使用 ODBC 驱动程序不能? 【发布时间】:2014-11-27 06:17:43 【问题描述】:

我对@9​​87654322@做了一个简单的测试:

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(WOSROSall 中的数据显示)。

然后我写了一个使用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行数据:

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

【问题讨论】:

你提交交易了吗? @Kermit:我不使用事务。我可以看到来自vsql客户端的数据。 @NanXiao 交易默认开启。在 vsql 中,只要您不退出会话,您就会在默认事务中,并且会看到您刚刚插入的数据。作为一个非常简单的确认(或确认),请执行与您的问题相同的操作,但输入“COMMIT;”在 vsql 之前 运行您的 odbc 或 dbvis 测试。然后我们就可以肯定地排除交易了。 @Guillaume:哦,是的。使用 'COMMIT;' 后在 vsql 中,我的 odbc 和 dbvis 都可以看到数据。所以看来我的vsql默认不提交事务。如何检查 vsql 是否启用commit transaction by default?使用\h 命令后,我找不到一些信息。提前致谢! 【参考方案1】:

默认情况下,vsql 处于事务模式。只要您保持会话打开,inside 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)

您甚至可以在您的 vsql 通话中使用 --set autocommit=on 进行此操作。这是一个好主意还是不是另一个问题。

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

【讨论】:

你在回答 Vertica 问题时我还在睡觉。 @kermit 我也注意到了相反的情况:)

以上是关于为啥 vsql 可以返回所有记录,而使用 ODBC 驱动程序不能?的主要内容,如果未能解决你的问题,请参考以下文章

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

为啥服务器端数据表在一页中显示所有记录而搜索不起作用?

为啥此查询在 ODBC 表上运行但在本地表上运行时会失败?

ODBC 连接仅返回字符串作为数据类型

为啥在 Access 中返回 835 条记录的查询会在 VBA 代码中返回一个空记录集?

记录 ODBC、SQL Server