方法說明:先用sql語句將啓用/禁用各個約束的語句查詢出來,然後逐條執行。以下爲C#源代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OracleClient;
namespace SynDBDll
{
public class DBOprtMgr
{
OracleConnection m_conn;
public OracleConnection Conn { get { return m_conn; } }
public DBOprtMgr(string connStr)
{
m_conn = new OracleConnection(connStr);
}
public bool ForbidAllConstants()
{
List<string> forbidStrs = new List<string>();
if (!OpenConn()) return false;
string forbitSqlStr = "select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'";//該語句能查詢出很多條sql語句,每條語句禁用一個約束
OracleCommand command = new OracleCommand(forbitSqlStr, m_conn);
OracleDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string onsStr = reader.GetValue(0).ToString();
if (onsStr[onsStr.Length - 1] == ';')
onsStr = onsStr.Substring(0, onsStr.Length - 1);
forbidStrs.Add(onsStr);
}
reader.Close();
OracleTransaction theTransaction = Conn.BeginTransaction();
try
{
foreach (string oneSqlStr in forbidStrs)
ExecuteCommand(oneSqlStr, theTransaction);
}
catch
{
theTransaction.Rollback();
// 關閉數據庫連接
m_conn.Close();
return false;
}
theTransaction.Commit();
// 關閉數據庫連接
m_conn.Close();
return true;
}
public bool RestartAllConstants()
{
List<string> restartStrs = new List<string>();
if (!OpenConn()) return false;
string restartSqlStr = "select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'";//該語句能查詢出很多條sql語句,每條語句啓用一個約束
OracleCommand command = new OracleCommand(restartSqlStr, m_conn);
OracleDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string onsStr = reader.GetValue(0).ToString();
if (onsStr[onsStr.Length - 1] == ';')
onsStr = onsStr.Substring(0, onsStr.Length - 1);
restartStrs.Add(onsStr);
}
reader.Close();
OracleTransaction theTransaction = Conn.BeginTransaction();
try
{
foreach (string oneSqlStr in restartStrs)
ExecuteCommand(oneSqlStr, theTransaction);
}
catch
{
theTransaction.Rollback();
// 關閉數據庫連接
m_conn.Close();
return false;
}
theTransaction.Commit();
// 關閉數據庫連接
m_conn.Close();
return true;
}
public void ExecuteCommand(string sqlStr, OracleTransaction theTransaction)
{
if (!OpenConn()) return;
OracleCommand command = new OracleCommand(sqlStr, m_conn);
command.Transaction = theTransaction;
command.ExecuteNonQuery();
}
public bool OpenConn()
{
if (m_conn.State != ConnectionState.Open)
m_conn.Open();
if (m_conn.State != ConnectionState.Open)
{
Console.WriteLine("無法打開數據庫連接!");
return false;
}
return true;
}
}
}