MS SQLServer jdbcPreparedStatement 错误

问题描述 投票:0回答:1

我想将行插入到有 118 列的表中。 我的经验是,它与 mssql-jdbc-8.2.2.jre8.jar 完美配合,但不幸的是,对于任何后续问题(我测试了从 9.2.1 到 12.8.1 的所有问题)都会返回 java.sql.BatchUpdateException,并注明118.位置的列长度无效。 118. 仅当列为 VARCHAR 或 NVARCHAR 时才会发生这种情况。 FLOAT 或其他数字类型时不会出错。因此,如果有人已经遇到过这个问题,或者知道任何解决方案,请告诉我。这是我的PreparedStatement的命令:

insert into tt
(CUSTOMER_ID,Value_date,_default,J_termek1,J_termek2,J_termek1_appl_pont,J_termek1_beh_pont,J_termek2_appl_pont,J_termek2_beh_pont,J_t
ermek1_appl_intercept,J_termek1_appl_beta,J_termek1_beh_intercept,J_termek1_beh_beta,J_t
ermek1_appl_weight,J_termek1_beh_weight,J_REL_def_STD,J_macro_correction,J_termek2_appl_intercept,J_termek2_appl_beta,J_termek2_beh_in
tercept,J_termek2_beh_beta,J_termek2_appl_weight,J_termek2_beh_weight,J_termek1_weight,J_termek2_weight,L_termek1,L_
termek2,L_termek1_appl_pont,L_termek1_beh_pont,L_termek2_appl_pont,L_termek2_beh_pont,L_termek1_appl_intercept,L_termek1_appl_beta,L_t
ermek1_beh_intercept,L_termek1_beh_beta,L_termek1_appl_weight,L_termek1_beh_weight,L_REL_def_STD,L_macro_correction,
L_termek2_appl_intercept,L_termek2_appl_beta,L_termek2_beh_intercept,L_termek2_beh_beta,L_termek2_appl_weight,L_termek2_beh_weight,L_t
ermek1_weight,L_termek2_weight,S_termek1,S_termek2,S_termek1_appl_pont,S_termek1_beh_pont,S_termek2_appl_pont,S_term
ek2_beh_pont,S_termek1_appl_intercept,S_termek1_appl_beta,S_termek1_beh_intercept,S_termek1_beh_beta,S_termek1_appl_weight,S_termek1_b
eh_weight,S_REL_def_STD,S_macro_correction,S_termek2_appl_intercept,S_termek2_appl_beta,S_termek2_beh_intercept,S_te
rmek2_beh_beta,S_termek2_appl_weight,S_termek2_beh_weight,S_termek1_weight,S_termek2_weight,O_termek1,O_termek2,O_termek1_appl_pont,O_
termek1_beh_pont,O_termek2_appl_pont,O_termek2_beh_pont,O_termek1_appl_intercept,O_termek1_appl_beta,O_termek1_beh_i
ntercept,O_termek1_beh_beta,O_termek1_appl_weight,O_termek1_beh_weight,O_REL_def_STD,O_macro_correction,O_termek2_appl_intercept,O_ter
mek2_appl_beta,O_termek2_beh_intercept,O_termek2_beh_beta,O_termek2_appl_weight,O_termek2_beh_weight,O_termek1_weigh
t,O_termek2_weight,H_termek1,H_termek2,H_termek1_appl_pont,H_termek1_beh_pont,H_termek2_appl_pont,H_termek2_beh_pont,H_termek1_appl_in
tercept,H_termek1_appl_beta,H_termek1_beh_intercept,H_termek1_beh_beta,H_termek1_appl_weight,H_termek1_beh_weight,H_
REL_def_STD,H_macro_correction,H_termek2_appl_intercept,H_termek2_appl_beta,H_termek2_beh_intercept,H_termek2_beh_beta,H_termek2_appl_
weight,H_termek2_beh_weight,H_termek1_weight,H_termek2_weight,H_atlag_pd,spare3,BEH_PD,behpd,txt1) VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

我尝试使用 NVARCHAR 而不是 VARCHAR 但没有成功。我还尝试在插入中添加一个 VARCHAR 列(我之前使用该附加列创建了一个新表),在这种情况下,错误消息表明错误发生在 119. 列(新列)。追踪:

java.sql.BatchUpdateException: A rendszer érvénytelen oszlophosszt kapott a BCP-ügyféltől a következő oszlopazonosítóhoz: 118. at 
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2042) 位于
SAS2SQL.writeToOutput(SAS2SQL.java:1098) 位于
SAS2SQL.main(SAS2SQL.java:121)

安排插入的代码部分:

        String str = stdin.readLine();
        while (str != null) {
            counter++;
            //log(str);
            split(str);
            //log(arrayToText(elemek));
            int k;
            for (int j = 0; j < fields.length; j++) {
                tip=fieldtypes[j];
                textelem=elemek[j];
                k=j+1;
                if (textelem==null)pstmt.setString(k,null);
                else {
                    if (tip==Types.VARCHAR || tip==Types.NVARCHAR ) {
                    pstmt.setString(k, textelem);
                    
                    //if (insertedRows<15) log("TXT: "+textelem);
                    }
                if (tip==Types.INTEGER ||
                    tip==Types.BIGINT ||
                    tip==Types.SMALLINT ||
                    tip==Types.TINYINT 
                         ){
                         //log2("INT:"+Float.parseFloat());
                         if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.FLOAT);
                         else pstmt.setFloat(k, Float.parseFloat(textelem));
                         }
                if (tip==Types.FLOAT ||
                    tip==Types.NUMERIC ||
                    tip==Types.DOUBLE ||
                    tip==Types.DECIMAL ) {
                         if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.DOUBLE);
                         else pstmt.setDouble(k, Double.parseDouble(textelem));
                        }
                if (tip==Types.DATE) {
                        if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.DATE);
                        else pstmt.setDate(k, java.sql.Date.valueOf(textelem));
                        //log2("DATE:"+SASResultSet.getDate(j).toString());
                     }
                if (tip==Types.TIMESTAMP) {
                        if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.TIMESTAMP);
                        else pstmt.setTimestamp(k,Timestamp.valueOf(textelem.trim()));
                     }
                if (tip==Types.TIME) {
                        if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.TIME);
                        else pstmt.setTime(k,Time.valueOf(textelem.trim()));
                        //log2("TIME:"+SASResultSet.getTime(j).toString());
                     }
                    }
                 }
            str = stdin.readLine(); 
            insertedRows++;
            pstmt.addBatch();
            bulkcounter++;  
            if (bulkcounter==batchSize){
                pstmt.executeBatch();
                pstmt.clearBatch();
                bulkcounter=0;
                if (monitor)log(getTime()+" / "+insertedRows);
                }
             //pstmt.executeUpdate();
            }
        if (bulkcounter!=0) {
            pstmt.executeBatch();
            pstmt.clearBatch();
            if (monitor)log(getTime()+" / "+insertedRows);
            }
        //if (siker==0) log(""+counter+". sor beszúrása sikertelen");   
        sqlServerConnection.commit();
        //outputConnection.commit();
        stdin.close();
        pstmt.close();
        log("Number of inserted rows: "+insertedRows); 
java sql-server jdbc prepared-statement
1个回答
0
投票

所以问题是批量复制客户端的限制比原始引擎更窄。 setUseBulkCopyForBatchInsert=false 解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.