2014-10-03 11 views
-3

C# 프로그래밍을 처음 접했고 여기에서 잘못된 것을 알고 싶었습니다. 이 스크립트는 지난 2 주 동안 정상적으로 작동했지만 이제는 호출 오류 메시지를 던집니다. 누구든지 어떤 빛을 비춰 줄 수 있습니까?C# 루프가 SQL에서 가져온 일부 변수를 실행 한 다음 실패합니다.

스크립트는 내 로컬 컴퓨터에서 실행되며 서버의 데이터베이스에 연결됩니다.

감사 벨

public void Main() 
{ 
    string SqlConn = Dts.Variables["User::SQLConn"].Value.ToString(); 
    string StartDate = Dts.Variables["PeriodStart"].Value.ToString(); 
    string EndDate = Dts.Variables["PeriodEnd"].Value.ToString(); 

    SqlConnection Conn = new SqlConnection(SqlConn); 
    SqlCommand TraderQuery = new SqlCommand("SELECT DISTINCT [Code] FROM [dbo].[Trader] ORDER BY [Code]", Conn); 
    DataTable TraderTable = new DataTable(); 
    SqlDataAdapter adapter = new SqlDataAdapter(TraderQuery); 
    adapter.Fill(TraderTable); 

    // Execute SQL Query 
    foreach (DataRow row in TraderTable.Rows) 
    { 
     string Trader = row["Code"].ToString(); 

     string VolumeRebateQuery = (
      "CREATE TABLE STA_VolumeRebate " + 
      "(" + 
      "Rank int IDENTITY(1,1) PRIMARY KEY," + 
      "TraderId varchar(100) NOT NULL," + 
      "Market varchar(10)," + 
      "Product varchar(30)," + 
      "Lots Float," + 
      "LotsOfHigherOrder Float" + 
      ")" + 

      "DECLARE @TraderName VARCHAR(10) " + 
      "DECLARE @StartDate DATE " + 
      "DECLARE @EndDate DATE " + 

      "SET @TraderName = '" + Trader + "' " + 
      "SET @StartDate = '" + StartDate + "'" + 
      "SET @EndDate = '" + EndDate + "'" + 

      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
      ";WITH MarketTotals AS (SELECT Trader.Code AS 'TraderId', MarketGrouping.Name AS 'Market', SUM(Trades.BuyQuantity + Trades.SellQuantity) AS 'Lots' " + 

      "FROM [dbo].[Trades] JOIN " + 
      "dbo.Account ON Trades.Account = Account.Id JOIN " + 
      "dbo.Trader ON Account.TraderId = Trader.Id JOIN " + 
      "dbo.Market ON Trades.Market = Market.Id JOIN " + 
      "dbo.MarketGrouping ON Market.MarketGrouping = MarketGrouping.Id " + 

      "WHERE Trader.Code = @TraderName AND Trades.[Date] BETWEEN @StartDate AND @EndDate " + 
      "AND Trades.Account NOT IN (1475) AND Trades.ExchangeFeeCurrency+Trades.ClearingFee<>0 " + 

      "GROUP BY Trader.Code, MarketGrouping.Name), " + 

      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
      "TraderTotals AS (SELECT Trader.Code AS 'TraderId', MarketGrouping.Name AS 'Market', ProductGrouping.Code AS 'Product', SUM(Trades.BuyQuantity + Trades.SellQuantity) AS 'Lots' " + 

      "FROM [dbo].[Trades] JOIN " + 
      "dbo.Account ON Trades.Account = Account.Id JOIN " + 
      "dbo.Trader ON Account.TraderId = Trader.Id JOIN " + 
      "dbo.Market ON Trades.Market = Market.Id JOIN " + 
      "dbo.MarketGrouping ON Market.MarketGrouping = MarketGrouping.Id JOIN " + 
      "dbo.ProductDetails ON Trades.Product = ProductDetails.Id JOIN " + 
      "dbo.ProductGrouping ON ProductDetails.ProductId = ProductGrouping.Id " + 

      "WHERE Trader.Code = @TraderName AND Trades.[Date] BETWEEN @StartDate AND @EndDate " + 
      "AND Trades.Account NOT IN (1475) AND Trades.ExchangeFeeCurrency+Trades.ClearingFee<>0 " + 

      "GROUP BY Trader.Code, MarketGrouping.Name, ProductGrouping.Code), " + 
      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

      "TempTBL AS (SELECT TraderTotals.*, MarketTotals.Lots AS 'LotsOfHigherOrder' " + 
      "FROM TraderTotals JOIN " + 
      "MarketTotals ON TraderTotals.Market = MarketTotals.Market), " + 

      "TempTBL2 AS (select TraderId,Market, Product, Lots,LotsOfHigherOrder, " + 
      "CASE WHEN TempTBL.Market IN ('CBOT','CME','COMEX','NYMEX') THEN 'CME' " + 
      "  WHEN TempTBL.Market IN ('LIFFE','LCP') THEN 'LIFFE' ELSE TempTBL.Market END AS 'MarketGrouping' " + 
      "from TempTBL), " + 

      "TempTBL3 AS (select TraderId,MarketGrouping, SUM(Lots) AS 'LotsOfHigherOrder' " + 
      "from TempTBL2 " + 
      "GROUP BY TraderId,MarketGrouping), " + 

      "FinalTBL AS (SELECT TempTBL2.TraderId, TempTBL2.Market, TempTBL2.Product, TempTBL2.Lots, TempTBL3.LotsOfHigherOrder " + 
      "FROM TempTBL2 LEFT JOIN " + 
      "TempTBL3 ON TempTBL3.MarketGrouping = TempTBL2.MarketGrouping) " + 

      "SELECT TraderId, Market, Product, Lots, LotsOfHigherOrder " + 
      "INTO STG_VolumeRebate " + 
      "FROM FinalTBL " + 
      "ORDER BY LotsOfHigherOrder DESC, Lots DESC " + 

      "INSERT INTO dbo.STA_VolumeRebate (TraderId, Market, Product, Lots, LotsOfHigherOrder) " + 
      "SELECT TraderId, Market, Product, Lots, LotsOfHigherOrder " + 
      "FROM STG_VolumeRebate " + 
      "WHERE Market = 'ICE OTC' " + 
      "ORDER BY LotsOfHigherOrder DESC, Lots DESC " + 

      "INSERT INTO dbo.STA_VolumeRebate (TraderId, Market, Product, Lots, LotsOfHigherOrder) " + 
      "SELECT TraderId, Market, Product, Lots, LotsOfHigherOrder " + 
      "FROM STG_VolumeRebate " + 
      "WHERE Market <> 'ICE OTC' " + 
      "ORDER BY LotsOfHigherOrder DESC, Lots DESC " + 


      "INSERT INTO dbo.VolumeRebate " + 
      "SELECT [Rank]" + 
        ",[TraderId]" + 
        ",[Market]" + 
        ",[Product]" + 
        ",[Lots]" + 
        ",[LotsOfHigherOrder]" + 
        ",(SELECT SUM(Lots) FROM dbo.STA_VolumeRebate) - SUM([Lots]) OVER (PARTITION BY [TraderId] " + 
        "ORDER BY [Rank] " + 
        "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 'LotsOfHigherOrder' " + 
      " FROM dbo.STA_VolumeRebate" + 
      " ORDER BY [Rank]" + 
       "DROP TABLE STG_VolumeRebate DROP TABLE STA_VolumeRebate"); 

     //System.Windows.Forms.MessageBox.Show(VolumeRebateQuery); 
     //System.IO.File.WriteAllText(@"C:\QueryOutput.txt", VolumeRebateQuery); 

     SqlCommand VolumeRebateExecute = new SqlCommand(VolumeRebateQuery, Conn); 
     VolumeRebateExecute.Connection.Open(); 
     MessageBox.Show("Trying to execute query for Trader " + Trader + " now"); 
     VolumeRebateExecute.ExecuteNonQuery(); 
     VolumeRebateExecute.Connection.Close(); 
} 
+0

* 실제 예외 및 스택 추적을 질문에 포함하십시오. –

+3

O'Brien이라는 새로운 상인이 있습니까? 이름을 아포스트로피로 바꾸면 매개 변수로 전환하여 문제가 해결되는지 확인할 수 있습니다. –

+0

또 다른 제안 : 효율성 향상을 위해 저장 프로 시저에서'create .. insert .. select' 쿼리의 덩어리를 가져 오는 것을 고려하십시오. – Rahul

답변

0

나는 해결책을 발견! ADO 연결에서 30 초로 설정된 시간 제한이 있으며 한 계정이이 시간보다 오래 걸립니다. 문제를 해결하려면 아래 줄을 추가하십시오! 제안 및 코드 개선을 위해 모두에게 감사드립니다! Bal

    "VolumeRebateExecute.CommandTimeout = 120;"