Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der Methode zum Konvertieren von SQL Server in Oracle im Asp.net-Tutorial

Ausführliche Erläuterung der Methode zum Konvertieren von SQL Server in Oracle im Asp.net-Tutorial

巴扎黑
巴扎黑Original
2017-09-01 15:05:001787Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Konvertierung von SQL Server in Oracle in der asp.net-Entwicklung vor. Die Schritte der Implementierung werden Schritt für Schritt anhand von Beispielcodes und Bildern vorgestellt. Dies ist für jedermanns Studium oder Arbeit sehr nützlich . Es hat einen gewissen Referenz- und Lernwert. Freunde, die es brauchen, können zusammenkommen und lernen.

Vorwort

Denn vor einiger Zeit bestand unser Firmenprojekt darin, SQL Server auf Oracle umzustellen, und wir stellten fest, dass es dazu weniger Informationen gab online, also hier ist es Teilen Sie Ihre Erfahrungen mit und notieren Sie die Probleme. Unten gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung:

Zuerst habe ich eine Weile studiert und dann heruntergeladen

Oracle 11g-Version und PL /SQL (Client) Der Unterschied zum SQL-Server besteht darin, dass Oracle keinen eigenen Client hat und Software von Drittanbietern verwenden muss, um PL/SQL auszuführen. Ich denke, PL/SQL ist es stabiler. Aber wenn beide installiert sind, ergänzen sie sich

Oracle ist fehleranfällig, z. B. keine Überwachung, siehe

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

Dann verwenden Sie

, um Tabellenbereiche und Benutzer zu erstellen, die online zu finden sind

Nachdem alles installiert ist, beginnen wir mit der Konvertierung

Zuerst habe ich viele Möglichkeiten ausprobiert, die Datenbank zu konvertieren, aber alle hatten einige Probleme, weil es sich um zwei verschiedene Datenbanken handelte schreibe selbst ein Programm. Konvertiere

Code und poste ihn

Linkstring


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

Dieser Code ist für meine Datenbankkonvertierung geeignet. Wenn Sie ihn benötigen, können Sie ihn ändern

Das Oracle verfügt nicht über Auto -inkrementieren, aber eine andere Sequenz kann durch ausgelöst werden. Es war etwas mühsam, den Trigger auszulösen, aber insgesamt war es ziemlich gut

Dann habe ich meinen ursprünglichen Programm-String-Link in den Oracle-Link geändert und gepostet es oben

ZuerstSystem.Data.SqlClient;Ich habe das Zitat geändert System.Data.OracleClient;

Dann einfach alles ändern, wo der Fehler gemeldet wird

Dann werde ich einige Unterschiede zwischen SQL Server und Oracle veröffentlichen, die keinen Fehler melden

Fragen Sie die erste Anzahl von Daten ab


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

Konvertieren Sie andere Formate in String-Format

wählen Sie to_char (andere Formate, String-Format) wie select to_char(sysdate,'yyyy-mm-dd') from dual

String Interception

(abgefangene Zeichenfolge, Startposition, Länge). )


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

String-Format in Zeitformat konvertieren


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

SQL-parametrisierter Platzhalter, kann nicht verwendet werden mit @:


SELECT * FROM Table where ID=:ID

Systemzeit

getdate() geändert in sysdate

Get die aktuelle Auto-Inkrement-Spalten-ID


select Seq_Table.currval from dual

Seq_Table ist der Name der automatischen Wachstumsspalte. Jede Tabelle ist anders, daher müssen Sie den entsprechenden Namen finden Automatische Wachstumsspalte, die durch die aktuelle Tabelle

festgelegt wird

Nachdem alle Änderungen abgeschlossen sind, warten Sie, bis das Programm keinen Fehler meldet und ausgeführt wird

Es werden einige fehlerhafte Probleme mit auftreten 32 und 64 Bit. Verschiedene Meinungen im Internet sagen, dass die Projekteigenschaften auf X86 X64 geändert werden sollten

Aber diese funktionierten bei mir nicht und ich hatte das Gefühl, dass eine Änderung dieser Dinge für mich viele Probleme verursachen würde ursprüngliches Projekt

Also habe ich lange studiert und bin schließlich zu mehreren Ergebnissen gekommen

Zuallererst, ob es sich um eine Konsole handelt bzw Formularprogramm, überprüfen Sie einfach die bevorzugte 32-Bit-Option im Projekt

Wenn es sich um eine asp.net-Seite handelt, ist das Verfahren nicht so einfach

Mein Computer ist ein 64-Bit-System und ich habe Oracle und der Client beide 64-Bit installiert. Logischerweise sollte mir kein 64-Bit-Fehler gemeldet werden

Dann gehe online. Es hieß, ich muss Installieren Sie das 32-Bit-Instant-Client-Setup

Dann habe ich ein Installationsprogramm heruntergeladen und es hat funktioniert

Aber ich habe die gleiche Methode erneut auf dem Server versucht und es hat nicht funktioniert Menge. Die Informationen wurden schließlich neu installiert (eigentlich müssen Sie das Framework neu registrieren)

Am besten installieren Sie die 32-Bit-Version genauso wie die Oracle-Version

Damals habe ich viele Versionen zum Debuggen heruntergeladen. Manchmal blieb es bei der Installation von Instant Client Setup an einem bestimmten Punkt hängen. Sie können es noch ein paar Mal versuchen, und wenn es immer noch nicht funktioniert, versuchen Sie es mit einem anderen eins!

Nach der Installation finden Sie es in der Systemsteuerung

Außerdem wird der Sicherungs- und Wiederherstellungsbefehl gepostet. Öffnen Sie es mit CMD und führen Sie es aus um die entsprechenden Parameter zu ändern


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

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Methode zum Konvertieren von SQL Server in Oracle im Asp.net-Tutorial. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn