asp.net 개발 sql server 를 Oacle 로 변환 하 는 방법 에 대한 상세 한 설명

17238 단어 asp.netsqlserverOacle
머리말
얼마 전에 우리 회사 프로젝트 는 sql server 를 Oacle 로 옮 겨 야 했 기 때문에 인터넷 에 있 는 자료 가 비교적 적 다 는 것 을 알 게 되 었 습 니 다.그래서 여기 서 소감 을 공유 하고 문 제 를 기록 하 겠 습 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 보 겠 습 니 다.
제 가 연 구 를 좀 하고 다운 을 받았어요.
Oacle 11g 버 전 은 PL/SQL(클 라 이언 트)과 sql server 가 다른 것 은 Oacle 이 자신의 클 라 이언 트 가 없 으 면 제3자 소프트웨어 로 PL/SQL 을 실행 해 야 한 다 는 것 입 니 다.sqldeveloper 도 하나 이 고 PL/SQL 은 안정 적 이 라 고 생각 합 니 다.근 데 둘 다 설치 하면 서로 보완 할 수 있어 요.
Oacle 은 감청 없 는 오류 가 발생 하기 쉬 우 니 참고 하 시기 바 랍 니 다.
https://www.jb51.net/article/91184.htm
그리고 사용 하기
테이블 공간 만 들 기,사용자 만 들 기,인터넷 에서 다 찾 을 수 있어 요.
자,다 설치 되 었 습 니 다.다음은 sql server 에서 Oacle 로 전환 하 겠 습 니 다.
먼저,데이터 뱅 크 의 전환 입 니 다.저 는 여러 가지 방식 을 시 도 했 습 니 다.많 든 적 든 문제 가 있 습 니 다.두 개의 서로 다른 데이터 베이스 이기 때문에 마지막 으로 저 는 프로그램 전환 을 쓰기 로 결 정 했 습 니 다.
코드 붙 이기
링크 문자열

