【问题标题】:Sql Query error asp.net c#Sql 查询错误 asp.net c#
【发布时间】:2013-04-03 19:04:05
【问题描述】:

我正在使用下面的代码从我的表中获取结果并将其绑定到 gridview 控件。 但我收到以下错误:

"System.Data.SqlClient.SqlException: Incorrect syntax near 'x'" at "sqlda.Fill(ds1)".

我是 ASP.NET 新手,无法编写好的查询。

SqlConnection con = new SqlConnection(connStr);
con.Open();
str = "WITH x AS (SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp) FROM AISDb where action = 'IN'), y As(SELECT *, rna = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp)FROM AISDb where action='OUT') SELECT y.ID,x.ID,x.PersonName,y.PersonName,x.PersonRFID, DtATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp) FROM x ,y where x.PersonRFID = y.PersonRFIDAnd x.rn=y.rnaAND  cast(x.Datestamp as date) = cast(y.Datestamp as date)Order By x.PersonName";
com = new SqlCommand(str, con);
sqlda = new SqlDataAdapter(com);
ds1 = new DataSet();
sqlda.Fill(ds1);

【问题讨论】:

  • 很明显,您的 SQL 语法有错误...您是否尝试过直接对数据库运行查询?
  • 是的,它给出了同样的错误,但我不明白这是什么错误

标签: c# asp.net sql-server-2008 dataset sqldatareader


【解决方案1】:

根据我的第一眼,(没有运行查询),我可以看到一些错误。

datediff有错别字。

x.PersonRFID = y.PersonRFIDAnd x.rn=y.rnaANDAND之前加空格

order前面的空格放在date)Order By

【讨论】:

  • WITH x AS (SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp) FROM AISDb where action = 'IN') , y As (SELECT *, rna = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp) FROM AISDb where action='OUT' ) SELECT y.ID,x.ID,x.PersonName,y.PersonName,x.PersonRFID, DATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp ) FROM x , y where x.PersonRFID = y.PersonRFID And x.rn=y.rna AND cast(x.Datestamp as date) = cast(y.Datestamp as date) 按 x.PersonName 排序;现在我正在使用这个查询,当用数据库而不是在 c# 中查询时它给出了很好的结果
  • 调试代码,放置断点,从Locals或Watch Window复制查询,然后粘贴到你的Management Studio中看看有什么不同
  • 您遇到的确切错误是什么?我需要更多描述来回答问题吗?
【解决方案2】:

您的查询有几个问题可能会导致您的错误。首先将DtATEDIFF 更改为DATEDIFF(这可能是一个错字)。

更重要的是,固定间距。你有领域相互运行。

在你的例子和带间距的例子中看到这个小提琴:

http://sqlfiddle.com/#!3/47f7e/1

由于这个原因,您会收到该错误:

y.PersonRFIDAnd x

最后的 x 抛出错误。修复这个和它之后的一个(在施法之前),它应该可以工作。

【讨论】:

  • WITH x AS (SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp) FROM AISDb where action = 'IN') , y As (SELECT *, rna = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY DateStamp) FROM AISDb where action='OUT' ) SELECT y.ID,x.ID,x.PersonName,y.PersonName,x.PersonRFID, DATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp ) FROM x , y where x.PersonRFID = y.PersonRFID And x.rn=y.rna AND cast(x.Datestamp as date) = cast(y.Datestamp as date) 按 x.PersonName 排序;现在我正在使用这个查询,当用数据库而不是在 c# 中查询时它给出了很好的结果
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多