Вставить запрос - executeUpdate возвращает -1 - PullRequest
2 голосов
/ 18 июля 2011

Я пытаюсь вставить записи в SQL Server, используя jdbc conn (в java).Я могу вставить в SQL, если я вручную скопировать оператор запроса в файл Java.Но это не вставка из кода?

Пожалуйста, помогите, где я совершаю ошибку?

           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();

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я думаю, что проблема заключается в "\ n", вы пытались удалить эти 2 из "\ n" и посмотреть, работает ли он?

На самом деле это реализация (создание строки SQL с конкатенацией строк)) действительно плохо.Сначала склонен к внедрению SQL, а затем, во-вторых, у вас возникнет проблема, если значение для вставки содержит одинарную кавычку или амперсанд.

Вместо этого вы должны использовать «подготовить оператор».

И еще лучше сохранить строку SQL в переменной перед ее выполнением.Таким образом, вы можете записать его (для целей отладки), примерно так:

String sqlCommand = "select * from " + tableName;
System.out.println(sqlCommand);
sqlStatement.executeUpdate(sqlCommand);

PS Не рекомендуется использовать system.out.println для отладки, вы должны реализовать правильную систему ведения журналов.

1 голос
/ 19 июля 2011

В пятом ряду есть два знака плюс +:

+ + (intWG_ID + intRowIncrement) + ...

В противном случае проблема может заключаться в выражении IF ....Вы можете попробовать это вместо:

    sql_stmt_1.executeUpdate(
        " INSERT INTO " + strDBName + ".[dbo].Product ([Name] ,"
      + "[RG_ID],[WG_ID],[Parent_Product]) "
      + " SELECT '" + arrListLevel_1_Unique.get(iCount) + "',"
      + (intWG_ID + intRowIncrement) + ", "
      + (intWG_ID + intRowIncrement + 1) + ", 5828 "
      + " WHERE NOT EXISTS( SELECT 1 FROM " + strDBName
      + ".[dbo].Product WHERE [Name] LIKE '"
      + arrListLevel_1_Unique.get(iCount) + "') "
    ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...