Insert-Abfrage - executeUpdate Rückgabe -1
Ich versuche zum einfügen von Datensätzen in SQL Server mithilfe von jdbc conn (in java).
Ich bin in der Lage, um einen insert in SQL, wenn ich manuell kopieren Sie die Abfrage-Anweisung in der java-Datei. Aber es ist nicht das einfügen von dem code?
Bitte um Hilfe, wo bin ich Begehen Fehler?
PreparedStatement preparedStatement = null;
if (conn != null) {
System.out.println("Connection Successful!");
}
//Create a Statement object
Statement sql_stmt = conn.createStatement();
//Create a Statement object
Statement sql_stmt_1 = conn.createStatement();
//Result Set for Prouduct Table
ResultSet rs = sql_stmt.executeQuery("SELECT MAX(ID), MAX(RG_ID), MAX(WG_ID) FROM " + strDBName + ".[dbo].Product");
if ( rs.next() ) {
//Retrieve the auto generated key(s).
intID = rs.getInt(1);
intRG_ID = rs.getInt(2);
intWG_ID = rs.getInt(3);
}
for (int iCount = 0 ;iCount < arrListLevel_1_Unique.size(); iCount++)
{
//Result Set for Prouduct Table
sql_stmt_1.executeUpdate("\n IF NOT EXISTS(SELECT 1 FROM " + strDBName + ".[dbo].Product WHERE [Name] NOT LIKE '" + arrListLevel_1_Unique.get(iCount) + "') "
+ "\nINSERT INTO " + strDBName + ".[dbo].Product ([Name] ,"
+ "[RG_ID],[WG_ID],[Parent_Product]) "
+ "VALUES ( '" + arrListLevel_1_Unique.get(iCount) + "',"
+ + (intWG_ID + intRowIncrement) + ", " + (intWG_ID + intRowIncrement + 1) + ", 5828)");
intRowIncrement++ ;
}
rs.close();
sql_stmt.close();
sql_stmt_1.close();
//Close the database connection
conn.close();
- Bitte helfen Sie. Dank
- können Sie extrahieren Sie Ihre SQL-Abfrage und nur posten, dass? Zu viel code, denke ich.
- Wenn Sie helfen wollen, du brauchen Sie zu reduzieren, den code in das kleinstmögliche fragment veranschaulicht, das problem
- Hi Alle, ich bearbeitet den code für die Lesbarkeit. Ist sql_stmt_1.executeUpdate (); ist nicht der richtige Anruf zum einfügen von Daten in sql-Tabelle ?
- Sie haben
NOT EXISTS
undWHERE Name NOT LIKE
. Sind Sie sicher, dass Sie brauchen, sowohl negative? - Ich hatte es für zusätzliche Validierung. Aber der insert-Abfrage, wenn ich im query analyzer aus, es funktioniert. Dadurch wird es nicht einfügen in die Tabelle.Dank
- Dann versuchen Sie es mit
executeQuery
, nichtexecuteUpdate
. Nicht sicher, welche Methode akzeptiert dieIF EXISTS...
- Anweisung. - Wenn ich nicht verwenden, WENN es VORHANDEN ist, wie der bessere Weg, um zu überprüfen, ob der Datensatz mit der [Name] nicht vorhanden ist und legen Sie es. Ich habe versucht, mit ExecuteQuery, es zeigten Ausnahme "com.microsoft.sqlserver.jdbc.SQLServerException: Die Aussage, nicht mit einem ResultSet zurückgegeben." Dank
- überprüfen Sie meine Antwort für die Beseitigung der
IF EXISTS
- lassen Sie uns weiter, diese Diskussion im chat
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei plus-Zeichen
+
in der fünften Zeile:Sonst das problem liegen kann, in der
IF ...
- Anweisung. Sie können versuchen, diese stattdessen:INSERT INTO ... SELECT ... WHERE NOT EXISTS ...
Beispiel. Aber ich denke immer noch, dass Sie brauchenWHERE NOT EXISTS( SELECT ... WHERE Name **LIKE** ...)
. Hinweis: dieLIKE
vs.NOT LIKE
.Product.Name
Feld. Sie müssen nicht sorgen zu machen über die Prüfung der Einlagen für doppelten Namen. Die Datenbank wird zu tun.Ich denke, das problem liegt am "\n", haben Sie versucht, eine Beseitigung dieser 2 "\n" und sehen, ob es funktioniert?
Eigentlich ist diese Art der Umsetzung (erstellen von SQL-string mit der string-Verkettung) ist wirklich schlecht. Zunächst ist anfällig für SQL-injection, und dann zweitens haben Sie problem, wenn der Wert eingefügt werden soll, enthält Zeichen-ein Hochkomma oder ein kaufmännisches und-Zeichen.
Verwenden Sie stattdessen "prepare-Anweisung".
Und es ist aufgeräumter, die zum speichern der SQL-string in eine variable vor der Ausführung. Damit Sie sich einloggen können, ist es (für debug-Zwecke), in etwa so etwas:
P. S. es ist nicht ratsam, verwenden Sie system.aus.println für debug, sollten Sie implementieren eine ordnungsgemäße Protokollierung system.