Member 14639038 Ответов: 2

Java-код не может сохранять данные excel в mysql


Уважаемый господин ,
Я написал java-код для сохранения данных excel в mysql, но он показывает исключение: java.sql.SQLException: нет значения, указанного для параметра 22.

вот код :

Что я уже пробовал:

package com.rfmsData.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;

import javax.print.DocFlavor.INPUT_STREAM;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Save2Mysql {
public static Connection conn=null;
public static PreparedStatement pstmt = null;

	public static void main(String[] args) throws IOException {
		 try {
			Class.forName ("com.mysql.cj.jdbc.Driver");
			conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/rfms", "root","root");
			String query="insert into rfmsreports values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
			pstmt = conn.prepareStatement(query);
			FileInputStream input_document = new FileInputStream(new File("E:\\RFMS Expenses1.xlsx"));
			XSSFWorkbook my_xls_workbook = new XSSFWorkbook(input_document);
			 XSSFSheet my_worksheet = my_xls_workbook.getSheetAt(0);
			   Iterator<row> rowIterator = my_worksheet.iterator(); 
               while(rowIterator.hasNext()) {
                       Row row = rowIterator.next(); 
                       Iterator<cell> cellIterator = row.cellIterator();
                               while(cellIterator.hasNext()) {
                                       Cell cell = cellIterator.next();
                                       switch(cell.getCellType()) { 
                                       case Cell.CELL_TYPE_STRING: //handle string columns
                                               pstmt.setString(1, cell.getStringCellValue());                                                                                     
                                               break;
                                       case Cell.CELL_TYPE_NUMERIC: //handle double data
                                               pstmt.setDouble(2,cell.getNumericCellValue() );
                                               break;
                                       }
                                      
                               }
               }
               pstmt.executeUpdate();
               input_document.close();
               pstmt.close();
               conn.commit();
               conn.close();
		}   
		 
               catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub
 catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
		 
		 

	}

}

Member 14639038

я уже пробовал это сделать:
пока(cellIterator.hasNext()) {
Клеток = cellIterator.далее();
if(row.getCell(1)==null)
{
месяцев = нуль;
}
еще
{
pstmt.setString(1, cell.getStringCellValue());
}

if(row.getCell(2)==null)
{
_adverExpenses = 0;
}
еще
{
pstmt.setDouble(2, cell.getNumericCellValue());
}

if(row.getCell(3)==null)
{
_photocopy=0;
}
еще
{
pstmt.setDouble(3, cell.getNumericCellValue());
}
if(row.getCell(4)==null)
{
_swachBharatExpenses = 0;
}
еще
{
pstmt.setDouble(4, cell.getNumericCellValue());
}

if(row.getCell(5)==null)
{
_postageCourierExpenses = 0;
}
еще
{
pstmt.setDouble(5, cell.getNumericCellValue());
}
if(row.getCell(6)==null)
{
_meetingConference = 0;
}
еще
{
pstmt.setDouble(6, cell.getNumericCellValue());
}

if(row.getCell(7)==null)
{
_manpowerExpensesContact=0;
}
еще
{

pstmt.setDouble(7,cell.getNumericCellValue());
}
if(row.getCell(8)==null)
{
_manpowerFlexi_staffTour=0;
}
еще
{
pstmt.setDouble(8, cell.getNumericCellValue());
}
if(row.getCell(9)==null)
{
_salary_FTS = 0;
}

еще
{
пст

Richard MacCutchan

Сообщение об ошибке совершенно ясно, вы пропускаете значение параметра. Проверьте свой цикл и убедитесь, что вы получаете правильное количество элементов из рабочего листа. Насколько я вижу из вашего кода (который нуждается в форматировании), вы устанавливаете значения только для параметров 1 и 2.

Member 14639038

но я установил значения для 29 параметров.

Richard MacCutchan

Ну, это не то, что говорится в сообщении об ошибке. И почему вы жестко кодируете все эти числа, а не используете простой цикл с индексом?

Richard Deeming

Ваш INSERT оператор имеет 30 параметров.

А код, который вы показали, задает только первые два параметра.

2 Ответов

Рейтинг:
5

Patrice T

Цитата:
java.sql.SQLException: для параметра 22 не задано значение.

Значение 22-го столбца-это то, что не исключается SQL.
Единственное, что нужно сделать, это посмотреть на значение либо в excel, либо в вашем коде с помощью отладчика.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 14639038

когда я писал эти строки:
инт рядов = my_worksheet.getLastRowNum();
короткое седла = ряд.getLastCellNum();
Системы.из.код println("нет. из седла"+седла);
он возвращает мне 22 столбца, тогда как в моем excel есть 30 столбцов

Member 14639038

понятия не имею

Рейтинг:
17

maj000

Ваша электронная таблица Excel, вероятно, содержит ячейки, которые не являются ни числовыми (CELL_TYPE_NUMERIC), ни строками (CELL_TYPE_STRING), то есть логическими значениями, пробелами, формулами или ошибками.

Оператор switch для типа ячейки ищет только ячейки, содержащие числовые или строковые значения, поэтому в строке недостаточно ячеек, содержащих эти типы, чтобы обеспечить правильное количество параметров для вашего запроса.


Member 14639038

но я установил ячейки в строковый формат

maj000

Есть ли в электронной таблице Excel пустые ячейки или скрытые столбцы?

Member 14639038

нет сэр