2015-10-28 3 views
6

"Der Netzwerkpfad wurde nicht gefunden" Ich versuche, eine Datenbank (Oracle über ODBC) in ASP zu aktualisieren:Der Versuch, über ODBC zu verbinden -

<%@ Page LANGUAGE="VB"%> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<%@ Import Namespace="System.Configuration" %> 
<% 


Dim objConn As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ODBCNAME").ConnectionString) 

'example query 
Dim strSQL As String = "update foo set bar='BAZ'" 
objConn.Open() 
Dim objCmd As New SqlCommand(strSQL, objConn) 

Try 
    objCmd.ExecuteNonQuery() 
    Response.Write("Record updated") 
Catch e As Exception 
    Response.Write(e.ToString) 
End Try 

%> 

Wo web.config hat:

<connectionStrings> 
    <add name="ODBCNAME" connectionString="server=ExampleServerName;" providerName="System.Data.Odbc" /> 
</connectionStrings> 

Wenn ich dies ausführen bekomme ich den Fehler auf der objCOnn.Open() Zeile:

System.ComponentModel.Win32Exception: The network path was not found. 

die ODBC-Datenquelle erstellt wird, das Testen und die Arbeit mit o andere eigenständige Anwendungen (Closed Source), und ich kann die Verbindung über die ODBC-Einstellungen testen, die funktioniert.

Wie kann ich aus meinem Code eine Verbindung zu dieser Datenbank herstellen? Oder wie kann ich dieses Problem beheben?

+0

können Sie Ihre Datenbank über den Port 1433 telnet? –

+0

@ शेखशेख Ich kann die Oracle-Verbindung von der ODBC-Setup auf dem Server testen, es funktioniert. –

Antwort

2

Oracle kann ein kniffliges Biest sein.

Verwenden Sie zuerst OdbcConnection anstelle von SqlConnection, wenn Sie ODBC verwenden.

See docs from Microsoft

Beispielcode von oben MSDN Link angepasst:

Private Sub InsertRow(ByVal connectionString As String) 

    Dim queryString As String = _ 
     "INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')" 
    Dim command As New OdbcCommand(queryString) 

    Using connection As New OdbcConnection(connectionString) 
     command.Connection = connection 
     connection.Open() 
     command.ExecuteNonQuery() 

     ' The connection is automatically closed at 
     ' the end of the Using block. 
    End Using 
End Sub 

Dim connectionString as String = <your connection details here> 
InsertRow(connectionString) 

Als nächstes empfehle ich Ihnen die Oracle Data Provider verwenden für .NET (ODP.NET, AKA Oracle.DataAccess.dll), die mit den zur Verfügung gestellt Oracle-Client (obwohl nicht immer standardmäßig installiert; Sie müssen möglicherweise benutzerdefinierte Installation durchführen), führt besser als ODBC aus und ist in der Lage, Oracle-spezifische Funktionen zu verwenden. Wenn Sie ODBC verwenden möchten (und es gibt natürlich einige gute Gründe, es so generisch zu halten), lesen Sie weiter:

Zusätzlich zu anderen Vorschlägen, stellen Sie sicher, dass die Architekturen übereinstimmen. Dies gilt nur für Sie, wenn Sie sich in einer 64-Bit-Box befinden.

Wenn 64-Bit-Betriebssystem und 64-Bit-App müssen Sie 64-Bit-ODBC verwenden, um den DSN zu definieren C:\Windows\System32\odcad32.exe

Wenn 64-Bit-Betriebssystem und 32-Bit-Anwendung, die Sie müssen 32-Bit-ODBC verwenden, das zu definieren, C:\Windows\SysWOW64\odbcad32.exe DSN

(Ja, sind die Namen wirklich verwirrend! SysWOW64 im Grunde bedeutet 32-Bit in einem enviro 64-Bit-Emulation. Das andere Problem ist Microsoft das Ding odbcad32 an erster Stelle genannt .. vielleicht odbcad wären besser, aber sie mussten wahrscheinlich zu dieser Zeit zwischen der 32-Bit- und der 16-Bit-Version unterscheiden .. nur eine Vermutung)

Bei 32-Bit-Betriebssystem ist der Speicherort odbcad32.exe der Standardspeicherort (entspricht 64-Bit auf 64-Bit) und ist standardmäßig in Ihrem PATH.

Wenn Ihre App wird in 32-Bit laufen und 64-Bit, dann müssen Sie zwei DSNs definieren, eine für 32 und eine für 64

Alternativ können Sie die Architektur des Projekts in den Projekteinstellungen festgelegt. Standardmäßig kann es Any CPU sein, was (ich denke) bedeutet, dass die native bevorzugen. Wenn Sie auf 64-Bit-Betriebssystem aufbauen, erhalten Sie 64-Bit-exe, wenn Sie es in x86 oder etwas ändern. In Visual Studio 2015 können Sie auch das Kontrollkästchen prefer 32-bit verwenden.

Und das gleiche gilt für den Oracle-Client: Sie müssen die passende Architektur verwenden.

+0

Side Kommentar: offensichtlich - nicht Datenzugriffscode in ASPX-Dateien und so. Dafür ist Code zuständig. Auf diese Weise werden Sie viel besser wiederverwendet. Falls erforderlich, wickeln Sie Ihre Datenzugriffsebenen in webfreundlichen Code ein und/oder verwenden Sie Geschäftsobjekte und Serialisierung von Objekten, um Daten aus der Datenbank für Ihre Webanwendung bereitzustellen. – nothingisnecessary

+0

Sicherheitshinweis: Verwenden Sie die Klasse "OdbcCommand", um Argumente an Ihre Abfrage zu übergeben. Beachten Sie, dass odbc '' 'Platzhalter anstelle von benannten Variablen (' @ var1') verwendet. – DanielK

+0

Guter Punkt - für Leute, die gerade mit datenbankgesteuerten Apps anfangen, gibt es viel neues zu verdecken. Bind-Variablen schützen vor SQL-Injection, machen Ihren Code sauberer und reduzieren - zumindest bei Oracle - die CPU-Auslastung, indem Sie harte Parser von Abfragen reduzieren, indem Sie Ausführungspläne wiederverwenden. Der Code wird jedoch zu Demonstrationszwecken notwendigerweise einfach gehalten - da die Verbindung für diese Frage relevant ist. – nothingisnecessary

0

Wenn Sie versuchen, ODBC zu verwenden, müssen Sie System.Data.Odbc

Zusätzlich verwenden, stellen Sie sicher, dass Ihr Data Source richtig eingestellt ist. Das macht den Unterschied.

Bis Sie diese Änderungen versuchen, wird es schwierig sein, Ihnen viel mehr Hilfe zur Verfügung zu stellen. Lassen Sie uns wissen, was Ihnen einfällt und wir helfen Ihnen gerne weiter.