【问题标题】:how to use ODBC binding for Dart如何为 Dart 使用 ODBC 绑定
【发布时间】:2014-11-03 05:47:41
【问题描述】:

我想在我的应用程序中使用 DART this one 的 ODBC 绑定,我正在使用 ORACLE XE 数据库,但不知道如何设置它,尽管我阅读了自述文件中的基本示例 :(

附上我的 ORACLE XE ODB 设置、成功连接和简单 SQL 语句的打印屏幕,

感谢了解以下内容: 1. 在 DART 中设置我的 ODBC, 2.如何让相同的SQL语句被执行。

我写了以下内容:

void main() {
  // Allocate an environment handle.
 var hEnv = new SqlHandle();   
 sqlAllocHandle(SQL_HANDLE_ENV, null, hEnv);    
 // Set ODBC version to be used.
 var version = new SqlPointer()..value = SQL_OV_ODBC3;    
 sqlSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, version, 0);    
 // Allocate a connection handle.
 var hConn = new SqlHandle();

sqlAllocHandle(SQL_HANDLE_DBC, hEnv, hConn);

// Connect.
sqlConnect(hConn, "XE", SQL_NTS, "SYSTEM", SQL_NTS, "myPasswords", SQL_NTS);  // so, I need to change this data only!

// Allocate a statement handle.
var hStmt = new SqlHandle();

sqlAllocHandle(SQL_HANDLE_STMT, hConn, hStmt);

// Prepare a statement.
sqlPrepare(hStmt, "select * from Vendors", SQL_NTS);   // I need to print the output of this SQL!!

// Execute and fetch some data.
sqlExecute(hStmt);

sqlFetch(hStmt);


// Free statement handle.
sqlFreeHandle(SQL_HANDLE_STMT, hStmt);

// Disconnect.
sqlDisconnect(hConn);

// Free connection handle.
sqlFreeHandle(SQL_HANDLE_DBC, hConn);

// Free environment handle.
sqlFreeHandle(SQL_HANDLE_ENV, hEnv); 

}

谢谢

【问题讨论】:

  • 您能否将代码添加到您的问题中,以演示您尝试过的内容,并添加您收到的错误消息。
  • 我不知道在基本示例中我需要更改哪些参数/属性,实际上我不知道我该怎么做:(我不熟悉 ODBC,我读到这个得到一些想法,old.vk.pp.ru/docs/sybase-any/interfaces/00000034.htm,但仍然感到困惑。谢谢

标签: dart odbc


【解决方案1】:

ODBC 包 README 中的示例代码的此代码行表明您必须通过 cutom <YOUR DSN><YOUR USER ID><YOUR PASSWORD>

sqlConnect(hConn, "<YOUR DSN>", SQL_NTS, "<YOUR USER ID>", SQL_NTS, "<YOUR PASSWORD>", SQL_NTS);

您的屏幕截图的&lt;YOUR DSN&gt;XE。我不知道你的用户名和密码:-P

【讨论】:

  • 只有这些数据需要修改!! SQL 怎么样。如果我想使用 print() 来检查打印 SELECT 语句的输出。我该怎么办!!
  • 我不知道您的期望,您甚至没有提供有关您的数据库/表/数据的外观以及您想要执行的 SQL 语句的任何信息。如果要执行示例中的 SQL,则不必更改它。您的数据库需要在 SQL 语句中引用表和字段。
  • 根据我目前的理解,在您的 cmets 之后,我用一些代码更新了我的问题。
【解决方案2】:

感谢酒吧作者 Juan。 我的错误是,我使用的是 Windows x64,并使用 std ODBC 定义了我的 ODBC,没有注意到这个 pub 是 32 位的,我必须使用以下方法定义 ODBC:

(您的窗口目录)\SysWOW64\odbcad32.exe

以下代码完美运行

import 'package:odbc/odbc.dart';

void main() {
     var hEnv = new SqlHandle();
     sqlAllocHandle(SQL_HANDLE_ENV, null, hEnv);

     var version = new SqlPointer()..value = SQL_OV_ODBC3;
    sqlSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, version, 0);

    var hConn = new SqlHandle();
    sqlAllocHandle(SQL_HANDLE_DBC, hEnv, hConn);

    sqlConnect(hConn, "<DSN>", SQL_NTS, "<USER>", SQL_NTS, "<PASS>", SQL_NTS);

    var hStmt = new SqlHandle();

    sqlAllocHandle(SQL_HANDLE_STMT, hConn, hStmt);

    sqlPrepare(hStmt, "SELECT * FROM vendors", SQL_NTS);

    var col1 = new SqlLongBuffer();
    var flags1 = new SqlIntBuffer();
    sqlBindCol(hStmt, 1, col1.ctype(), col1.address(), 0, flags1.address());

    var col2 = new SqlLongBuffer();
    var flags2 = new SqlIntBuffer();
    sqlBindCol(hStmt, 2, col2.ctype(), col2.address(), 0, flags2.address());

    var col3 = new SqlStringBuffer(255);
    var flags3 = new SqlIntBuffer();
    sqlBindCol(hStmt, 3, col3.ctype(), col3.address(), col3.length(), flags3.address());

    var col4 = new SqlStringBuffer(255);
    var flags4 = new SqlIntBuffer();
    sqlBindCol(hStmt, 4, col4.ctype(), col4.address(), col4.length(), flags4.address());

    sqlExecute(hStmt);

    while (sqlFetch(hStmt) != SQL_NO_DATA_FOUND) {
          print("${col1.peek()} ${col2.peek()} ${col3.peek()} ${col4.peek()} ");
     }

   sqlFreeHandle(SQL_HANDLE_STMT, hStmt);

   sqlDisconnect(hConn);

   sqlFreeHandle(SQL_HANDLE_DBC, hConn);

   sqlFreeHandle(SQL_HANDLE_ENV, hEnv);
}

表已创建:

      CREATE TABLE vendors (
             vendor_id NUMBER,
             vCode NUMBER,
             vName VARCHAR(255),
             vEmail VARCHAR(255),
             PRIMARY KEY (vendor_id));

输入数据:

 INSERT INTO vendors VALUES(1, 111, 'One', 'one@vendors.com')
 INSERT INTO vendors VALUES(2, 222, 'Two', 'two@vendors.com');
 INSERT INTO vendors VALUES(3, 33, 'Three', 'three@vendors.com');

控制台输出:

     Observatory listening on http://127.0.0.1:49433
 1 111 One one@vendors.com 
 2 222 Two two@vendors.com 
 3 33 Three three@vendors.com 

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2016-07-10
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多