2017-08-23 66 views
0

我需要編寫一個控制檯應用程序來查詢兩個不同服務器上的兩個數據庫:一個是SQL Server,另一個是Oracle;並將數據保存到另一個SQL Server。連接到SQL Server和Oracle服務器並將數據保存到SQL Server

我很困惑連接,我很好的連接。

能否打開連接的另一個連接裏面寫SelectInsert來?

我寫到其他服務器的連接,還與它的連接。我的問題是如何編寫插入(到其他服務器)?

sqlconn.Open(); 

SqlCommand com = new SqlCommand("SELECT Email, Badge, Name FROM PublishedWorks", sqlconn); 

using (SqlDataReader reader = com.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     Console.WriteLine(reader[0]); 
    } 
} 

我在哪裏必須寫插入?

任何人都可以幫助我嗎?

謝謝,

回答

2

你可以嘗試一些如下 - 創建它,當你從閱讀器獲得數據,你會使用的類。

public class Foo 
{ 
    public string Email { get; set; } 
    public string Badge { get; set; } 
    public string Name { get; set; } 
} 

然後我們會從我們的第一個數據庫首先得到數據如下:

public List<Foo> GetData() 
{ 
    List<Foo> dataList = new List<Foo>(); 
    string connectionString = "Connection String A"; 
    string selectStatement = "SELECT Email, Badge, Name FROM PublishedWorks"; 

    using (var con = new SqlConnection(connectionString)) 
    { 
    using (var cmd = new SqlCommand(selectStatement, con)) 
    { 
     con.Open(); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      dataList.Add(new Foo 
      { 
      Email = reader.GetString(0), 
      Badge = reader.GetString(1), 
      Name = reader.GetString(2) 
      }); 
     } 
     } 
     } 
    return dataList; 
} 

現在我們有數據,我們將它插入到另一個數據庫中,我們可以這樣做:

public void InsertData() 
{ 
    string connectionString = "Connection String B"; 
    string insertStatment = "INSERT INTO SOMETABLE (Email, Badge, Name) VALUES (@Email, @Badge, @Name)"; 
    List<Foo> dataList = GetData(); 

    if(dataList.Count > 0) 
    { 
    using (var con = new SqlConnection(connectionString)) 
    { 
     using (var cmd = new SqlCommand(insertStatment, con)) 
     { 
     con.Open(); 

     foreach (var items in dataList) 
     { 
      cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = items.Email; 
      cmd.Parameters.Add("@Badge", SqlDbType.NVarChar).Value = items.Badge; 
      cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = items.Name; 
      } 
      cmd.ExecuteNonQuery(); 
     } 
     } 
    } 
} 
+0

非常感謝你你的回答,它幫助了我很多。但請,我是否必須創建Foo類?我從SQL獲取數據? – Tuta

+1

不客氣!你不必創建一個名爲'Foo'的類,它只是一個你可以構建的例子。當你使用'SqlReader'讀取數據時,你需要將數據存儲到某個地方,以便你可以再次使用它,因爲我使用了'List ',但是你可以很容易地將它存儲在一個'DataTable'中,然後讀回它並根據需要將其插入另一個數據庫。 – Izzy

+0

可以請給我一個datatable的例子...謝謝你的幫助 – Tuta

0

可以聲明另一個連接並使用它。

sqlconn.Open(); 

SqlCommand com = new SqlCommand("SELECT Email, Badge, Name FROM PublishedWorks", sqlconn); 

using (SqlDataReader reader = com.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     // you can create another method to insert and call it from here 
    } 
} 

另外我建議使用SSIS包而不是控制檯應用程序。

2

因爲你是從Oracle將SQLSERVER,我鼓勵你使用SqlBulkCopy的;它會更快。作爲一個控制檯應用程序,你需要這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string orclString = "Data Source=orclservername:/XE;Persist Security Info=True;User Id = \"Jonathan\"; Password=safepassword"; 
     string sqlString = "Integrated Security = SSPI; Initial Catalog = sqldemo; Data Source =sqlservername"; 
     using (var orclConn = new OracleConnection(orclString)) 
     { 
      using (var orclCmd = new OracleCommand("SELECT * FROM yourschema.yourorcltable", orclConn)) 
      { 
       DataTable dT = new DataTable(); 
       var dA = new OracleDataAdapter(orclCmd); 
       dA.Fill(dT); 
       using (SqlConnection sqlConn = new SqlConnection(sqlString)) 
       { 
        sqlConn.Open(); 
        using (var bC = new SqlBulkCopy(sqlConn)) 
        { 
         bC.DestinationTableName = "yoursqltable"; 
         bC.WriteToServer(dT); 
        } 
       } 
      } 
     } 
    } 
} 

要運行它,您將需要包括對Oracle.ManagedDataAccess.ClientSystem.Data.SqlClient引用。顯然你需要自己的連接字符串。如果您需要這些幫助,請嘗試這個美妙的website

在我的例子,你可以看到如何SqlServer的第二連接嵌套在使用呼叫到Oracle中。另一種方法是在使用(OracleConnection)之前聲明DataTable,然後再使用(SqlConnection)作爲單獨的塊。在實踐中,這是我會做的,但我想演示如何在同一時間打開兩個不同的連接是完全可能的。

通過你需要特別注意有關數據類型的.NET庫從Oracle複製時請注意。例如,儘管Oracle文檔告訴您,.Net Int32的等效值爲NUMBER(10,0),但實際上該庫會將其視爲Int64。因此,我只在Oracle中使用NUMBER(9,0)。