Heim > Artikel > Backend-Entwicklung > Ausführliche Erläuterung der Methode zum Konvertieren von SQL Server in Oracle im Asp.net-Tutorial
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 = '" + 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); } } } } }
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('111222',3,2) from dual
String-Format in Zeitformat konvertieren
select to_date('2017-08-03','yyyy-mm-dd') 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!