gqinvs 发表于 2017-12-13 16:52:17

asp.net 开发 sql server 转 oracle

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>  
   {
  
         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 1nomaxvalue minvalue 1 nocyclenocache", 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;
  
               string columnsNames = string.Empty;
  
               string values = string.Empty;
  
               for (int i = 0; i < dt.Columns.Count; i++)
  
               {
  
                     columnsNames += dt.Columns.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 != DBNull.Value)
  
                         {
  
                           if (dr.ToString() != "")
  
                           {
  
                                 if (dt.Columns.DataType == Type.GetType("System.Double")
  
                                     || dt.Columns.DataType == Type.GetType("System.Decimal")
  
                                     || dt.Columns.DataType == Type.GetType("System.Int32"))
  
                                 {
  
                                     values += dr + ",";
  
                                 }
  
                                 else if (dt.Columns.DataType == Type.GetType("System.String"))
  
                                 {
  
                                     values += "'" + dr.ToString().Replace('\'', '‘') + "',";
  
                                 }
  
                                 else if (dt.Columns.DataType == Type.GetType("System.DateTime"))
  
                                 {
  
                                     values += "to_date('" + dr + "','YYYY/MM/DD HH24:MI:SS'),";
  
                                 }
  
                                 else if (dt.Columns.DataType == Type.GetType("System.Boolean"))
  
                                 {
  
                                     if (dr.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;
  
         }
  
         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., ' ') AS [说明]
  
             FROMsyscolumns 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;
  
         }
  

  
         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);
  
               }
  
             }
  
         }
  
   }
  
}
页: [1]
查看完整版本: asp.net 开发 sql server 转 oracle