在C#中查询两个数据库中的数据

时间:2017-04-17 19:25:43

标签: c# sql asp.net sql-server asp.net-mvc

我目前有一个查询,我从两个不同的数据库中获取数据,这些数据被附加到一个名为“accountbuys”的列表中。

  1. 我的第一张表有三个数据输入(3个想买股票的账户

  2. 下一个表有17个数据点(17个要买的股票)

  3. 我正在合并这些表并获得输出enter image description here

    但是,我想要的输出应该每次为3个不同的账户重复17个数据点,以便最终用户可以向下钻取并购买他想要的任何股票enter image description here

    PS:如果我想问的不清楚,请礼貌并告诉我。请尽量不要粗鲁,我还在学习StackExchange的新手!

    这是我的代码:`

    public List<BuySellModel> GetBuyDataWthAccount()
    {
        List<BuySellModel> accountbuys = new List<BuySellModel>();
    
        using (SqlConnection connectionreit = new SqlConnection(HubConnection))
        using (SqlConnection connection = new SqlConnection(PMConnection))
    
        {
    
            connectionhub.Open();
            connection.Open();
    
            SqlCommand command3 = new SqlCommand(@"SELECT distinct(table1.name) as 'Symbol' ,table2.Segment as 'Segment',table2.AllocationAmount as 'AllocationAmount',table2.PX_LAST as 'Price', 
                                                        table1.CUR_MKT_CAP as 'CMC',table1.FCFY_WITH_CUR_MKT_CAP as 'FCMC',table1.ROIC as 'ROIC', table1.ROICDELTA as 'ROICD' FROM View_REIT_Model_And_Holdings as table1
                                                        INNER JOIN [MostRecentlyInModelSelected] as table2
                                                            ON table1.name = table2.Ticker
                                                            WHERE table1.AllocationAmount != -1 AND
                                                            NOT EXISTS (SELECT NULL FROM [ViewPCData] as table3 WHERE table1.name = table3.Symbol AND table2.Segment = table3.SubsectorDescription AND table3.Objective = 'REITS' AND table3.SectorDescription != 'NULL' AND table3.SubsectorDescription != 'NULL')",
                                                        connectionreit);
            command3.CommandType = CommandType.Text;
    
            SqlCommand command4 = new SqlCommand("SELECT PortfolioAccountNumber, PortfolioDescription, SUM(TotalValue) as 'TotalValue' FROM [ViewPCData] WHERE Objective = 'REITS' GROUP BY PortfolioAccountNumber,PortfolioDescription", connection);
            command4.CommandType = CommandType.Text;
    
            var reader = command3.ExecuteReader();
            var reader1 = command4.ExecuteReader();
    
            if (reader1.HasRows)
            {
                while (reader1.Read())
                {
                    BuySellModel accountb = new BuySellModel();
                    accountb.PortfolioAccount = reader1.GetString(reader1.GetOrdinal("PortfolioAccountNumber"));
                    accountb.PortfolioDescription = reader1.GetString(reader1.GetOrdinal("PortfolioDescription"));
                    accountb.AccountAmount = reader1.GetDecimal(reader1.GetOrdinal("TotalValue"));
                    accountbuys.Add(accountb);
    
                    if (reader.HasRows)
                    {
                        //foreach(var account in accountbuys)
                        //{
    
    
                        while (reader.Read())
                        {
                            BuySellModel buy = new BuySellModel();
                            buy.Symbol = reader.GetString(reader.GetOrdinal("Symbol"));
                            buy.Segment = reader.GetString(reader.GetOrdinal("Segment"));
                            //if (accountNumber == "soand os")
                            //{
                            //    1/3 of totalaccountvalue
                            buy.AllocationAmount = (reader.GetDouble(reader.GetOrdinal("AllocationAmount")));
                            //}
                            buy.Price = reader.GetDouble(reader.GetOrdinal("Price"));
                            buy.MarketValue = reader.GetDouble(reader.GetOrdinal("CMC"));
                            buy.FCFY = reader.GetDouble(reader.GetOrdinal("FCMC"));
                            buy.ROIC = reader.GetDouble(reader.GetOrdinal("ROIC"));
                            buy.ROICdelta = reader.GetDouble(reader.GetOrdinal("ROICD"));
                            buy.Buy = true;
                            //account1 = account.accountnumber;                   
                            accountbuys.Add(buy);
    
                        }
                        //} //for loop
    
    
                    }
    
    
                } // accounts
            } //reader1.hasrows
    
            connectionhub.Close();
            connection.Close();
        }
    
        return accountbuys;
    }
    

    编辑:

    将表拆分为两个不同的列表,稍后将它们合并。这现在运作良好。似乎也适合扩展。

    public List<BuySellModel> GetBuyDataWthAccount()
        {
            List<BuySellModel> accountbuys = new List<BuySellModel>();
    
            List<Account> accounts = new List<Account>();
    
    
            using (SqlConnection connection = new SqlConnection(PMConnection))
    
            {
    
                connection.Open();
    
                SqlCommand command3 = new SqlCommand(@"SELECT distinct(table1.name) as 'Symbol' ,table2.Segment as 'Segment',table2.AllocationAmount as 'AllocationAmount',table2.PX_LAST as 'Price', 
                                                    table1.CUR_MKT_CAP as 'CMC',table1.FCFY_WITH_CUR_MKT_CAP as 'FCMC',table1.ROIC as 'ROIC', table1.ROICDELTA as 'ROICD' FROM View_Model_And_Holdings as table1
                                                    INNER JOIN [MostRecentlyInModelSelected] as table2
                                                        ON table1.name = table2.Ticker
                                                        WHERE table1.AllocationAmount != -1 AND
                                                        NOT EXISTS (SELECT NULL FROM [ViewPCData] as table3 WHERE table1.name = table3.Symbol AND table2.Segment = table3.SubsectorDescription AND table3.Objective = 'STOCKS' AND table3.SectorDescription != 'NULL' AND table3.SubsectorDescription != 'NULL')",
                                                    connectionreit);
              command3.CommandType = CommandType.Text;
    
              SqlCommand command4 = new SqlCommand("SELECT PortfolioDetail , SUM(TotalValue) as 'TotalValue' FROM [ViewPCData] WHERE Objective = 'STOCKS' GROUP BY PortfolioAccountNumber,PortfolioDescription", connection);
              command4.CommandType = CommandType.Text;
    
                var reader = command3.ExecuteReader();
                var reader1 = command4.ExecuteReader();
                if (reader1.HasRows)
                {
                    while (reader1.Read())
                    {
                        Account accountb = new Account();
                        accountb.PortfolioDetail = reader1.GetString(reader1.GetOrdinal("PortfolioDetail"));
                       // accountb.PortfolioDescription = reader1.GetString(reader1.GetOrdinal("PortfolioDescription"));
                        accountb.AccountAmount = reader1.GetDecimal(reader1.GetOrdinal("TotalValue"));
    
                        accounts.Add(accountb);
                    }
                }
                //List<BuyReits> buys = new List<BuyReits>();
                if (reader.HasRows && accounts.Count > 0)
                {
                    while (reader.Read())
                    {
                        foreach (var acc in accounts)
                        {
                            BuySellModel buy = new BuySellModel();
                            buy.Symbol = reader.GetString(reader.GetOrdinal("Symbol"));
                            buy.Segment = reader.GetString(reader.GetOrdinal("Segment"));
                            buy.AllocationAmount = (reader.GetDouble(reader.GetOrdinal("AllocationAmount")));
                            buy.Price = reader.GetDouble(reader.GetOrdinal("Price"));
                            //buy.Quantity = reader.GetInt32((reader.GetOrdinal("AllocationAmount"))/(reader.GetOrdinal("Price")));
                            buy.MarketValue = reader.GetDouble(reader.GetOrdinal("CMC"));
                            buy.FCFY = reader.GetDouble(reader.GetOrdinal("FCMC"));
                            buy.ROIC = reader.GetDouble(reader.GetOrdinal("ROIC"));
                            buy.ROICdelta = reader.GetDouble(reader.GetOrdinal("ROICD"));
                            buy.Buy = true;
                            buy.PortfolioAccount = acc.PortfolioDetail;
                            buy.AccountAmount = acc.AccountAmount;
    
                            accountbuys.Add(buy);
    
                        }
    
                    }
                }
    
                connection.Close();
    
    
            }
    
            return accountbuys;
    
        }
    

2 个答案:

答案 0 :(得分:2)

以下提供了C#层中的交叉连接(并不是说它是最好的解决方案,但它让您更接近准备好了):

using (SqlConnection connectionhub = new SqlConnection(HubConnection))
using (SqlConnection connection = new SqlConnection(PMConnection))

{

    connectionhub.Open();
    connection.Open();

    SqlCommand command3 = new SqlCommand(@"
        SELECT distinct(table1.name) as 'Symbol',
               table2.Segment as 'Segment',
               table2.AllocationAmount as 'AllocationAmount',
               table2.PX_LAST as 'Price', 
               table1.CUR_MKT_CAP as 'CMC',
               table1.FCFY_WITH_CUR_MKT_CAP as 'FCMC',
               table1.ROIC as 'ROIC', 
               table1.ROICDELTA as 'ROICD' 
          FROM View_REIT_Model_And_Holdings as table1
                INNER JOIN [MostRecentlyInModelSelected] as table2
                    ON table1.name = table2.Ticker
         WHERE table1.AllocationAmount != -1 
           AND NOT EXISTS (SELECT NULL 
                             FROM [ViewPCData] as table3 
                            WHERE table1.name = table3.Symbol 
                              AND table2.Segment = table3.SubsectorDescription 
                              AND table3.Objective = 'REITS' 
                              AND table3.SectorDescription != 'NULL' 
                              AND table3.SubsectorDescription != 'NULL')",
                                                connectionreit);
    command3.CommandType = CommandType.Text;

    SqlCommand command4 = new SqlCommand(@"
        SELECT PortfolioAccountNumber, 
               PortfolioDescription, 
               SUM(TotalValue) as 'TotalValue' 
          FROM [ViewPCData] 
         WHERE Objective = 'REITS' 
         GROUP BY PortfolioAccountNumber, PortfolioDescription", connection);
    command4.CommandType = CommandType.Text;

    var stocksDS = new DataSet();
    var stocksDA = new System.Data.SqlClient.SqlDataAdapter();
    stocksDA.SelectCommand = command3
    stocksDA.Fill(stocksDS, "stocks");

    var acctsDS = new DataSet();
    var acctsDA = new System.Data.SqlClient.SqlDataAdapter();
    acctsDA.SelectCommand = command4
    acctsDA.Fill(acctsDS, "accts");

    var stocks = stocksDS.Tables["stocks"].AsEnumerable();
    var accts = acctsDS.Tables["accts"].AsEnumerable();

    var results = (from stocksDR in stocks
                   from acctsDR in accts
                   select new BuySellModel {
                        PortfolioAccount = acctsDR["PortfolioAccountNumber"],
                        PortfolioDescription = acctsDR["PortfolioAccountDescription"],
                        AccountAmount = acctsDR["TotalValue"],
                        Symbol = stocksDR["Symbol"],
                        Segment = stocksDR["Segment"],
                        AllocationAmount = stocksDR["AllocationAmount"],
                        Price = stocksDR["Price"],
                        MarketValue = stocksDR["CMC"],
                        FCFY = stocksDR["FCMC"],
                        ROIC = stocksDR["ROIC"],
                        ROICdelta = stocksDR["ROICD"],
                        Buy = true
                    });

    foreach (BySellModel buy in results) {
        accountBuys.Add(buy);
    }

    connectionhub.Close();
    connection.Close();
}

编辑:删除了违规的圆括号。

答案 1 :(得分:0)

在不更改任何C#代码的情况下,可以通过将INNER JOIN查询中的SQL查询更改为CROSS JOIN查询来获得所需内容。

关于这种方法的一些警告:

  1. 如果包含WHERE子句,则查询将充当INNER JOIN。

  2. 交叉连接可能会明显变慢,因为查询正在寻找所有可能的组合。只有51(3 * 17)种组合可用,这不会是一个重大问题,但如果您希望将其扩展到更多客户和股票,那么性能将变得越来越差