为啥 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 【问题描述】:我对@987654322@做了一个简单的测试:
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(WOS
和 ROS
all 中的数据显示)。
然后我写了一个使用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 连接字符串