插入查询 - executeUpdate返回-1

时间:2011-07-18 12:43:27

标签: java sql-server jdbc

我正在尝试使用jdbc conn(在java中)将记录插入到SQL Server中。 如果我手动复制java文件中的查询语句,我能够插入到SQL中。但它不是从代码中插入的?

请帮忙,我在哪里犯错?

  

           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 个答案:

答案 0 :(得分:1)

第五行中有两个加号+

+ + (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) + "') "
    ) ;

答案 1 :(得分:1)

我认为问题出在“\ n”上,您是否尝试过消除那些“\ n”并查看它是否正常工作?

实际上这种实现(使用字符串连接构建SQL字符串)非常糟糕。首先容易出现SQL注入,然后如果要插入的值包含字符单引号或&符号,则会遇到问题。

相反,你应该使用“prepare statement”。

在执行变量之前将SQL字符串存储到变量中更为整洁。这样你就可以记录它(出于调试目的),大概是这样的:

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

P.S。建议不要使用system.out.println进行调试,应该实现正确的日志记录系统。