Maison > Article > développement back-end > Explication détaillée de la méthode de conversion du serveur SQL en Oracle dans le didacticiel asp.net
Cet article vous présente principalement les informations pertinentes sur la conversion du serveur SQL en Oracle dans le développement asp.net. L'article présente les étapes de mise en œuvre en détail à travers des exemples de codes et d'images. Il est très utile pour l'étude ou le travail de chacun. a une certaine valeur de référence et d'apprentissage. Les amis qui en ont besoin peuvent venir étudier ensemble.
Avant-propos
Car il y a quelque temps notre projet d'entreprise était de convertir le serveur SQL en Oracle, et avons constaté qu'il y avait moins d'informations sur cet aspect en ligne, alors le voici Partagez votre expérience et enregistrez les problèmes. Pas grand chose à dire ci-dessous, jetons un coup d'œil à l'introduction détaillée :
Au début, j'ai étudié pendant un moment, puis j'ai téléchargé
Version Oracle 11g et PL/SQL (client) La différence avec le serveur SQL est qu'Oracle n'a pas son propre client et doit utiliser un logiciel tiers pour exécuter PL/SQL. C'est un développeur SQL, je pense. plus stable. Mais si les deux sont installés, ils se compléteront
oracle est sujet à des erreurs telles que l'absence de surveillance, veuillez vous référer à
http://www.jb51.net/article/91184. htm
Ensuite, utilisez
pour créer des espaces de table et des utilisateurs, qui peuvent être trouvés en ligne
Une fois que tout est installé, commençons la conversion serveur SQL vers Oracle.
Tout d'abord, j'ai essayé de nombreuses façons de convertir la base de données, mais elles ont toutes eu des problèmes car il s'agissait de deux bases de données différentes. écrire un programme par moi-même. Convertir le code
et le publier
chaîne de lien
<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); } } } } }
Ce code convient à la conversion de ma base de données Si vous en avez besoin, vous pouvez le modifier
L'oracle n'a pas d'auto. -incrément, mais une séquence. L'autre séquence peut être déclenchée par C'était un peu difficile de déclencher le déclencheur, mais dans l'ensemble, tout allait bien
Ensuite, j'ai changé le lien de la chaîne de mon programme d'origine en lien oracle et je l'ai posté. ci-dessus
Tout d'abordSystem.Data.SqlClient;
J'ai changé la citation System.Data.OracleClient;
Ensuite, changez simplement tout là où l'erreur est signalée, changez-la simplement de SQL à Oracle
Ensuite. Je publierai quelques différences entre sqlserver et oracle qui ne signalent pas d'erreur
Interroger le premier numéro de données
select * from (SELECT * FROM Table) where rownum<100
Convertir d'autres formats en chaîne format
select to_char (autres formats, format de chaîne) tel que select to_char(sysdate,'yyyy-mm-dd') from dual
Interception de chaîne
(chaîne interceptée, position de départ, longueur)
select substr('111222',3,2) from dual
Convertir le format de chaîne au format d'heure
select to_date('2017-08-03','yyyy-mm-dd') from dual
espace réservé paramétré SQL, ne peut pas être utilisé avec @:
SELECT * FROM Table where ID=:ID
L'heure système
getdate()
a été modifiée en sysdate
Obtenir le ID actuel de la colonne d'incrémentation automatique
select Seq_Table.currval from dual
Seq_Table est le nom de la colonne de croissance automatique. Chaque table est différente, vous devez donc trouver le nom correspondant à la colonne de croissance automatique. colonne de croissance définie par la table
actuelle
Une fois toutes les modifications terminées, attendez que le programme ne signale pas d'erreur et s'exécute
Il y aura des problèmes cassés avec 32 et 64 bits Diverses opinions sur Internet disent que les propriétés du projet devraient être modifiées en X86 X64
Mais celles-ci n'ont fonctionné pour moi et j'ai senti que changer ces choses causerait beaucoup de problèmes pour mon original. projet
J'ai donc étudié longtemps et suis finalement arrivé à plusieurs résultats
Tout d'abord, s'il s'agit d'une console ou d'un formulaire programme, cochez simplement l'option 32 bits préférée dans le projet
S'il s'agit d'une page asp.net La procédure n'est pas si simple
Mon ordinateur est un système 64 bits et j'ai installé Oracle et le client est tous deux 64 bits. Logiquement, aucune erreur 64 bits ne devrait me être signalée
Ensuite, allez en ligne. Il a dit que je devais installer. la configuration instantanée du client 32 bits
Ensuite, j'ai téléchargé un programme d'installation et cela a fonctionné
Mais j'ai réessayé la même méthode sur le serveur et cela n'a pas beaucoup cherché. . Les informations sont finalement réinstallées (en fait, vous devez réenregistrer le framework)
Il est préférable d'installer la version 32 bits de la même manière que la version Oracle
À cette époque, j'avais téléchargé de nombreuses versions pour le débogage. Parfois, lors de l'installation d'Instant Client Setup, il restait bloqué à un certain moment. Vous pouvez essayer plusieurs fois et si cela ne fonctionne toujours pas, essayez-en une autre. !
Après l'installation, vous pouvez le trouver dans le panneau de configuration
De plus, la commande de sauvegarde et de restauration est publiée. Ouvrez-la avec CMD et exécutez-la. pour modifier les paramètres correspondants
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!