许多表加入java访问SQL

时间:2016-11-22 17:46:55

标签: java sql ms-access

我正在尝试使用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);

4 个答案:

答案 0 :(得分:0)

之间没有空格
  1. 最后一栏和'FROM'字样
  2. “FROM”和“ON”中的最后一个表格
  3. Client.Prénom=?和'GROUP BY'
  4. 它应该是这样的:

    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中删除)。