C# SQL语句在多行中抛出错误
为了防御性地准备我的问题,我在发布之前使用了谷歌、必应和斯塔科夫:-)。另外,我是MVC3新手,仍然在努力解决框架的语法复杂性 我在下面的代码块中的SQL语句中有一个错误,这让我感到非常困扰。语法似乎正确。我使用Select*From简化了SQL语句。。它可以很好地返回数据 此外,如果有更好的方法(不使用EF对象),请接受建议。我真的很喜欢看到SQL语句的灵活性和可控制性——或者那样,或者只是习惯于它作为习惯的一种形式:-) 提前谢谢C# SQL语句在多行中抛出错误,c#,asp.net-mvc-3,tsql,C#,Asp.net Mvc 3,Tsql,为了防御性地准备我的问题,我在发布之前使用了谷歌、必应和斯塔科夫:-)。另外,我是MVC3新手,仍然在努力解决框架的语法复杂性 我在下面的代码块中的SQL语句中有一个错误,这让我感到非常困扰。语法似乎正确。我使用Select*From简化了SQL语句。。它可以很好地返回数据 此外,如果有更好的方法(不使用EF对象),请接受建议。我真的很喜欢看到SQL语句的灵活性和可控制性——或者那样,或者只是习惯于它作为习惯的一种形式:-) 提前谢谢 @using System.Data.SqlClient;
@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();
}
您必须在字符串之间添加空格
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);
不要连接字符串,因为您正在使用@
) 如果使用@符号,则不需要像现在这样连接字符串。当您连接这样的字符串时,这也不是编写这段代码的最有效方法
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();
更好的调试方法是为整个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);
啊。我正在打印我的答案,然后把它贴了出来,就好像SO告诉我另一个答案已经贴出来一样。我花了足够长的时间,以至于我无法删除自己的答案。谢谢你的回答和澄清,Matt,我和其他人一样支持你。
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);