4

リモートの Oracle DBMS に接続して .NET C# Web サービスに接続する必要があります

  • 要求はクライアントの Oracle インストールですか? なんで?
  • ODP.NETを使用する必要がある場合

ありがとう

4

4 に答える 4

4

無料であり、Oracle に接続するための「公式」ADO.NET 互換プロバイダーであるため、ODP.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 プロバイダーと非常によく似ています)

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 Fully Managed Oracle Providerを待つか、プロジェクト ファイル (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>
于 2013-04-08T19:11:11.500 に答える
2

Oracle.DataAccessODP.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 クライアントを使用してリモート データベースに接続します。

構成ファイルのような外部リソースで接続文字列を指定できます

于 2013-04-05T13:10:21.267 に答える
1

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);

適切な例外処理を追加する必要があります。

于 2013-04-05T14:36:47.383 に答える
1

System.Data.OracleClient を使用するのが好きです。非推奨であることは知っていますが、組み込まれているという事実により、非常に使いやすくなっています。

また、ASP.NET アプリケーション以外でも、System.Web の SqlDataSource オブジェクトを利用したいと思っています。以下はサンプルコードです。次に、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();
于 2013-04-05T15:23:14.283 に答える