这似乎是一个奇怪的问题,因为我有一个解决方案,我只是不明白为什么,这限制了我。
我正在将各种来源的数据复制到SQL中,并在C ++ Builder XE2中使用ADO连接。
当数据来自MSAccess或MSExcel时,代码类似于以下内容:
// SetupADO ..
ADOConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/temp/testdb.mdb";
//然后打开它..
ADOConn->Connected = true;
//构建SQL
UnicodeString sSQL = "SELECT * INTO [ODBC;DSN=PostgreSQL30;DATABASE=admin_db;SERVER=192.168.1.10;PORT=5432;UID=user1;PWD=pass1;SSLmode=disable;ReadOnly=0;Protocol=7.4;].[table1] FROM [accesstb]";
//最后我使用了ADO Connection的EXCEUTE()函数
ADOConn->Execute(sSQL, iRA, TExecuteOptions() << TExecuteOption::eoExecuteNoRecords);
这也适用于Excel,但不适用于CSV文件。我使用相同的驱动程序必须只能通过更改语法来使其工作。
// SetupADO ..
ADOConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\temp;Extended Properties=\"Text;HDR=Yes;\";Persist Security Info=False";
//然后打开它..
ADOConn->Connected = true;
//使用IN关键字构建SQL并使用2个单引号启动内部ODBC连接
UnicodeString sSQL = "SELECT * INTO [table1] IN '' [ODBC;DSN=PostgreSQL30;DATABASE=admin_db;SERVER=192.168.1.10;PORT=5432;UID=user1;PWD=pass1;SSLmode=disable;ReadOnly=0;Protocol=7.4;] FROM [test.csv]";
//最后再次EXCEUTE()
ADOConn->Execute(sSQL, iRA, TExecuteOptions() << TExecuteOption::eoExecuteNoRecords);
当使用与Access查询相同的SQL时,将返回错误“查询输入必须包含至少一个表或查询”。 有趣的是,一个逃脱的引用,即当用于代替2个单引号时失败。我也尝试写过另一个Access数据库,以防PG出现问题,但结果相同。
有人可以告诉我为什么需要IN键工作以及单引号是做什么的?
答案 0 :(得分:0)
Extended Properties=\"Text;HDR=Yes;\"
指定text作为数据源,因此连接字符串不同。 IN ''
告诉数据库将table1
映射到CSV文件的第一列,因为CSV中没有关系模型。
<强>参考强>