我正在尝试使用Access作为SGBD在Java(Netbeans)中使用SQL进行SELECT查询,但是当您在Access中的表之间放置的逗号(“,”)似乎不适用于Java时?
我做错了什么?
感谢@teppic的回答,但效果不好。
但是,我仍然遇到问题:它说FROM中的语法错误。真正奇怪的是,查询在Access中运行良好,其他(更简单)的查询在Java脚本中正确实现。我在我买的书中甚至在网上都没有找到关于它的文档,因为它通常用较少的表格!提前谢谢 -
PreparedStatement ps = cnx.prepareStatement("SELECT Client.Nom , Facture.Date_Achat , Client.Prénom , Facture.N°Fac , SUM(Contient1.Quantité1*PrixAchatMonture)AS Somme"+
"FROM Facture , Client , Contient1 , Monture"+
"ON Facture.N°Client=Client.N°Client AND Facture.N°Fac=Contient1.N°Fac AND Contient1.IDM=Monture.IDM "+
"WHERE Client.Nom =? AND Client.Prénom=?"+
"GROUP BY Client.Nom, Facture.Date_Achat, Client.Prénom, Facture.N°Fac",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
// ! au sens de la jointure pour l'affichage
[Microsoft] [Pilote ODBC Microsoft Access]在SELECT指令,保留字或缺少参数或不正确的标点符号
更新
我尝试在每个字符串片段的末尾添加空格但我仍然收到错误
PreparedStatement ps = cnx.prepareStatement("SELECT Client.Nom , Facture.Date_Achat , Client.Prénom , Facture.N°Fac , SUM(Contient1.Quantité1 * Monture.PrixAchatMonture) AS Somme "+ "FROM Facture "+ "INNER JOIN Client ON Facture.N°Client=Client.N°Client "+ "INNER JOIN Contient1 ON Facture.N°Fac=Contient1.N°Fac "+ "INNER JOIN Monture ON Contient1.IDM=Monture.IDM "+"WHERE Client.Nom =? AND Client.Prénom=? "+ "GROUP BY Client.Nom, Facture.Date_Achat, Client.Prénom, Facture.N°Fac ",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
答案 0 :(得分:0)
:
之间没有空格它应该是这样的:
PreparedStatement ps = cnx.prepareStatement("SELECT Client.Nom ,
Facture.Date_Achat , Client.Prénom , Facture.N°Fac , SUM(Contient1.Quantité1*PrixAchatMonture)AS Somme "+
"FROM Facture , Client , Contient1 , Monture "+
"ON Facture.N°Client=Client.N°Client AND Facture.N°Fac=Contient1.N°Fac AND Contient1.IDM=Monture.IDM "+
"WHERE Client.Nom =? AND Client.Prénom=? "+
"GROUP BY Client.Nom, Facture.Date_Achat, Client.Prénom, Facture.N°Fac",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
// ! au sens de la jointure pour l'affichage
尽管如此,您应该更改以下列名:N°Client
。也许它会给你带来问题。
答案 1 :(得分:0)
@teppic确实有一点,串联字符串的方式会导致Access SQL无效,因为你的字符串末尾没有适当的空格。我为你添加了一些空格。
PreparedStatement ps = cnx.prepareStatement (
"SELECT Client.Nom , Facture.Date_Achat , Client.Prénom , Facture.N°Fac , SUM(Contient1.Quantité1*PrixAchatMonture)AS Somme "+
"FROM Facture , Client , Contient1 , Monture "+
"ON Facture.N°Client=Client.N°Client AND Facture.N°Fac=Contient1.N°Fac AND Contient1.IDM=Monture.IDM "+
"WHERE Client.Nom =? AND Client.Prénom=? "+
"GROUP BY Client.Nom, Facture.Date_Achat, Client.Prénom, Facture.N°Fac",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY
);
此外,最好使用正确的连接,而不是依赖于旧式连接语法。在互联网上阅读这是什么。当我抬头看到加入互联网时,This link首先出现了。
答案 2 :(得分:0)
@teppic意味着你在字符串中缺少空格,因此单词将在结果中一起运行。
例如,你有
... Somme"+ "FROM Facture , Client , Contient1 , Monture"+
将导致
... SommeFROM Facture , Client , Contient1 , Monture...
尝试
...Somme "+ "FROM Facture , Client , Contient1 , Monture "+
代替。
答案 3 :(得分:0)
说到Unicode字符支持,Java的JDBC-ODBC Bridge和Microsoft的Access ODBC驱动程序根本无法很好地协同工作。
例如,在一个将Java源文件(.java文件)保存为UTF-8的Eclipse项目中,这将有效...
sql = "SELECT [Date_Achat] FROM [Facture]";
...但是这会因“参数太少而失败。预计1.” ...
sql = "SELECT [N°Fac], [Date_Achat] FROM [Facture]";
...表示Access ODBC驱动程序无法将[N°Fac]识别为表[Facture]中的字段。
但是,如果我在Eclipse中将Java源文件编码更改为Cp1252
,那么......
sql = "SELECT [N°Fac], [Date_Achat] FROM [Facture]";
......按预期工作。
所以,你有几个选择:
(1)如果您的应用程序只支持Windows-1252字符集,那么您可以将该编码用于Java源文件。
(2)您可以在Access中创建一个名为[qryFacture]的已保存查询(即“视图”)...
SELECT [N°Fac] AS [No_Fac], [Date_Achat] FROM [Facture]
...然后查询视图而不是表。
sql = "SELECT [No_Fac], [Date_Achat] FROM [qryFacture]";
(3)您可以使用UCanAccess JDBC driver代替JDBC-ODBC Bridge(无论如何已从Java 8中删除)。