Thu*_*nga 2 sql database vb.net ms-access oledbdataadapter
我在使用VB.NET执行复杂的SQL查询时遇到问题OledbDataAdapter
.这个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
Run Code Online (Sandbox Code Playgroud)
当我运行此代码片段时,它会给出错误消息
无效的SQL语句; 预期'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE'.
非常感谢任何帮助,谢谢......
除了Peter在Access中缺乏CTE支持之外,由于引用的CTE都没有使用递归等高级功能,因此您可以轻松地将CTE更改为具有相同别名的Derived Tables,并保留原始查询的流程.此外,更好的做法是使用a 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;
Run Code Online (Sandbox Code Playgroud)