2012-01-20 88 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