我必须将远程 Oracle DBMS 连接到我的 .NET C# Web 服务中
- 是要求客户端安装Oracle吗?为什么?
- 当您必须使用 ODP.NET 时
谢谢
我必须将远程 Oracle DBMS 连接到我的 .NET C# Web 服务中
谢谢
我建议使用 ODP.NET,因为它是免费的,并且是用于连接到 Oracle 的“官方”ADO.NET 兼容提供程序。1
为了让您的用户不必单独安装 Oracle 客户端,请下载Oracle Instant Client,从那里获取以下文件...
oci.dll
Oracle.DataAccess.dll (the managed ODP.NET assembly itself)
orannzsbb11.dll
oraociei11.dll
OraOps11w.dll
...并将它们与您的应用程序一起分发。
不幸的是,这些 DLL 中的大多数都是本机的(并且是 32 位/64 位特定的),因此您将无法为“任何 CPU”平台构建(但2)。
.NET 代码与您在“胖”Oracle 客户端下使用的代码相同(并且与任何其他 ADO.NET 提供程序非常相似),除了您可能应该考虑使用“tnsnames.ora 独立”连接字符串,例如:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
1有商业替代品和现在已弃用的旧 Microsoft 提供程序(无论如何都不会让您免于安装 Oracle 本机 DLL)。
2等待完全托管的 Oracle 提供程序,或编辑您的项目文件(MSBuild XML)以根据构建平台有条件地包含 32 位或 64 位 DLL,类似于以下内容:
<Choose>
<When Condition="'$(Platform)' == 'x64'">
<ItemGroup>
<Reference Include="Oracle.DataAccess, processorArchitecture=x64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ODP.NET\x64\Oracle.DataAccess.dll</HintPath>
</Reference>
<Content Include="..\ThirdParty\ODP.NET\x64\oci.dll">
<Link>oci.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x64\orannzsbb11.dll">
<Link>orannzsbb11.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x64\oraociei11.dll">
<Link>oraociei11.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x64\OraOps11w.dll">
<Link>OraOps11w.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
<When Condition="'$(Platform)' == 'x86'">
<ItemGroup>
<Reference Include="Oracle.DataAccess, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ODP.NET\x86\Oracle.DataAccess.dll</HintPath>
</Reference>
<Content Include="..\ThirdParty\ODP.NET\x86\oci.dll">
<Link>oci.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x86\orannzsbb11.dll">
<Link>orannzsbb11.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x86\oraociei11.dll">
<Link>oraociei11.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\ThirdParty\ODP.NET\x86\OraOps11w.dll">
<Link>OraOps11w.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
</Choose>
我认为您可以使用Oracle.DataAccess
ODP.NET 中的命名空间
你可以这样使用:
var _testConx = new OracleConnection(_testConnectionString);
var rezList = new List<Type>();
string _GetSQL = @"SELECT STATEMENT";
var dbCommand = new OracleCommand(_GetSQL , _testConx);
dbCommand .CommandType = CommandType.Text;
var reader = dbCommand .ExecuteReader();
while (reader.Read())
{
var rez = new Type();
rez.Field1= TryGetInt(reader.GetOracleValue(0));
rez.Field2= TryGetString(reader.GetOracleValue(1));
rezList.Add(rez);
}
return rezList;
这将使用 oracle 客户端连接到远程数据库。
您可以在配置文件等外部资源中指定连接字符串
我喜欢使用 System.Data.OracleClient。我知道它已被弃用,但它内置的事实使它非常易于使用。
我还喜欢使用 System.Web 中的 SqlDataSource 对象,即使在非 ASP.NET 应用程序中也是如此。下面是一些示例代码。然后,获取数据就像调用 GetDataView() 并传入您的 select 语句一样简单。您需要自己实现 GetDefaultConnectionString() 和 GetDefaultProviderName()。提供者名称是“System.Data.OracleClient”,这些应该让您开始使用连接字符串。
请注意,由于 SqlDataSource 依赖于 System.Web,因此应用程序将需要整个 .NET Framework 4 配置文件(而不仅仅是较小的客户端配置文件)。取决于你在做什么,这可能是也可能不是问题。你总是可以实现你自己的 SqlDataSource 等价物,但我不喜欢重新发明轮子,除非它给我一个很好的优势。
/// <summary>
/// Creates a SqlDataSource object using the Default connectionstring in the web.config file and returns it.
/// </summary>
/// <returns>An SqlDataSource that has been initialized.</returns>
public static SqlDataSource GetDBConnection()
{
SqlDataSource db = new SqlDataSource();
db.ConnectionString = GetDefaultConnectionString();
db.ProviderName = GetDefaultProviderName();
return db;
}
/// <summary>
/// Creates a DataView object using the provided query and an SqlDataSource object.
/// </summary>
/// <param name="query">The select command to perform.</param>
/// <returns>A DataView with data results from executing the query.</returns>
public static DataView GetDataView(string query)
{
SqlDataSource ds = GetDBConnection();
ds.SelectCommand = query;
DataView dv = (DataView)ds.Select(DataSourceSelectArguments.Empty);
return dv;
}
进行更新/插入/删除同样容易......
SqlDataSource ds=GetDBConnection();
ds.InsertCommand="insert into my_table values ('5','6')";
ds.Insert();
我们正在使用 Oracle 提供的 OLEDB 驱动程序连接到 .net 桌面应用程序中的远程 Oracle 数据库。也应该适用于 Web 服务。
String conString = "Provider=OraOLEDB.Oracle.1;User ID=username;password=password;Data Source=your_tnsname;Persist Security Info=False";
String query = "Select 2 from dual";
OleDbConnection OleDbCon = new OleDbConnection(conString);
OleDbCon.Open();
OleDbCommand cmd = new OleDbCommand(query, OleDbCon);
OleDbDataReader reader = cmd.ExecuteReader();
reader.Read();
decimal dResult = reader.GetDecimal(0);
con.Close();
return Convert.ToInt32(dResult);
您应该添加适当的异常处理。