C#如何无客户端连接Oracle数据库
实现功能;
从Oracle中读取数据,然后复制到SqlServer数据库中
有如下几个注意项:
1.需要在app.config中添加如下节点
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/> <bindingRedirect oldVersion="4.112.0.0-4.112.9999.9999" newVersion="4.122.1.0"/> </dependentAssembly> </assemblyBinding> </runtime>
2.添加引用Oracle.ManagedDataAccess.dll使得OracleConnection使用引用Oracle.ManagedDataAccess.Client
3.计算机->右键(属性)->高级系统设置->环境变量->在最前面添加instantclient_12_2的文件地址(如果有客户端的话,可不添加环境变量配置)
4.bin文件夹下添加如下dll
5.完整代码在云盘链接:https://pan.baidu.com/s/1nvpBT4d 密码: 2343
前台截图如下
后台代码如下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Configuration; using System.Data.SqlClient; using Oracle.ManagedDataAccess.Client; namespace ExportOracleToSqlServer { public partial class OTTImport : Form { private NLog.Logger logger = new NLog.LogFactory().GetCurrentClassLogger(); public string oracleCityname = string.Empty; public OTTImport() { InitializeComponent(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string date = Convert.ToDateTime(dtpime.Text).ToString("yyyy-MM-dd"); logger.Info("DT创建完毕"); string sqlText = "select * from " + oracleCityname + " where p_day=to_date('" + date + "','yyyy-MM-dd')"; logger.Info("sql语句为:" + sqlText + ""); logger.Info("Oracleconn连接" + ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString); try { DataTable dt = GetSqlTableScheme(); //先读取ORACLE的表 long count = GetCount(date); int previousProgressValue = 0; using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString)) { logger.Info("Oracleconn连接" + ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString); conn.Open(); using (OracleCommand cmd = conn.CreateCommand()) { this.logger.Info("OracleCommand"); cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 12 * 60 * 60; cmd.CommandText = sqlText; int i = 0; using (OracleDataReader reader = cmd.ExecuteReader()) { this.logger.Info("OracleDataReader"); while (reader.Read()) { i++; dt.Rows.Add( reader["Columns1"].ToString(), reader["Columns2"].ToString(), reader["Columns3"].ToString(), reader["Columns4"].ToString(), reader["Columns5"].ToString() ); int currentProgressValue = Convert.ToInt32(i * 100 / count); if (currentProgressValue > previousProgressValue) { previousProgressValue = currentProgressValue; this.backgroundWorker1.ReportProgress(currentProgressValue,"当前进度"); } //每读取十万条数据,进行入库一次 if (i % 100000 == 0) { InsertIntoSqlServer(dt); dt = GetSqlTableScheme(); } } if (dt.Rows.Count > 0) { InsertIntoSqlServer(dt); } } } } } catch (Exception) { throw; } logger.Info("Oracle数据读取完毕"); this.backgroundWorker1.ReportProgress(0, "完成入SQL库!"); } private static DataTable GetSqlTableScheme() { DataTable dt = new DataTable(); dt.Columns.Add("Columns1", typeof(string)); dt.Columns.Add("Columns2", typeof(string)); dt.Columns.Add("Columns3", typeof(string)); dt.Columns.Add("Columns4", typeof(string)); dt.Columns.Add("Columns5", typeof(string)); return dt; } private void InsertIntoSqlServer(DataTable dt) { try { using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) { logger.Info("SqlConnection"); conn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.UseInternalTransaction)) { bulkCopy.DestinationTableName = "dbo." + txtdboname.Text.Trim() + ""; bulkCopy.BatchSize = dt.Rows.Count; bulkCopy.BulkCopyTimeout = 12 * 60 * 60; bulkCopy.ColumnMappings.Clear(); bulkCopy.ColumnMappings.Add("Columns1", "Columns1"); bulkCopy.ColumnMappings.Add("Columns2", "Columns2"); bulkCopy.ColumnMappings.Add("Columns3", "Columns3"); bulkCopy.ColumnMappings.Add("Columns4", "Columns4"); bulkCopy.ColumnMappings.Add("Columns5", "Columns5"); bulkCopy.WriteToServer(dt); } } //logger.Info("完毕"); //this.backgroundWorker1.ReportProgress(100, "全部完成!"); } catch (Exception) { throw; } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; if (e.UserState != null) { label4.Text = string.Format("{0}[{1}%]", e.UserState.ToString(), e.ProgressPercentage); } } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error == null) { MessageBox.Show("成功!"); } else { MessageBox.Show(e.Error.ToString()); } } private void button1_Click(object sender, EventArgs e) { #region 设置数据表明 switch (cobCity.Text) { case "杭州": oracleCityname = "HANGZHOU"; break; case "湖州": oracleCityname = "HUZHOU"; break; case "金华": oracleCityname = "JINHUA"; break; case "嘉兴": oracleCityname = "JIAXING"; break; case "丽水": oracleCityname = "LISHUI"; break; case "宁波": oracleCityname = "NINGBO"; break; case "衢州": oracleCityname = "QUZHOU"; break; case "绍兴": oracleCityname = "SHAOXING"; break; case "台州": oracleCityname = "TAIZHOU"; break; case "温州": oracleCityname = "WENZHOU"; break; case "舟山": oracleCityname = "ZHOUSHAN"; break; default: oracleCityname = "HANGZHOU"; break; } #endregion if (txtdboname.Text == "") { MessageBox.Show("请输入要入库的表名"); return; } else { if (backgroundWorker1.IsBusy == false) { backgroundWorker1.RunWorkerAsync(); } } } private void OTTImport_Load(object sender, EventArgs e) { cobCity.SelectedIndex = 0; } public long GetCount(string date) { long count = 0; using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString)) { string sqlText = "select count(0) from " + oracleCityname + " where p_day=to_date('" + date + "','yyyy-MM-dd')"; conn.Open(); using (OracleCommand cmd = conn.CreateCommand()) { this.logger.Info("OracleCommand"); cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 12 * 60 * 60; cmd.CommandText = sqlText; count = Convert.ToInt64(cmd.ExecuteScalar()); } conn.Close(); } return count; } } }