<add key="OracleConnectionString" value="Password=123;User ID=SA;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost )(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)))"/>
 
 <add key="SqlServerConnectionString" value="server=localhost;database=Table;uid=sa;pwd=123"/>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OracleClient;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TransplantSQL
{
 public partial class Form1 : Form
 {
 public static string OracleConnectionString = System.Configuration.ConfigurationSettings.AppSettings["OracleConnectionString"];
 public static string SqlServerConnectionString = System.Configuration.ConfigurationSettings.AppSettings["SqlServerConnectionString"];
 public Form1()
 {
  InitializeComponent();
 }

 private void button2_Click(object sender, EventArgs e)
 {
  OracleConnection con = new OracleConnection(OracleConnectionString);
  try
  {
  con.Open();
  if (con.State == System.Data.ConnectionState.Open)
  {
   label5.Text = "    ";
  }
  }
  catch (OracleException se)
  {
  label5.Text = "    ";
  }

  finally
  {
  con.Close();
  }
 }

 private void button3_Click(object sender, EventArgs e)
 {
  SqlConnection con = new SqlConnection(SqlServerConnectionString);
  try
  {
  con.Open();
  if (con.State == System.Data.ConnectionState.Open)
  {
   label4.Text = "    ";
  }
  }
  catch (SqlException se)
  {
  label4.Text = "    ";
  }

  finally
  {
  con.Close();
  }
 }

 private void button1_Click(object sender, EventArgs e)
 {
  if (textBox1.Text == "")
  {
  DataTable tablenames = GetTableNames();
  foreach (DataRow item in tablenames.Rows)
  {
   string tablename = item["Name"].ToString().ToUpper();
   setdata(tablename);
  }
  }
  else
  {
  setdata(textBox1.Text);
  }

  label2.Text = "  ";
 }

 private static void setdata(string tablename)
 {
  //               
  int et = Convert.ToInt32(GetSingle("select count(*) from user_tables where table_name = '" + tablename + "'"));
  if (et <= 0)
  {
  DataTable tableInfo = GetTableInfo(tablename);
  string addtablesql = "CREATE TABLE {0}({1})";
  string cs = string.Empty;
  string biaoshi = string.Empty;
  foreach (DataRow citem in tableInfo.Rows)
  {
   cs += citem["   "].ToString();
   if (citem["  "].ToString() == "int" || citem["  "].ToString() == "bit" || citem["  "].ToString() == "decimal")
   {
   cs += " NUMBER(" + (Convert.ToInt32(citem["  "]) > 38 ? 38 : Convert.ToInt32(citem["  "])) + (Convert.ToInt32(citem["    "])>0?(","+Convert.ToInt32(citem["    "])):"") + ")";
   }
   else if (citem["  "].ToString() == "nvarchar" || citem["  "].ToString() == "float")
   {
   cs += " VARCHAR2(" + (Convert.ToInt32(citem["  "]) == -1 ? 4000 : Convert.ToInt32(citem["  "]) * 2) + ")";
   }
   else if (citem["  "].ToString() == "datetime")
   {
   cs += " DATE";
   }
   
   cs += citem["  "].ToString() == "1" ? " primary key " : "";
   if (citem["  "].ToString() == "1")
   {
   biaoshi = citem["   "].ToString();
   }
   cs += citem["   "].ToString() != "" ? " default " + citem["   "].ToString() + " " : "";
   cs += citem["   "].ToString() == "1" ? "," : " NOT NULL,";
  }
  cs = cs.Substring(0, cs.Length - 1);
  string tempsql = string.Format(addtablesql, tablename, cs);
  GetSingle(tempsql);
  if (biaoshi != string.Empty)
  {
   #region                      
   int xuliehao = 0;
   try
   {
   xuliehao = Convert.ToInt32(GetSingle(string.Format(@"select Seq_{0}.nextval from sys.dual", tablename)));
   }
   catch { }
   if (xuliehao <= 0)
   {
   #region               min  
   int max = Convert.ToInt32(GetSingle(string.Format("select max({1}) from {0}", tablename, biaoshi),null));
   #endregion
   string sequence = string.Format(@"create sequence Seq_{0} start with {1} increment by 1 nomaxvalue minvalue 1 nocycle nocache", tablename, (max+1));//    
   GetSingle(sequence);
   }
   #endregion
   #region         
   string chufaqisql = string.Format(@"CREATE OR REPLACE TRIGGER T_{0} 
      BEFORE INSERT ON {0} FOR EACH ROW WHEN (new.{1} is null)
      begin
      select Seq_{0}.nextval into:new.{1} from dual;
      end;", tablename, biaoshi);//     
   GetSingle(chufaqisql);
   #endregion
   #region       
   //string weiyisql = string.Format(@"create unique index U_{0} on {0} ({1})", tablename, biaoshi);
   //GetSingle(weiyisql);
   #endregion
  }
  //int count = Convert.ToInt32(GetSingle("SELECT count(1) FROM " + tablename));
  //if (count < 10000)
  //{
  DataSet ds = Query("SELECT * FROM " + tablename);
  DataTable dt = ds.Tables[0];
  string columnsNames = string.Empty;
  string values = string.Empty;
  for (int i = 0; i < dt.Columns.Count; i++)
  {
   columnsNames += dt.Columns[i].ColumnName + ",";

  }
  columnsNames = columnsNames.Substring(0, columnsNames.Length - 1);
  foreach (DataRow dr in dt.Rows)
  {
   values = string.Empty;
   for (int i = 0; i < dt.Columns.Count; i++)
   {
   if (dr[i] != DBNull.Value)
   {
    if (dr[i].ToString() != "")
    {
    if (dt.Columns[i].DataType == Type.GetType("System.Double")
     || dt.Columns[i].DataType == Type.GetType("System.Decimal")
     || dt.Columns[i].DataType == Type.GetType("System.Int32"))
    {
     values += dr[i] + ",";
    }
    else if (dt.Columns[i].DataType == Type.GetType("System.String"))
    {
     values += "'" + dr[i].ToString().Replace('\'', '‘') + "',";
    }
    else if (dt.Columns[i].DataType == Type.GetType("System.DateTime"))
    {
     values += "to_date('" + dr[i] + "','YYYY/MM/DD HH24:MI:SS'),";
    }
    else if (dt.Columns[i].DataType == Type.GetType("System.Boolean"))
    {
     if (dr[i].ToString() == "False")
     {
     values += "0,";
     }
     else { values += "1,"; }
    }
    }
    else
    {
    values += "chr(32),";
    }
   }
   else
   {
    values += "NULL,";
   }
   }
   values = values.Substring(0, values.Length - 1);
   string osql = "Insert into " + tablename + "(" + columnsNames + ") values(" + values + ")";
   GetSingle(osql);
  }
  //}
  }
 }

 private static DataTable GetTableNames()
 {
  string sql = string.Format(@"SELECT Name FROM SysObjects Where XType='U' ORDER BY Name");
  DataSet ds = Query(sql);
  return ds.Tables[0];
 }
 private static DataTable GetTableInfo(string tableName)
 {
  string sql = string.Format(@"SELECT (case when a.colorder=1 then d.name else null end)   , 
  a.colorder     ,a.name    ,
  (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '1'else '' end)   , 
  (case when (SELECT count(*) FROM sysobjects 
  WHERE (name in (SELECT name FROM sysindexes 
  WHERE (id = a.id) AND (indid in 
  (SELECT indid FROM sysindexkeys 
  WHERE (id = a.id) AND (colid in 
  (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) 
  AND (xtype = 'PK'))>0 then '1' else '' end)   ,b.name   ,a.length      , 
  COLUMNPROPERTY(a.id,a.name,'PRECISION') as   , 
  isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as     ,(case when a.isnullable=1 then '1'else '' end)    , 
  REPLACE(REPLACE(isnull(e.text,''),'(',''),')','')    ,isnull(g.[value], ' ') AS [  ]
  FROM syscolumns a 
  left join systypes b on a.xtype=b.xusertype 
  inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' 
  left join syscomments e on a.cdefault=e.id 
  left join sys.extended_properties g on a.id=g.major_id AND a.colid=g.minor_id
  left join sys.extended_properties f on d.id=f.class and f.minor_id=0
  where b.name is not null
  And d.name='{0}' 
  order by a.id,a.colorder", tableName);
  DataSet ds = Query(sql);
  return ds.Tables[0];
 }

 public static DataSet Query(string SQLString)
 {
  using (SqlConnection connection = new SqlConnection(SqlServerConnectionString))
  {
  DataSet ds = new DataSet();
  try
  {
   connection.Open();
   SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
   command.Fill(ds, "ds");
  }
  catch (System.Data.SqlClient.SqlException ex)
  {
   throw new Exception(ex.Message);
  }
  return ds;
  }
 }

 public static object GetSingle(string SQLString)
 {
  using (OracleConnection connection = new OracleConnection(OracleConnectionString))
  {
  using (OracleCommand cmd = new OracleCommand())
  {
   try
   {
   PrepareCommand(cmd, connection, null, SQLString, null);
   object obj = cmd.ExecuteScalar();
   cmd.Parameters.Clear();
   if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
   {
    return null;
   }
   else
   {
    return obj;
   }
   }
   catch (OracleException e)
   {
   throw e;
   }
  }
  }
 }

 private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)
 {
  if (conn.State != ConnectionState.Open)
  conn.Open();
  cmd.Connection = conn;
  cmd.CommandText = cmdText;
  if (trans != null)
  cmd.Transaction = trans;
  cmd.CommandType = CommandType.Text;//cmdType;
  if (cmdParms != null)
  {


  foreach (OracleParameter parameter in cmdParms)
  {
   if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
   (parameter.Value == null))
   {
   parameter.Value = DBNull.Value;
   }
   cmd.Parameters.Add(parameter);
  }
  }
 }

 public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
 {
  using (SqlConnection connection = new SqlConnection(SqlServerConnectionString))
  {
  using (SqlCommand cmd = new SqlCommand())
  {
   try
   {
   PrepareCommand(cmd, connection, null, SQLString, cmdParms);
   object obj = cmd.ExecuteScalar();
   cmd.Parameters.Clear();
   if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
   {
    return null;
   }
   else
   {
    return obj;
   }
   }
   catch (System.Data.SqlClient.SqlException e)
   {
   throw e;
   }
  }
  }
 }

 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
 {
  if (conn.State != ConnectionState.Open)
  conn.Open();
  cmd.Connection = conn;
  cmd.CommandText = cmdText;
  if (trans != null)
  cmd.Transaction = trans;
  cmd.CommandType = CommandType.Text;//cmdType;
  if (cmdParms != null)
  {


  foreach (SqlParameter parameter in cmdParms)
  {
   if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
   (parameter.Value == null))
   {
   parameter.Value = DBNull.Value;
   }
   cmd.Parameters.Add(parameter);
  }
  }
 }
 }
}
이 코드 는 제 데이터베이스 변환 에 적응 되 어 있 습 니 다.필요 하 시 면 수정 하 셔 도 됩 니 다.
그 중에서 Oacle 은 스스로 증가 하 는 것 이 아니 라 서열 의 다른 서열 은 트리거 로 문 제 를 일 으 킬 수 있 습 니 다.
그리고 제 원래 프로그램 문자열 링크 를 Oacle 링크 로 바 꿔 서 붙 였 습 니 다.
우선System.Data.SqlClient;인용 변경System.Data.OracleClient;그리고 신문 을 잘못 본 곳 에서 다 고치 면 돼 요.Sql 에서 Oracle 로 바 꾸 면 돼 요.
그리고 제 가 잘못 보고 하지 않 았 는데 sqlserver 와 Oacle 이 다른 곳 을 붙 였 어 요.
이전 몇 개의 데 이 터 를 조회 합 니까?

select * from (SELECT * FROM Table) where rownum<100
다른 형식 은 문자열 형식 으로 바 뀌 었 습 니 다.
select to_char(기타 형식,문자열 형식)예:select to_char(sysdate,'yyyy-mm-dd') from dual문자열 캡 처
(절 취 된 문자열,시작 위치,길이)

select substr('111222',3,2) from dual
문자열 형식 이 시간 형식 으로 바 뀌 었 습 니 다.

select to_date('2017-08-03','yyyy-mm-dd') from dual
sql 매개 변수 화 자리 표시 자,@사용 할 수 없습니다:

SELECT * FROM Table where ID=:ID
시스템 시간getdate()로 변경sysdate현재 자동 증가 열 ID 가 져 오기

select Seq_Table.currval from dual
Seq_Table 은 자동 으로 열 을 늘 리 는 이름 입 니 다.표 마다 다 르 기 때문에 현 재 를 찾 아야 합 니 다.
표 설정 의 자동 성장 열 에 대응 하 는 이름
다 고 친 다음 에 프로그램 이 잘못 보고 되 지 않 으 면 운행 합 니 다.
32,64 비트 가 나 옵 니 다.어떤 문제 가 나 옵 니까?
그런데 이게 저 한 테 는 안 돼 요.그리고 이게 바 뀌 면 원래 있 던 프로젝트 에 많은 문제 가 생 길 것 같 아 요.
그래서 제 가 연 구 를 오래 했 는데 몇 가지 결과 가 나 왔 습 니 다.
우선 콘 솔 이나 창 프로그램 이 라면 프로젝트 의 첫 번 째 32 자 리 를 체크 하면 됩 니 다.

asp.net 페이지 프로그램 이 라면 쉽 지 않 을 겁 니 다.
저 는 64 비트 시스템 이 고 Oacle 과 클 라 이언 트 를 설치 합 니 다.
그리고 인터넷 에 인 스 턴 트 클 라 이언 트 32 개 설치 하 겠 다 고 했 어 요.
그리고 다음 에 프로그램 을 설치 하면 되 는데,
하지만 저 는 서버 에서 같은 방법 으로 다시 안 되 겠 습 니 다.많은 자 료 를 찾 아 아이 리 스 를 다시 설 치 했 습 니 다.(사실은 framework 를 다시 등록 해 야 합 니 다)
32 비트 버 전 을 설치 하 는 것 이 Oacle 버 전과 같 으 면 좋 습 니 다.

그때 저 는 여러 버 전 디 버 깅 을 했 습 니 다.가끔 은 Instant Client Setup 을 설치 할 때 한 점 에 걸 려 서 움 직 이지 않 습 니 다.몇 번 더 시도 해 보 세 요.안 되면 다시 찾 아 보 세 요!
설치 후 제어 판 에서 찾 을 수 있 습 니 다.

또한 백업 복원 명령 을 붙 여 CMD 로 실행 수정 매개 변 수 를 엽 니 다.

Exp sa/123@ORCL file=C:\OracleBack\back_%date:~0,4%%date:~5,2%%date:~8,2%.dmp owner=sa

IMP sa/123 BUFFER=64000 FILE=C:\OracleBack\back_20170821.dmp FROMUSER=SA TOUSER=SA
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기