我正在研究具有C++扩展存储过程的遗留应用程序.此xsproc使用ODBC连接到数据库,这意味着它需要配置DSN.
我正在更新安装程序(使用Visual Studio 2008安装项目创建),并希望有一个可以创建ODBC DSN条目的自定义操作,但我很难在Google上找到有用的信息.
有人可以帮忙吗?
我在SQL Server 2016中使用Windows 10 64位专业版为我的数据库设置了系统DSN(64位).当我被要求选择驱动程序来设置数据源时,有以下选择:
我似乎可以使用所有这些驱动程序设置数据源.那么我应该在速度和效率方面选择哪一个?他们之间有什么区别?
谢谢,
贾森
我添加了一些编译干净,刚刚收到此Windows错误的代码:
---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.
(0xc0000096) occurred in the application at location 0x00486752.
Run Code Online (Sandbox Code Playgroud)
我即将继续寻找一个bug,我期待它是我所做的愚蠢的事情,这恰好产生了这个消息.代码编译干净,没有错误或警告.EXE文件的大小已经增长到1,454,132字节并且包含指向的链接ODCS.lib,但它是纯粹的C到Win32 API,DEBUG打开(在Windows 2000上的P4上运行).
我遇到了一些问题,我们使用一些第三方软件来跟踪我们计算机实验室中的软件许可证使用情况.我们最近将该应用程序迁移到64位Server 2008,并收到该公司保证它兼容并运行一些初步测试,表明该应用程序在64位环境中工作.不幸的是,进行测试的人没有测试我拥有的几个应用程序的功能,这些应用程序依赖于访问数据来对数据进行实时和后处理以生成一些报告.
事实证明,应用程序没有64位ODBC驱动程序来访问其内部数据,并且无法使用64位SQL Server ODBC驱动程序将其数据导出到SQL Server.它确实包含并安装了32位ODBC驱动程序,但它将其安装为用户数据源,而不是系统数据源,这意味着运行实时集合的Windows服务无法找到它.我也无法创建系统DSN,因为数据源管理控制台无法找到已安装的驱动程序.
我的问题是如何配置此连接的数据源,我可以从系统帐户下运行的C#/.NET Windows服务访问?
由于我已经想出办法,我会提供我的解决方案作为答案(与常见问题解答如何回答你自己的问题).
当我执行此代码时:
print_r(PDO::getAvailableDrivers());
Run Code Online (Sandbox Code Playgroud)
它说我有odbc司机可用.
Array ( [0] => mysql [1] => odbc [2] => sqlite )
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用它时:
$handle = new PDO("odbc:Server=dbServerIpAddress,myportnumber;Database=mydatabase", "myusername", 'mypassword');
Run Code Online (Sandbox Code Playgroud)
它没有做任何事情 - 没有错误,根本不起作用.它甚至不会执行该行!
如何通过PDO和ODBC将PHP连接到此MSSQL数据库?
注意:我已将此问题缩小到专门的PDO,因为我能够使用odbc_*函数成功准备和执行语句.
为什么我不能将此参数绑定到PDO预处理语句?
这有效:
$mssqldriver = 'ODBC Driver 13 for SQL Server';
$pdoDB = new PDO("odbc:Driver=$mssqldriver;Server=$hostname;Database=$dbname", $username, $password);
$pdoDB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT 'value' AS col where 'this' = 'this'";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
print_r($stmt->fetch());
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Array ( [col] => value [0] => value )
不起作用:
$sql = "SELECT 'value' AS col where 'this' = ?";
$stmt = $pdoDB->prepare($sql);
$params = ['this'];
$stmt->execute($params);
print_r($stmt->fetch());
Run Code Online (Sandbox Code Playgroud)
Web服务器在Linux Ubuntu 14.04上运行PHP 5.5.9,带有用于SQL Server的ODBC驱动程序13,并在Windows Server 2012上连接到Microsoft …
我应该使用什么库来连接到Windows上的python中的odbc?有关odbc的pywin32有什么好的选择吗?
我正在寻找记录良好,健壮,积极维护等等的东西pyodbc看起来很好 - 还有其他吗?
这是相关代码:
function connect(){
// DB credentials and info defined here....
$connection = odbc_connect("DRIVER={SQL Server Native Client 11.0}; Server=$server; Database=$db;", $loginname, $loginpass);
return $connection;
}
function odbc_fetch_results($stmt, &$results) {
$numrows = odbc_num_rows($stmt);
$row = odbc_fetch_array($stmt);
print_r($row); // Prints: Array ( [MEASUREMENT_UNI] => kg)
if($row){
$results = array ($row);
while( $row = odbc_fetch_array($stmt)){
array_push($results, $row);
}
}
return $numrows;
}
$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints: Array ( [0] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用FreeTDS和unixODBC从Ubuntu 12.04网络服务器连接到MSSQL服务器.
使用tsql我可以连接到服务器
~$ tsql -S dbs3 -U <username> -P <password>
Run Code Online (Sandbox Code Playgroud)
没问题.
当我尝试连接isql时,我收到以下错误消息:
~$ isql -v database3 <username> <password>
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Unknown host machine name.
[ISQL]ERROR: Could not SQLConnect
Run Code Online (Sandbox Code Playgroud)
我的配置文件如下:
ODBC.INI
[database3]
Driver=FreeTDS
TDS_Version=8.0
Servername=dbs3
Port=1433
Database=benchmark_res
Run Code Online (Sandbox Code Playgroud)
ODBCINST.INI
[FreeTDS]
Description=FreeTDS v0.91
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsS.so
Trace=Yes
TraceFile=/tmp/freetds.log
ForceTrave=Yes
UsageCount=1
Run Code Online (Sandbox Code Playgroud)
freetds.conf
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about …Run Code Online (Sandbox Code Playgroud) 我对pdo_odbc和PDO :: FETCH_OBJ(以及PDO :: FETCH_CLASS)有一个奇怪的问题,导致以下错误消息:
PHP Fatal error: Cannot access empty property
Run Code Online (Sandbox Code Playgroud)
这是代码:
$dbh = new PDO("odbc:FOO");
$sth = $dbh->query("
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
");
$result = $sth->fetch(PDO::FETCH_OBJ);
Run Code Online (Sandbox Code Playgroud)
作为参考,FOO DSN是使用tdodbc软件包提供的tdata.so驱动程序的Teradata数据源.
我相信这种情况正在发生,因为当PDO调用zend_API.h:object_init_ex()来实例化stdClass对象时,字段名称(从ODBC查询返回)是空白的.如果我切换到PDO :: FETCH_LAZY和var_dump()行,我得到以下内容:
object(PDORow)#3 (2) {
["queryString"]=>
string(95) "
SELECT rolename
FROM dbc.allrolerights
WHERE databasename = 'BAR'
"
[""]=>
string(30) "FNAR "
}
Run Code Online (Sandbox Code Playgroud)
这似乎支持它.我已经尝试了几种不同的PDO属性组合和一堆不同的角度来解决这个问题.一种解决方案是获取关联数组并将其传递给类构造函数.但是,这对于在幕后直接使用PDO :: FETCH_CLASS的某些框架和ORM不起作用.
我想补充一点,其他fetch方法似乎做对了,例如,PDO :: FETCH_NAMED:
array(1) {
["RoleName"]=>
string(30) "FNAR "
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找可以放在PDO dbh或sth定义中的东西,或者用于数据源或驱动程序的odbc.ini或odbcinst.ini来解决此问题.先感谢您.
更新: odbc_fetch_object()(即不是PDO)与完全相同的一切都很好.只是想提一下.显然,PHP,unixODBC或ODBC驱动程序似乎没有任何严重问题.它是PDO代码中的一部分.是时候打开一个错误报告...... 打开了
$dbh = odbc_connect("FOO", NULL, NULL) …Run Code Online (Sandbox Code Playgroud)