2016-11-22 1 views
0

Я пытаюсь выполнить запрос SELECT в SQL в Java (Netbeans), используя Access как SGBD, но когда кажется, что запятая (","), которую вы можете поместить между таблицами в Access не работает на Java?Множество таблиц, присоединяющихся к java-доступу SQL

Что я делаю неправильно?

Благодаря @teppic его ответа, но не работает much`

Однако, я до сих пор есть проблема: он говорит о синтаксической ошибке в 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 инструкции, зарезервированное слово или отсутствующего аргумента или неправильной пунктуации

Update

Я попытался добавление пробелов в конец каждого фрагмента строки, но я все еще получаю сообщение об ошибке

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); 
+1

Вы забыли пробелы в конце строк, в которые вы присоединяетесь. – teppic

+0

PierreDH, взгляните на мой ответ – BrunoDM

ответ

0

Там нет места между:

  1. последний столбец и 'FROM' слова
  2. последняя таблица в 'FROM' и 'ON'
  3. Client.Prénom =? и 'GROUP BY'

Он должен выглядеть следующим образом:

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. возможно, это тоже вызовет проблему.

+0

Однако у меня все еще есть проблема: в ней говорится о синтаксической ошибке в FROM. Что действительно странно, так это то, что запрос хорошо работает в Access, а другие (более простые) запросы были правильно реализованы в скрипте Java. Я не нашел документа об этом в книгах, которые я купил, или даже в Сети, потому что часто с меньшим количеством таблиц! Заранее спасибо –

+0

Все в порядке. Спасибо –

0

@teppic действительно имеет смысл, способ объединения строк может привести к недействительному доступу 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 пришел первым, когда я посмотрел, присоединяется к Интернету.

0

@teppic означало, что вам не хватает пробелов в ваших строках, поэтому слова будут работать вместе в результате.

Например, у вас есть

... Somme"+ "FROM Facture , Client , Contient1 , Monture"+ 

, что приведет к

... SommeFROM Facture , Client , Contient1 , Monture... 

Попробуйте

...Somme "+ "FROM Facture , Client , Contient1 , Monture "+ 

вместо этого.

+0

Спасибо вам большое за советы, это действительно поучительно! –

0

Когда речь заходит о поддержке символов Unicode, JDBC-ODBC-модем Java и драйвер ODBC от Microsoft просто не играют вместе.

Например, в проекте Eclipse, с исходного файла Java (.java файл), сохраненный в UTF-8, это будет работать ...

sql = "SELECT [Date_Achat] FROM [Facture]"; 

... но это будет терпеть неудачу с «Too несколько параметров Ожидаемый 1. " ...

sql = "SELECT [N°Fac], [Date_Achat] FROM [Facture]"; 

..., указывающий, что водитель ODBC доступа не распознает [N ° Fac] в качестве поля в таблице [фактура].

Однако, если изменить кодировку исходного файла Java для Cp1252 в Eclipse, а затем ...

sql = "SELECT [N°Fac], [Date_Achat] FROM [Facture]"; 

... работает, как ожидалось.

Итак, у вас есть несколько вариантов:

(1) Если ваше приложение может получить, лишь поддерживая Windows-1252 набор символов, то вы можете использовать эту кодировку для исходных файлов Java.

(2) Вы можете создать сохраненный запрос (то есть, "View") с именем [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 в любом случае).

Смежные вопросы