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

Explication détaillée de la méthode de conversion du serveur SQL en Oracle dans le didacticiel asp.net

巴扎黑
巴扎黑original
2017-09-01 15:05:001787parcourir

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 = &#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);
  }
  }
 }
 }
}

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(&#39;111222&#39;,3,2) from dual

Convertir le format de chaîne au format d'heure


select to_date(&#39;2017-08-03&#39;,&#39;yyyy-mm-dd&#39;) 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn