从C#通过ODBC读取Netezza数据库表在Windows 7中不工作
为什么.NET不能通过安装的{NetezzaSQL}驱动程序连接到我的Netezza框? 64位应用程序也无法通过此ODBC连接进行连接。为什么会这样?我已经在控制面板中建立了用户和系统Netezza ODBC连接,并且当我点击“测试连接”时,两者都可以正常工作?我看到注册表中的值,但是当我遍历注册表驱动时,.NET看不到“NetezzaSQL”。根据Netezza的说法,他们没有64位ODBC驱动程序。他们提供的驱动程序应该适用于32位和64位应用程序。这可能是Windows 7的权限问题吗?从C#通过ODBC读取Netezza数据库表在Windows 7中不工作
static void CreateNetezzaTableObjectFolders()
{
//string activeDir = @"C:\Source\EDW\dw-objects\trunk";
OdbcConnection conn = new OdbcConnection();
conn.ConnectionString = "Driver={NetezzaSQL};servername=10.1.170.18;port=5480;database=DEV_SANDBOX; username=mac;password=secret;";
OdbcDataReader rdr = null;
try
{
conn.Open();
System.Data.Odbc.OdbcCommand cmd = new System.Data.Odbc.OdbcCommand("SELECT OBJECT_NAME FROM QA_ETL..STG_OBJECTS", conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0]);
// Create Folder
//string objectName = rdr[0].ToString();
//string newPath = System.IO.Path.Combine(activeDir, objectName);
//System.IO.Directory.CreateDirectory(newPath);
}
}
finally
{
// close the reader
if (rdr != null)
{
rdr.Close();
}
// close the connection
if (conn != null)
{
conn.Close();
}
}
}
打开新的标签来查看注册表设置ODBC和放大:
================== ==========
7/13/2012下午4时56分更新:
显然,驱动程序的名称而来的大括号内。当我以编程方式获得驱动程序列表时,我看不到驱动程序。我如何在Windows用户界面中添加到此列表中?不过,我可以在控制面板>管理工具> ODBC驱动程序下看到安装的Netezza驱动程序。
下面是一些代码,验证什么,我解释:
public static void GetSystemDriverList()
{
//List<string> names = new List<string>();
// get system dsn's
Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.LocalMachine).OpenSubKey("Software");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC");
if (reg != null)
{
reg = reg.OpenSubKey("ODBCINST.INI");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC Drivers");
if (reg != null)
{
// Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
foreach (string sName in reg.GetValueNames())
{
Console.WriteLine(sName);
//names.Add(sName);
}
}
try
{
reg.Close();
}
catch { /* ignore this exception if we couldn't close */ }
}
}
}
Console.ReadLine();
}
这里是连接错误,我从微软Access 2007年从Windows 7箱送,当我使用的用户ODBC连接。该系统不可见。
错误: “ODBC - 调用失败[微软] [ODBC驱动程序管理器]指定的DSN包含驱动程序和应用程序(#0)之间的架构不匹配。”
微软从未改名他们的“system32”文件夹,所以system32真的拥有所有的64位驱动程序。和SysWow64文件夹具有所有的32位驱动程序。默认情况下,在Visual Studio 2010中创建的.NET项目将具有x86的“目标平台”。我只是将其更改为x64,并且我的连接可以让我的64位NetezzaSQL驱动程序在.NET上工作。
只需要在C:\ Windows \ system32 \文件夹中运行“odbcad32.exe”文件(这是64位版本),即可启动控制面板>管理工具下的ODBC(数据源)对话框的对话框来构建64位驱动程序),或者在C:\ Windows \ SysWow64 \文件夹中(这是构建32位驱动程序的对话框的32位/ x86版本)。是的,这些文件夹是相反的,因为微软很奇怪。
此外,在注册表中有两个不同的文件夹被构建。原来,上面的列表(在我的黑屏幕截图中)来自Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ODBC \ list,因为这些是32位驱动程序。我安装的DLL,“nzodbcsetup.exe”,显然安装为64位驱动程序。我不确定如何在64位窗口上将它安装为32位驱动程序,所以我将.NET项目中的“目标平台”从默认x86更改为x64。必须有一种方法将其作为32位驱动程序安装,因为当我将它安装在32位Windows XP机器上时,驱动程序运行正常。
奇怪的是,Netezza的OLE驱动程序是分开的。他们有一个32位和一个64位的DLL exe文件(用于版本6.0.3)。 “nzoledbsetup.exe”(〜82MB x86)和“nzoledbsetup64.exe”(〜102MB x64)。但是ODBC只有一个,显然两者都有。我尝试在SysWOW6432Node(在运行> regedit下)手动构建一个32位驱动程序,并指向驱动程序文件和安装文件(位于system32文件夹中,但出现错误。请评论是否有一种方法可以在Windows中自动安装为32位,而不是64.
连接字符串看起来很好:http://www.connectionstrings.com/netezza – 2012-07-13 21:00:53
请确切的错误信息是什么? – dash 2012-07-13 21:13:13
错误[IM002] [Microsoft] [ODBC Driver Manager]数据源名称未找到并且未指定默认驱动程序 – MacGyver 2012-07-13 21:22:28