OTL如何连接远程SQL Server数据库?

时间:2022-08-22 13:38:51
#include <iostream>
using namespace std;

#include <stdio.h>
#define OTL_ODBC_MSSQL_2008 // Compile OTL 4/ODBC, MS SQL 2008
//#define OTL_ODBC // Compile OTL 4/ODBC. Uncomment this when used with MS SQL 7.0/ 2000
#include <otlv4.h>

otl_connect db; // connect object

void stored_proc(void)
// invoking stored procedure

 otl_stream o(1, // buffer size should be equal to 1 in case of stored procedure call
              "{call my_proc("
              " :A<int,inout>, "
              " :B<char[31],out>, "
              " :C<char[31],in> "
              ")}",
                 // stored procedure call
              db // connect object
             );

 o.set_commit(0); // set stream auto-commit off since
                  // the stream does not generate transaction

 o<<1<<"Test String1"; // assigning :1 = 1, :3 = "Test String1"

 int a;
 char b[31];

 o>>a>>b;
 cout<<"A="<<a<<", B="<<b<<endl;

}

int main()
{
 otl_connect::otl_initialize(); // initialize ODBC environment
 try{
  db.rlogon("uid=scott;pwd=tiger;dsn=mssql2008"); // connect to ODBC
  otl_cursor::direct_exec
   (db,
    "CREATE PROCEDURE my_proc "
    "  @A int out, "
    "  @B varchar(60) out, "
    "  @C varchar(60) "
    "AS "
    "BEGIN "
    "  SELECT @A=@A+1"
    "  SELECT @B=@C "
    "END"
   );  // create stored procedure

  stored_proc(); // invoking stored procedure
 }
 catch(otl_exception& p){ // intercept OTL exceptions
  cerr<<p.msg<<endl; // print out error message
  cerr<<p.code<<endl; // print out error code
  cerr<<p.var_info<<endl; // print out the variable that caused the error
  cerr<<p.sqlstate<<endl; // print out SQLSTATE message
  cerr<<p.stm_text<<endl; // print out SQL that caused the error
 }
 db.logoff(); // disconnect from the data source
 return 0;
}


那个“dsn=mssql2008”中的“mssql2008”是数据库名吗?如果是远程数据库应该填什么?
如果我改成ip地址的形式(192.168.1.123:1452)连接oracle数据库能成功,连接sql server就报M002错误(Data source not found and no default driver specified)。
OTL的手册已经看到好几遍了,还是没办法解决,都快疯掉了……

3 个解决方案

#1


呃,明白这个“mssql2008”是在系统的“ODBC数据源管理器”里手动注册的DSN了。一个名字配置好后,就包含了IP地址等链接信息,所以就不需要在代码里指明了。

但我这个程序是要安装到很多机器上的,不可能一个个的配DSN啊。有没有不需要配置DSN的解决办法呢?

#2


NND,终于在这儿找到了

https://technet.microsoft.com/en-us/library/ms130822%28v=sql.105%29.aspx

引用
The network address of the server running an instance of SQL Server. Address is usually the network name of the server, but can be other names such as a pipe, an IP address, or a TCP/IP port and socket address.

If you specify an IP address, make sure that the TCP/IP or named pipes protocols are enabled in SQL Server Configuration Manager.

The value of Address takes precedence over the value passed to Server in ODBC connection strings when using SQL Server Native Client. Also note that Address=; will connect to the server specified in the Server keyword, whereas Address= ;, Address=.;, Address=localhost;, and Address=(local); all cause a connection to the local server.

The complete syntax for the Address keyword is as follows:

[protocol:]Address[,port |\pipe\pipename]

protocol can be tcp (TCP/IP), lpc (shared memory), or np (named pipes). For more information about protocols, see Choosing a Network Protocol.

If neither protocol nor the Network keyword is specified, SQL Server Native Client will use the protocol order specified in SQL Server Configuration Manager.

port is the port to connect to, on the specified server. By default, SQL Server uses port 1433.

For more information about protocols, see Choosing a Network Protocol.

#3


Driver={SQL Server};Server=192.168.1.123;Database=mssql;UID=sa;PWD=sa;
这样也可以连接成功,不知道你的那个连接字符串是什么样的?可以分享下吗?

#1


呃,明白这个“mssql2008”是在系统的“ODBC数据源管理器”里手动注册的DSN了。一个名字配置好后,就包含了IP地址等链接信息,所以就不需要在代码里指明了。

但我这个程序是要安装到很多机器上的,不可能一个个的配DSN啊。有没有不需要配置DSN的解决办法呢?

#2


NND,终于在这儿找到了

https://technet.microsoft.com/en-us/library/ms130822%28v=sql.105%29.aspx

引用
The network address of the server running an instance of SQL Server. Address is usually the network name of the server, but can be other names such as a pipe, an IP address, or a TCP/IP port and socket address.

If you specify an IP address, make sure that the TCP/IP or named pipes protocols are enabled in SQL Server Configuration Manager.

The value of Address takes precedence over the value passed to Server in ODBC connection strings when using SQL Server Native Client. Also note that Address=; will connect to the server specified in the Server keyword, whereas Address= ;, Address=.;, Address=localhost;, and Address=(local); all cause a connection to the local server.

The complete syntax for the Address keyword is as follows:

[protocol:]Address[,port |\pipe\pipename]

protocol can be tcp (TCP/IP), lpc (shared memory), or np (named pipes). For more information about protocols, see Choosing a Network Protocol.

If neither protocol nor the Network keyword is specified, SQL Server Native Client will use the protocol order specified in SQL Server Configuration Manager.

port is the port to connect to, on the specified server. By default, SQL Server uses port 1433.

For more information about protocols, see Choosing a Network Protocol.

#3


Driver={SQL Server};Server=192.168.1.123;Database=mssql;UID=sa;PWD=sa;
这样也可以连接成功,不知道你的那个连接字符串是什么样的?可以分享下吗?