2015-11-20 174 views
1

我坚持使用JS从MS Access数据库中获取数据的简单查询。 连接和其他一切正常工作。MS Access,Javascript SQL“Where” - 查询

sql_query =“SELECT * FROM tblname WHERE [tbl_1] .dshb_name ='”+ showDashboard +“'AND [tbl_2] .monkpi_name ='”+ showKPI +''AND [tbl_3] .mnth =“+ DateValueHere +”“;

一切工作正常,当我删除第二部分,其中包含日期。

我得到“语法错误(缺少操作员)在查询表达式。”

+3

你是积极的,查询时,您删除第二个及部分工作正常?在我看来,Access引擎会被'[tbl_1]'和'[tbl_2]'混淆,因为'tblname'是'FROM'子句中引用的唯一数据源。 – HansUp

+1

此外,你必须格式化你的日期值为一个适当的字符串表达式,比如说:'mnth =#“+”2015/11/20“+”#“' – Gustav

回答

1

你应该使用参数化查询,像这样:

var adDate = 7; 
var adVarWChar = 202; 
var adParamInput = 1; 

// test data 
var showDashboard = "test_dshb"; 
var showKPI = "test_kpi"; 
var dateValueHere = new Date(2015, 10, 20); // November 20, 2015 

var conn = new ActiveXObject("ADODB.Connection"); 
conn.Open( 
     "Provider=Microsoft.ACE.OLEDB.12.0;" + 
     "Data Source=C:\\Users\\Public\\Database1.accdb;" 
     ); 
var cmd = new ActiveXObject("ADODB.Command"); 
cmd.ActiveConnection = conn; 
cmd.CommandText = 
     "SELECT * FROM tblname " + 
     "WHERE dshb_name=? AND monkpi_name=? AND mnth=?"; 
cmd.Parameters.Append(cmd.CreateParameter("?", adVarWChar, adParamInput, 255)); 
cmd.Parameters.Append(cmd.CreateParameter("?", adVarWChar, adParamInput, 255)); 
cmd.Parameters.Append(cmd.CreateParameter("?", adDate, adParamInput)); 

cmd.Parameters(0).Value = showDashboard; 
cmd.Parameters(1).Value = showKPI; 
cmd.Parameters(2).Value = dateValueHere.getVarDate(); 
var rst = cmd.Execute(); 
while (!rst.EOF) { 
    WScript.Echo(rst(0).Value); 
    rst.MoveNext(); 
} 

rst.Close(); 
conn.Close(); 

如果你想要检索的结果整整一个月,那么你可以做一个方式,它会

var adDate = 7; 
var adVarWChar = 202; 
var adParamInput = 1; 

// test data 
var showDashboard = "test_dshb"; 
var showKPI = "test_kpi"; 
var dateValueHere = new Date(2015, 0, 1); // January 1, 2015 

var conn = new ActiveXObject("ADODB.Connection"); 
conn.Open( 
     "Provider=Microsoft.ACE.OLEDB.12.0;" + 
     "Data Source=C:\\Users\\Public\\Database1.accdb;" 
     ); 
var cmd = new ActiveXObject("ADODB.Command"); 
cmd.ActiveConnection = conn; 
cmd.CommandText = 
     "SELECT * FROM tblname " + 
     "WHERE dshb_name=? AND monkpi_name=? " + 
      "AND mnth>=? AND mnth<DateAdd('m', 1, ?)"; 
cmd.Parameters.Append(cmd.CreateParameter("?", adVarWChar, adParamInput, 255)); 
cmd.Parameters.Append(cmd.CreateParameter("?", adVarWChar, adParamInput, 255)); 
cmd.Parameters.Append(cmd.CreateParameter("?", adDate, adParamInput)); 
cmd.Parameters.Append(cmd.CreateParameter("?", adDate, adParamInput)); 

cmd.Parameters(0).Value = showDashboard; 
cmd.Parameters(1).Value = showKPI; 
cmd.Parameters(2).Value = dateValueHere.getVarDate(); 
cmd.Parameters(3).Value = dateValueHere.getVarDate(); 
var rst = cmd.Execute(); 
while (!rst.EOF) { 
    WScript.Echo(rst(0).Value); 
    rst.MoveNext(); 
} 

rst.Close(); 
conn.Close(); 
+0

@ Gord Thompson:非常感谢,伙伴。现在一切正常,但我想使用“DateAdd函数”,而不是使用这个:... AND tbl_MonitorValues.mnth> =#“+ startMnth +”#AND tbl_MonitorValues.mnth <=#“+ endMnth +”#“。任何提示?谢谢 – Qben

+1

使用参数化查询的优点之一是您不必担心日期格式。请注意,上面的代码不使用'#'分隔符,并传递实际的日期值(使用'.getVarDate()'方法)作为参数值。如果你仍然在用日期*格式操作*,那么你要么没有使用参数化查询,要么你使用的是错误的。至于使用'DateAdd()',目前还不清楚你实际想要完成什么。你可能应该[编辑](http://stackoverflow.com/posts/33831542/edit)你的问题来显示你当前的代码和你真正想做的事情。 –