2017-08-23 5 views
0

2つの異なるサーバー、つまりSQL ServerとOracleの2つのデータベースを照会するコンソールアプリケーションを作成する必要があります。データを別の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; } 
} 

次のように続いて、我々は我々の最初のDBから最初のデータを取得します:

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への2番目の接続は、Oracleに使用して呼び出し内にネストされたかを見ることができます。代わりに、DataTableをusing(OracleConnection)の前に宣言し、その後にusing(SqlConnection)を別のブロックとして使用することもできます。実際には、これは私がやることですが、2つの異なる接続を同時に開くことが完全に可能であることを実証したかったのです。

あなたはデータ型について特に注意する必要があります。ネットライブラリを経由してのOracleからコピーするときに注意してください。たとえば、Oracleのマニュアルでは.Net Int32に相当するものがNUMBER(10,0)であることが示されていますが、実際にはライブラリでInt64として扱われます。 intでは、OracleではNUMBER(9,0)しか使用しません。

関連する問題