【问题标题】:Connect to SQL Server and Oracle server and save the data to SQL Server连接到 SQL Server 和 Oracle 服务器并将数据保存到 SQL Server
【发布时间】:2017-08-23 08:38:51
【问题描述】:

我需要编写一个控制台应用程序来查询两个不同服务器上的两个数据库:一个是 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]);
    }
}

我必须在哪里写插入?

谁能帮帮我?

谢谢,

【问题讨论】:

    标签: c# sql oracle sql-server-2012


    【解决方案1】:

    您可以尝试以下方法 - 创建一个类,当您从阅读器获取数据时将使用该类。

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

    【讨论】:

    • 非常感谢您的回答,这对我帮助很大。但是拜托,我必须创建 Foo 类吗?我从 SQL 获取数据??
    • 不客气!您不必创建一个名为Foo 的类,它只是一个可以构建的示例。当您使用SqlReader 读取数据时,您需要将返回的数据存储在某处,以便您可以再次使用它,为此我使用了List&lt;T&gt;,但您可以轻松地将其存储在DataTable 中,然后再读回根据需要将其插入另一个数据库。
    • 你能给我一个数据表的例子吗...谢谢你的帮助
    【解决方案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 的 using 调用中的。另一种方法是在 using (OracleConnection) 之前声明 DataTable,然后将 using (SqlConnection) 作为单独的块。在实践中,我会这样做,但我想演示如何完全有可能同时打开两个不同的连接。

    请注意,通过 .Net 库从 Oracle 复制时,您需要特别注意数据类型。例如,尽管 Oracle 文档告诉您 .Net Int32 的等价物是 NUMBER(10,0),但实际上该库会将其视为 Int64。因此,对于整数,我只在 Oracle 中使用 NUMBER(9,0)。

    【讨论】:

      【解决方案3】:

      声明另一个连接并使用它是可以的。

      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 包而不是控制台应用程序。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        相关资源
        最近更新 更多