C#如何无客户端连接Oracle数据库

时间:2022-09-12 21:21:29

实现功能;

       从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

       C#如何无客户端连接Oracle数据库

       5.完整代码在云盘链接:https://pan.baidu.com/s/1nvpBT4d 密码: 2343

      前台截图如下

     C#如何无客户端连接Oracle数据库

       后台代码如下

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;
}
}
}