如今說說個人作法:Winform程序若是想要鏈接Oracle數據庫,只須要包含相關的dll庫便可。以下是我包含的dll,部分dll可能不須要用到,有待測試:算法
沒有dll的話能夠到Oracle官網下載Install Client(http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)
下載時要注意選擇與你係統對應的版本。
把壓縮包裏面的dll文件包含到程序運行的目錄下就能夠了。sql
string oradb = "Data Source=(DESCRIPTION="
+ "(ADDRESS=(PROTOCOL=TCP)(HOST=MyComputerName)(PORT=1521))"
+ "(CONNECT_DATA=(SERVICE_NAME=DemoDB)));"
+ "User Id=SYSTEM;Password=************;";
try
{
OracleConnection conn = new OracleConnection(oradb);
conn.Open();
string sql = " select * from DemoOP.T_TEST "; // DemoOP是表T_TEST的user
OracleCommand cmd = new OracleCommand(sql, conn);
cmd.CommandType = CommandType.Text;
//大容量數據,能夠進行修改,使用DataSet和DataAdapter
DataSet ds = new DataSet();
OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0] ;
//使用DataReader,讀取數據
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read()) // C#
{
comboBox1.Items.Add(dr["NAME"].ToString());
}
dr.Close();
conn.Dispose(); //Close()也能夠。
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
}
鏈接數據庫時報「嘗試加載 oracle客戶端庫時引生BadImageFormatExceiption。若是在安裝32位oracle 客戶端組件時的狀況下以64位模式運行,將出現問題」。數組
分析緣由是:個人系統是Win7 64位的,Winform工程目標平臺設置是X86,修改設置從新編譯便可。具體設置以下:選擇工程名-->屬性-->生成,目標平臺選爲Any CPU,運行沒問題,能正常連上Oracle.session
=======================================================================================oracle
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using Oracle.DataAccess.Client;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string ConnectionString = "Data Source=127.0.0.1/orcl;user id=system;password=123456;";//寫鏈接串
OracleConnection conn = new OracleConnection(ConnectionString);//建立一個新鏈接
try
{
conn.Open();
OracleCommand cmd = conn.CreateCommand();
if (conn.State == ConnectionState.Open)
{
textBox1.Text = "鏈接成功";
}
}
catch (Exception ee)
{
System.Diagnostics.Debug.WriteLine(ee.Message); //若是有錯誤,輸出錯誤信息
}
finally
{
conn.Close(); //關閉鏈接
}
}
}
}
=======================================================================================
=======================================================================================
本文實例總結了C#鏈接Oracle的方法。分享給你們供你們參考,具體以下:
1、經過System.Data.OracleClient(須要安裝Oracle客戶端並配置tnsnames.ora)
1. 添加命名空間System.Data.OracleClient引用
2.
1
|
using
System.Data.OracleClient;
|
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string
connString =
"User ID=IFSAPP;Password=IFSAPP;Data Source=RACE;"
;
OracleConnection conn =
new
OracleConnection(connString);
try
{
conn.Open();
MessageBox.Show(conn.State.ToString());
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
2、經過System.Data.OracleClient(須要安裝Oracle客戶端不需配置tnsnames.ora)
1. 添加命名空間System.Data.OracleClient引用
2.
1
|
using
System.Data.OracleClient;
|
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string
connString =
"User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))"
;
OracleConnection conn =
new
OracleConnection(connString);
try
{
conn.Open();
MessageBox.Show(conn.State.ToString());
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
3、經過System.Data.OleDb和Oracle公司的驅動
1. 添加命名空間System.Data.OracleClient引用
2.
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string
connString =
"Provider=OraOLEDB.Oracle.1;User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))"
;
OleDbConnection conn =
new
OleDbConnection(connString);
try
{
conn.Open();
MessageBox.Show(conn.State.ToString());
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
4、經過System.Data.OleDb和微軟公司的Oracle驅動
1. 添加命名空間System.Data.OracleClient引用
2.
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string connString =
"Provider=MSDAORA.1;User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))"
;
OleDbConnection cnn =
new
OleDbConnection(connString);
try
{
conn.Open();
MessageBox.Show(conn.State.ToString());
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
備註:
a.XP操做系統已經安裝了微軟公司的Oracle驅動C:\Program Files\Common Files\System\Ole DB\msdaora.dll
b.該驅動須要Oracle客戶端的三個文件(oraocixe10.dll、oci.dll、ociw32.dll)放在System32下便可
5、使用ODP鏈接
1. 下載安裝ODP.NET(http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html)
2. 安裝徹底成後會產生一序列文件。
3. 找到這個安裝目錄,打開文件夾%ORACLE_HOME%\Network\Admin在這個下面創建一個tnsnames.ora的文件,其內容能夠參考其下的Sample目錄下面的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Oracle.RACE =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=127.0.0.1)
(PORT=1521)
)
)
(CONNECT_DATA=
(SID=RACE)
(SERVER=DEDICATED)
)
)
|
Oracle.RACE爲鏈接字符串名稱,能夠隨便取。等號後面的字符串能夠在Enterprise Manager Console工具中鏈接數據庫後的TNS描述符中拷過來
4. 引用Oracle.DataAccess命名空間
5.
1
|
using
Oracle.DataAccess.Client;
|
6. 示例代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
string
connString =
"DATA SOURCE=Oracle.RACE;PERSIST SECURITY INFO=True;USER ID=IFSAPP;password=IFSAPP"
;
OracleConnection conn =
new
OracleConnection(connString);
try
{
conn.Open();
OracleCommand cmd =
new
OracleCommand(cmdText,conn);
OracleDataReader reader = cmd.ExecuteReader();
this
.DataGridView1.DataSource = reader;
this
.DataGridView1.DataBind();
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
6、使用第三方驅動
第三方驅動有 Devart,下載驅動 http://www.devart.com/dotconnect/oracle/,可是是商業版,須要購買許可或破解
鏈接格式 User ID=myUsername;Password=myPassword;Host=ora;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
1. 引用Devart.Data.Oracle命名空間
2.
1
|
using
Devart.Data.Oracle;
|
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
OracleConnection conn =
new
OracleConnection();
conn.ConnectionString =
""
;
conn.Unicode =
true
;
conn.UserId =
"IFSAPP"
;
conn.Password =
"IFSAPP"
;
conn.Port = 1521;
conn.Server =
"127.0.0.1"
;
conn.Sid =
"RACE"
;
try
{
conn.Open();
}
catch
(Exception ex)
{
ShowErrorMessage(ex.Message.ToString());
}
finally
{
conn.Close();
}
|
更多關於C#相關內容感興趣的讀者可查看本站專題:《C#程序設計之線程使用技巧總結》、《C#操做Excel技巧總結》、《C#中XML文件操做技巧彙總》、《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#數組操做技巧總結》及《C#面向對象程序設計入門教程》
但願本文所述對你們C#程序設計有所幫助。
=======================================================================================
=======================================================================================
=======================================================================================
1、鏈接方法
(1)System.Data.OracleClient
注意1:此方法在.NET 4.0以前(包括4.0)是能夠的,但在以後版本中就不能用了,官方已經聲明;
注意2:此方法提供的接口權限不足,例如不能以sysdba身份創建鏈接,即不支持關鍵字「dba privilege」;
注意3:若是安裝的Oracle客戶端是64位的,那麼VS2010在編譯時必須指定X64平臺,不然報錯
注意4:使用此方法鏈接數據庫,須要安裝Oracle客戶端或者在服務端構造WebService接口供客戶端調用
(2)Oracle.DataAccess(\product\12.1.0\dbhome_1\ODP.NET\bin\4)
這個是Oracle官方的鏈接接口(ODP.NET),能夠以sysdba身份創建鏈接,例如
"Data Source=XXX;User ID=XXX;Password=XXX;DBA Privilege=SYSDBA";
使用此方法,不須要額外安裝Oracle客戶端,只須要引用相應DLL便可
2、鏈接過程當中遇到的問題
system和sys帳戶登陸的時候有DBA模式和普通模式,若是是以DBA模式登陸,而後去建立表格,在查詢(鏈接字符串)中必定要
註明「DBA Privilege=SYSDBA」,不然報錯「ORA-00942: 表或視圖不存在」,謹記!
出處:http://blog.sina.com.cn/s/blog_900ca29d0102vn3r.html
-----------------------------------------------------------------------------------------------------------------
oracle的sysdba權限問題
一、sysdba是一個身份,不是權限,被授予sysdba身份的用戶登陸時有兩種模式能夠選擇,一是普通模式,二是sysdba模式。以sysdba模式登陸時能夠關閉數據庫,普通模式則沒有權限。
確認你當前模式的方法是在命令行窗口執行show user,普通模式顯示zzy,sysdba模式顯示sys。
二、上面說到了,sysdba是一個身份,不是權限,因此user_sys_privs查不到。
正確的查詢方法是select * from v$pwfile_users;
出處:https://zhidao.baidu.com/question/418248527.html
---------------------------------------------------------------------------------------------------------
Oracle角色
1、概述
角色就是相關權限的命令集合,使用角色的主要目的就是爲了簡化權限的管理。假定有用戶a,b,c爲了讓他們都擁有權限
一、鏈接數據庫
二、在scott.emp表上select,insert,update
若是採用直接受權操做,則須要進行12次受權。
若是採用角色就能夠簡化
首先將create session,select on scott.emp,insert on scott.emp,update on scott.emp授予角色,而後將該角色授予a,b,c用戶,這樣就能夠三次受權搞定。角色分爲預約義角色和自定義角色兩類。
2、預約義角色
預約義角色是指Oracle所提供的角色,每種角色都用於執行一些特定的管理任務,下面咱們介紹經常使用的預約義角色connect,resource,dba。
一、connect角色
connect角色具備通常應用開發人員須要的大部分權限,當創建了一個用戶後,多數狀況下,只要給用戶授予connect和resource角色就夠了,那麼connect角色具備如下系統權限:
alter session
create cluster
create database link
create session
create view
create sequence
二、resource角色
resource角色具備應用開發人員所須要的其餘權限,好比創建存儲過程、觸發器等。這裏須要注意的是resource角色隱含了unlimited tablespace系統權限。
resource角色包含如下系統權限:
create cluster
create indextype
create table
create sequence
create type
create procedure
create trigger
三、dba角色
dba角色具備全部的系統權限,及with admin option選項,默認的dba用戶爲sys和system他們能夠將任何系統權限授予其餘用戶。可是要注意的是dba角色不具有sysdba和sysoper的特權(啓動和關閉數據庫)。
3、自定義角色
顧名思義就是本身定義的角色,根據本身的須要來定義,通常是DBA來創建,若是用的別的用戶來創建,則須要具備create role的系統權限,在創建角色時能夠指定驗證方式(不驗證,數據庫驗證等)。
一、創建角色(不驗證)
若是角色是公用的角色,能夠採用不驗證的方式創建角色
sql>create role 角色名 not identified;
二、創建角色(數據庫驗證)
採用這樣的方式時,角色名、口令存放在數據庫中,當激活該角色時,必須提供口令。在創建這種角色時,須要爲其提供口令。
create role 角色名 identified by tiger;
三、角色受權
當創建角色時,角色沒有任何權限,爲了使得角色完成特定任務,必須爲其授予相應的系統權限和對象權限。
給角色受權
給角色授予權限和給用戶受權沒有太多的區別,可是要注意,系統權限的unlimited tablespace對對象權限with grant option選項是不能授予角色的。
sql>conn system/manager;
sql>grant create session to 角色名 with admin option;
sql>conn scott/tiger;
sql> grant select on scott.emp to 角色名;
sql>grant insert,update,delete on scott.emp to 角色名;
經過上面的步驟,就給角色受權了。
四、分配角色給某個用戶
通常分配角色是由dba來完成的,若是要以其餘用戶身份分配角色,則要求用戶必須具備grant any role的系統權限。
sql>grant 角色名 to blake with admin option;
由於我給了with admin option選項,因此,blake能夠把system分配給它的角色分配給別的用戶。
五、刪除角色
使用drop role,通常是dba來執行的,如用其餘用戶則要求該用戶具備drop any role系統權限。
sql>drop role 角色名;
六、顯示角色信息
(1)顯示全部角色
sql>select * from dba_roles;
(2)顯示角色具備的系統權限
sql>select privilege,admin_option from role_sys_privs where role='角色名';
(3)顯示角色具備的對象權限
經過查詢數據字典視圖dba_tab_privs能夠查看角色具備的對象權限或是列的權限。
(4)顯示用戶具備的角色及默認角色
當以用戶的身份鏈接到數據庫時,Oracle會自動的激活默認的角色,經過查詢數據字典視圖dba_role_privs能夠顯示某個用戶具備的全部角色及當前默認的橘色。
sql>select granted_role,default_role from dba_role_privs where grantee='用戶名';
出處:http://www.cnblogs.com/BeautyOfCode/archive/2010/09/28/1837239.html