如何通过 OleDb 在 MS Access 上使用通用 Table 表达式执行复杂的 SQL 查询
How to execute complex SQL queries using Common Table Expressions on MS Access via OleDb
我在 VB.NET 中使用 OledbDataAdapter
执行复杂的 SQL 查询时遇到问题。此 Sql 查询在 W3school 的 SQL Tryit 编辑器中运行良好。以下是我现有的 VB.NET 代码,是否有任何方法可以直接在 VB.NET 中执行那种 SQL 查询,或者任何人都可以更改此查询以使用相同的 VB.NET结果?.
Dim con As New OleDb.OleDbConnection
Dim dbProvider As String
Dim dbSource As String
Dim ds As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim sql As String
dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
dbSource = "Data Source = C:\database.mdb"
con.ConnectionString = dbProvider & dbSource
con.Open()
sql = "With query1 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') " _
",Query2 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') " _
"select query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime' " _
"From query1,Query2 "_
"where query1.DateAndTime=Query2.DateAndTime"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, "Log")
con.Close()
DataGridView1.DataSource = ds
当我 运行 这个代码片段时,它给出了一个错误告诉
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
非常感谢任何帮助并感谢...
问题是 Access 数据库无法处理通用 Table 表达式 (CTE) 查询。使用 SQL 服务器或尝试更改您的查询。
除了 Peter 指出 Access 中缺少 CTE 支持之外,由于引用的 CTE 都不使用递归等高级功能,因此您可以轻松地将 CTE 更改为具有相同别名的派生表,并保留原始查询。此外,使用 JOIN
连接表被认为是更好的做法,而不是 WHERE
子句。就这么简单:
SELECT query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime'
FROM
(SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') AS query1
INNER JOIN
(SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') AS Query2
ON query1.DateAndTime=Query2.DateAndTime;
我在 VB.NET 中使用 OledbDataAdapter
执行复杂的 SQL 查询时遇到问题。此 Sql 查询在 W3school 的 SQL Tryit 编辑器中运行良好。以下是我现有的 VB.NET 代码,是否有任何方法可以直接在 VB.NET 中执行那种 SQL 查询,或者任何人都可以更改此查询以使用相同的 VB.NET结果?.
Dim con As New OleDb.OleDbConnection
Dim dbProvider As String
Dim dbSource As String
Dim ds As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim sql As String
dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
dbSource = "Data Source = C:\database.mdb"
con.ConnectionString = dbProvider & dbSource
con.Open()
sql = "With query1 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') " _
",Query2 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') " _
"select query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime' " _
"From query1,Query2 "_
"where query1.DateAndTime=Query2.DateAndTime"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, "Log")
con.Close()
DataGridView1.DataSource = ds
当我 运行 这个代码片段时,它给出了一个错误告诉
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
非常感谢任何帮助并感谢...
问题是 Access 数据库无法处理通用 Table 表达式 (CTE) 查询。使用 SQL 服务器或尝试更改您的查询。
除了 Peter 指出 Access 中缺少 CTE 支持之外,由于引用的 CTE 都不使用递归等高级功能,因此您可以轻松地将 CTE 更改为具有相同别名的派生表,并保留原始查询。此外,使用 JOIN
连接表被认为是更好的做法,而不是 WHERE
子句。就这么简单:
SELECT query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime'
FROM
(SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') AS query1
INNER JOIN
(SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') AS Query2
ON query1.DateAndTime=Query2.DateAndTime;