>  기사  >  백엔드 개발  >  asp.net 튜토리얼에서 SQL Server를 Oracle로 변환하는 방법에 대한 자세한 설명

asp.net 튜토리얼에서 SQL Server를 Oracle로 변환하는 방법에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-09-01 15:05:001748검색

이 글에서는 asp.net 개발 시 SQL Server를 oracle로 변환하는 방법에 대한 관련 정보를 주로 소개하며, 구현 단계는 샘플 코드와 그림을 통해 단계별로 자세히 소개되며 이는 모든 사람의 학습이나 작업에 큰 의미가 있습니다. 참고학습가치, 필요한 친구들이 와서 함께 배울 수 있습니다.

머리말

얼마 전 우리 회사 프로젝트가 SQL Server를 Oracle로 전환하는 것이었기 때문에 인터넷에 이 부분에 대한 정보가 적다는 것을 알게 되었기 때문에 제 경험을 공유하고 문제를 여기에 기록하겠습니다. . 아래에서는 더 이상 말하지 않겠습니다. 자세한 소개를 살펴보겠습니다.

처음에는 잠시 공부한 후

oracle 11g 버전과 PL/SQL(클라이언트)을 다운로드했습니다. Oracle에는 자체 클라이언트가 없으며 타사 소프트웨어를 사용해야 합니다. PL/SQL을 실행하는 것은 sqldeveloper와 같습니다. 하지만 둘 다 설치하면 서로 보완됩니다

oracle을 모니터링하지 않는 등 오류가 발생하기 쉽습니다.

http://www.jb51.net/article/91184.htm

을 참조하세요. 그런 다음

을 사용하여 테이블 공간을 생성하면 사용자는 이러한 항목을 온라인에서 찾을 수 있습니다.

이제 모든 것이 설치되었으므로 SQL Server를 oracle로 변환을 시작하겠습니다

우선 데이터베이스를 변환하는 여러 가지 방법을 시도했습니다. , 하지만 모두 2개의 서로 다른 데이터베이스이기 때문에 결국에는 변환 프로그램을 직접 작성하기로 결정했습니다

코드를 게시하기로 했습니다

링크 문자열


<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 = &#39;" + tablename + "&#39;"));
  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 += "&#39;" + dr[i].ToString().Replace(&#39;\&#39;&#39;, &#39;‘&#39;) + "&#39;,";
    }
    else if (dt.Columns[i].DataType == Type.GetType("System.DateTime"))
    {
     values += "to_date(&#39;" + dr[i] + "&#39;,&#39;YYYY/MM/DD HH24:MI:SS&#39;),";
    }
    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=&#39;U&#39; 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,&#39;IsIdentity&#39;)=1 then &#39;1&#39;else &#39;&#39; 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 = &#39;PK&#39;))>0 then &#39;1&#39; else &#39;&#39; end) 主键,b.name 类型,a.length 占用字节数, 
  COLUMNPROPERTY(a.id,a.name,&#39;PRECISION&#39;) as 长度, 
  isnull(COLUMNPROPERTY(a.id,a.name,&#39;Scale&#39;),0) as 小数位数,(case when a.isnullable=1 then &#39;1&#39;else &#39;&#39; end) 允许空, 
  REPLACE(REPLACE(isnull(e.text,&#39;&#39;),&#39;(&#39;,&#39;&#39;),&#39;)&#39;,&#39;&#39;) 默认值,isnull(g.[value], &#39; &#39;) 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=&#39;U&#39; and d.name<>&#39;dtproperties&#39; 
  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=&#39;{0}&#39; 
  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);
  }
  }
 }
 }
}

이 코드는 내 데이터베이스 변환에 적합합니다. 필요하면 수정하면 됩니다

오라클은 자동으로 성장하지 않지만 다른 시퀀스는 트리거에 의해 트리거될 수 있습니다. 괜찮아

그런 다음 원래 프로그램 문자열 링크를 변경했습니다. Oracle에 대한 링크는 위에 게시되어 있습니다

먼저 System.Data.SqlClient;의 참조를 System.Data로 변경합니다. OracleClient;System.Data.SqlClient;引用 改成System.Data.OracleClient;

