2013-06-28 85 views
-6

我想數據綁定到一個GridView控件,但始終未能SQL:附近有語法錯誤('

考慮下面的代碼(SQL擴展到多行的可讀性):

protected void Page_Load(object sender, EventArgs e) 
{ 

string dsn = "foo"; 
string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS 
      'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
      'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom 
       C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
       F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate())) Budget PIVOT 
       (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10], 
       [11],[12]) AS PivotTable"; 
using (SqlConnection conn = new SqlConnection(dsn)) 
using (SqlCommand cmd = new SqlCommand(sql, conn)) 
{ 
    conn.Open(); 
    SqlDataReader reader = cmd.ExecuteReader(); 
    testGrid.DataSource = reader; 
    testGrid.DataBind(); 
} 
}  

我確定這個錯誤與查詢中的圓括號有關,但這些都是查詢工作所必需的。在SSMS中測試時,查詢通過時沒有問題。

我該如何重構這個代碼不會失敗?

編輯

我錯過As PivotTable到SQL查詢的末尾。它現在有效。對不起,這是一個無辜的錯字。感謝所有回覆的人。

+1

「BudgetPIVOT」之間缺少空格。如果您從代碼中刪除SQL,則應該嘗試在SSMS中執行它,這將有助於您調試問題。 – Taryn

+0

你可以把你的硬編碼查詢轉換成一個存儲過程,然後調用那個SP? –

+0

'BudgetPIVOT'應該是'Budget PIVOT'嗎?或者這只是一個複製過去的錯誤? – outcoldman

回答

3

缺少空間和關閉)

protected void Page_Load(object sender, EventArgs e) 
{ 

    string dsn = "foo"; 
    string sql = @"SELECT * FROM 
        (
        SELECT F.Project AS 'Project Number', F.Account AS 
          'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
          'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom 
          C ON F.Project = C.Project 
        WHERE 
          F.Project LIKE '61000.003%' AND 
          F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) 
        ) Budget PIVOT 
        (
        SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10], 
        [11],[12]) 
        )"; 
    using (SqlConnection conn = new SqlConnection(dsn)) 
    using (SqlCommand cmd = new SqlCommand(sql, conn)) 
    { 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     testGrid.DataSource = reader; 
     testGrid.DataBind(); 
    } 
}  

不過說真的,你應該創建一個存儲過程是這樣的:

CREATE PROCEDURE [GetProjectBudgetInfo] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * FROM 
         (
         SELECT F.Project AS 'Project Number', F.Account AS 
           'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
           'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom 
           C ON F.Project = C.Project 
         WHERE 
           F.Project LIKE '61000.003%' AND 
           F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) 
         ) Budget PIVOT 
         (
         SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
         ) 

END 

然後調用它的代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 

    string dsn = "foo"; 
    string sql = @"GetProjectBudgetInfo"; 
    using (SqlConnection conn = new SqlConnection(dsn)) 
    using (SqlCommand cmd = new SqlCommand(sql, conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     testGrid.DataSource = reader; 
     testGrid.DataBind(); 
    } 
}  
0

它在您的sql查詢中丟失了最後一個)。試試這個:

protected void Page_Load(object sender, EventArgs e) 
{  
    string dsn = "foo"; 
    string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS 
       'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
       'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom 
        C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
        F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate())) BudgetPIVOT 
        (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10], 
        [11],[12]))"; 

    using (SqlConnection conn = new SqlConnection(dsn)) 
    using (SqlCommand cmd = new SqlCommand(sql, conn)) 
    { 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     testGrid.DataSource = reader; 
     testGrid.DataBind(); 
    } 
}  
1

如果我計算正確,則在陳述結尾處缺少括號。

string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS 
      'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
      'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom 
       C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
       F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate())) Budget PIVOT 
       (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10], 
       [11],[12]))";