2012-01-20 89 views
3

爲了防禦我的問題,我在發佈:-)之前使用了Google,Bing和StackOv。另外,我是MVC3的新手,仍然在處理框架的語法錯綜複雜問題。多行SQL語句拋出錯誤

我在下面的代碼塊中的SQL語句中有一個錯誤,這個錯誤讓我頗爲惱火。語法顯示正確。我使用Select * From簡化了SQL語句,並且它返回數據就好了。

此外,如果有更好的方法來做到這一點(不使用EF對象),絕對可以接受建議。我非常喜歡看到SQL語句的靈活性和控制權 - 無論是,還是習慣於習慣形式:-)。

在此先感謝!

@using System.Data.SqlClient; 
@using System.Configuration; 

@{ 
    Layout = null; 
} 
@{ 
    SqlConnection cn = null; 
    cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConn"].ToString()); 
    cn.Open(); 
    SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT" + 
            "tblSBT.sname," + 
            "tblSBDetails.sid," + 
            "tblSBDetails.assignedtrack," + 
            "tblSBDetails.maxtrack," + 
            "tblSBDetails.currentvals," + 
            "tblSBDetails.maxvals," + 
            "tblSBDetails.lastupdated" + 
            "FROM" +   
             "tblSBT (NOLOCK)" + 
            "LEFT OUTER JOIN" + 
             "tblSBDetails (NOLOCK)" + 
            "ON" + 
             "tblSBT.sid = tblSBDetails.sid" +      
            "WHERE" + 
            "tblSBDetails.lastupdated > DateADD(n, -5, GETDATE())"+ 
            "ORDER BY" + 
            "tblSBT.sname" +), cn); 

    var myreader = cmd.ExecuteReader(); 
} 

回答

14

如果您使用的是@符號,則不需要連接字符串,就像您在做什麼一樣。當你加入像這樣的字符串時,它也不是編寫這段代碼的最有效方式。

SqlConnection cn = null; 
cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConn"].ToString()); 
cn.Open(); 
SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT 
     tblSBT.sname, 
     tblSBDetails.sid, 
     tblSBT.sname, 
     tblSBDetails.sid, 
     tblSBDetails.assignedtrack, 
     tblSBDetails.maxtrack, 
     tblSBDetails.currentvals, 
     tblSBDetails.maxvals, 
     tblSBDetails.lastupdated 
     FROM tblSBT (NOLOCK) 
        LEFT OUTER JOIN tblSBDetails (NOLOCK) 
         ON .sid = tblSBDetails.sid 
     WHERE tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
     ORDER BY tblSBT.sname"), cn); 

var myreader = cmd.ExecuteReader(); 
+0

非常感謝,我正在學習MVC3 :-) – mynameisneo

+0

呃。我正在輸入我的答案併發布,正如SO告訴我已經發布了另一個答案。花了我很長時間,我不能讓自己刪除我自己的答案。考慮自己upvoted。 –

3

您必須在字符串之間添加一個空格。

SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT " + 
            "tblSBT.sname," + 
            "tblSBDetails.sid," + 
            "tblSBDetails.assignedtrack," + 
            "tblSBDetails.maxtrack," + 
            "tblSBDetails.currentvals," + 
            "tblSBDetails.maxvals," + 
            "tblSBDetails.lastupdated" + 
            " FROM" +   
             " tblSBT (NOLOCK)" + 
            " LEFT OUTER JOIN" + 
             " tblSBDetails (NOLOCK)" + 
            " ON" + 
             " tblSBT.sid = tblSBDetails.sid" +      
            " WHERE" + 
            " tblSBDetails.lastupdated > DateADD(n, -5, GETDATE())"+ 
            " ORDER BY" + 
            " tblSBT.sname"), cn); 

因爲你使用multiline string literal不要連接字符串@。

SqlCommand cmd = new SqlCommand(@"SELECT DISTINCT tblSBT.sname,tblSBDetails.sid, 
           tblSBDetails.assignedtrack, 
           tblSBDetails.maxtrack, 
           tblSBDetails.currentvals, 
           tblSBDetails.maxvals, 
           tblSBDetails.lastupdated 
           FROM tblSBT (NOLOCK) 
           LEFT OUTER JOIN 
           tblSBDetails (NOLOCK) 
           ON tblSBT.sid = tblSBDetails.sid 
           WHERE tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
           ORDER BY tblSBT.sname",cn); 

;

+0

感謝您的幫助! – mynameisneo

2

更好的調試方法是將字符串變量=設置爲整個SQL語句,然後將其複製並粘貼到SQL Server Mgmt Studio中。您可能已經看到代碼一起運行並確定了您的問題。

此外,我不認爲你真的在這裏理解@符號的用法。只有你的第一行「SELECT DISTINCT」被視爲一個文字,其餘的連接字符串只是字符串,而不是字符串。其實,在這種情況下甚至不重要。

你大概的意思是

SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT 
           tblSBT.sname, 
           tblSBDetails.sid, 
           tblSBDetails.assignedtrack, 
           tblSBDetails.maxtrack, 
           tblSBDetails.currentvals, 
           tblSBDetails.maxvals, 
           tblSBDetails.lastupdated 
           FROM 
            tblSBT (NOLOCK) 
           LEFT OUTER JOIN 
            tblSBDetails (NOLOCK) 
           ON 
            tblSBT.sid = tblSBDetails.sid      
           WHERE 
           tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
           ORDER BY 
           tblSBT.sname"), cn); 
+0

謝謝你的回答和澄清馬特,我贊成你和其他人一樣 – mynameisneo