然后 在看报错的地方通通改掉就行了 从Sql 改为 Oracle 就行

然后我贴出一些 不报错 但是sqlserver 和oracle 不同的地方

查询前多少条数据


select * from (SELECT * FROM Table) where rownum<100

其他格式转化成字符串格式

select to_char(其他格式,字符串格式) 如select to_char(sysdate,'yyyy-mm-dd') from dual

字符串截取

(截取的字符串,开始的位置,长度)


select substr(&#39;111222&#39;,3,2) from dual

字符串格式转化为时间格式


select to_date(&#39;2017-08-03&#39;,&#39;yyyy-mm-dd&#39;) from dual

sql参数化占位符,不能用@用:


SELECT * FROM Table where ID=:ID

系统时间

getdate()改成sysdate

그런 다음 오류가 보고된 모든 항목을 변경합니다. Sql에서 Oracle로 변경하면 됩니다

그런 다음 오류를 보고하지 않는 sqlserver와 oracle의 차이점을 게시했습니다.


데이터의 첫 번째 수를 쿼리합니다

select Seq_Table.currval from dual

다른 형식을 문자열 형식으로 변환

select to_char( 다른 형식, 문자열 형식) 예: select to_char(sysdate,'yyyy-mm-dd') from Dual

문자열 가로채기

(가로 채워진 문자열, 시작 위치, 길이)

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

convert 문자열 형식으로 시간 형식으로 형식

rrreee

sql 파라미터 화 된 자리 표시 자, @:

rrreee

system time

와 함께 사용할 수 없습니다.

getdate() sysdate로 변경

현재 자동 증가 열 ID 가져오기

rrreee

Seq_Table은 자동 증가 열의 이름입니다. 테이블이 다르기 때문에 현재

테이블을 찾아야 합니다. 설정된 자동 증가 열

에 해당하는 이름을 변경한 후 프로그램이 오류를 보고하지 않을 때까지 기다렸다가 실행하세요

32와 32에서는 어떤 문제가 발생할까요? 64비트? 인터넷의 다양한 의견에서는 프로젝트 속성을 X86 X64로 변경해야 한다고 합니다

하지만 이 중 어느 것도 효과가 없었고 이러한 사항을 변경하면 원래 프로젝트에 많은 문제가 발생할 것이라고 느꼈습니다

🎜🎜그래서 오랫동안 연구해서 드디어 여러 가지 결과가 나왔습니다🎜🎜🎜🎜먼저 콘솔이나 윈도우라면 본체 프로그램이라면 프로젝트에서 선호하는 32비트 옵션을 체크해주시면 됩니다🎜🎜🎜🎜 🎜asp.net 페이지 프로그램이라면 그렇게 간단하지 않습니다🎜🎜제 컴퓨터가 64비트 시스템이므로 오라클을 설치했는데 클라이언트도 둘 다 64입니다. 논리적으로 말하면 64비트를 받아서는 안 됩니다. 그런데 인터넷에서 32비트 Instant Client Setup을 설치해야 한다고 하더군요.. 그러다가 설치프로그램을 다운받았는데, 서버에서 다시 같은 방법을 사용했더니 안되더군요. 많은 정보를 찾아보고 결국 iis를 다시 설치했습니다(사실 프레임워크를 다시 등록해야 했습니다)🎜🎜오라클 버전과 동일하게 32비트 버전을 설치하는 것이 가장 좋습니다🎜🎜🎜🎜🎜그때 다운받았습니다 여러 버전을 디버깅할 때, 때로는 Instant Client Setup을 설치할 때 특정 지점에서 멈추는 경우가 있습니다. 몇 번 더 시도해보고 여전히 작동하지 않으면 다른 것을 시도해 보세요. 🎜🎜설치 후 제어판에서 찾을 수 있습니다🎜🎜🎜🎜🎜 또한 백업 및 복원 명령을 게시합니다. CMD를 사용하여 해당 매개변수를 열고 실행하고 수정합니다🎜🎜🎜🎜rrreee

위 내용은 asp.net 튜토리얼에서 SQL Server를 Oracle로 변환하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.