Java 我在数据库中得到的是变量的名称,而不是变量的值
我想从文本文件的特定列中获取数据,并将其保存到数据库的特定列中。变量Java 我在数据库中得到的是变量的名称,而不是变量的值,java,mysql,jdbc,Java,Mysql,Jdbc,我想从文本文件的特定列中获取数据,并将其保存到数据库的特定列中。变量NumberOfLine保存在数据库中,但我希望该变量的值必须是某个数字(作为字符串),我不明白它为什么不起作用。你有什么建议吗 import java.io.*; import java.util.*; import java.sql.*; public class TxtFile { public static void main(String[] args) throws IOException {
NumberOfLine
保存在数据库中,但我希望该变量的值必须是某个数字(作为字符串),我不明白它为什么不起作用。你有什么建议吗
import java.io.*;
import java.util.*;
import java.sql.*;
public class TxtFile {
public static void main(String[] args) throws IOException {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/schemaDB","acc:#####","pass:#####");
System.out.print("Successful connection with MySQL!");
BufferedReader br = new BufferedReader(new FileReader("C:\\lotto.txt"));
String line;
String NumberOfLine = "";
String SecondNumber = "";
while ((line = br.readLine()) != null) {
String[] splited = line.split("\\s");
//take value of column 4 from txt file
NumberOfLine = splited[3];
//save the current number into the DB
Statement stmt=con.createStatement();
stmt.executeUpdate("INSERT INTO `kanat`(Number1) VALUE ('"+NumberOfLine+"')");
}
br.close();
con.close();
System.out.println("Finished! ");
}catch(Exception e){
System.out.println("No success! " + e);
}
}
}
插入的
语句格式不正确。关键字是VALUES
而不是VALUE
通过输出SQL文本并将其带到另一个客户端,可以很容易地对其进行调试
在那里,一条生产线做了太多的工作;而目前正在做的工作则因易受SQL注入的影响而中断
这里不需要使用字符串连接来动态准备SQL文本。而且不需要通过创建和重新创建sql和语句来反复搅动
String sql = "INSERT INTO `kanat`(Number1) VALUES ( ? )";
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
while( ... ) {
String numberOfLine = ...
ps.setString(1, numberOfLine);
ps.executeUpdate();
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
}
跟进
如果目标是简单地将新行加载到表中,从空格分隔的.txt文件中读取一个“列”,我个人不会再写低效的Java代码,处理RBAR(一行接一行)
我只需要使用内置的MySQLLOAD DATA
语句,在一个事务中处理整个文件
大概是这样的:
LOAD DATA LOCAL INFILE "/tmp/myfile.txt"
INTO TABLE mytable
FIELDS TERMINATED BY ' '
LINES TERMINATED BY '\n'
IGNORE 1 LINES
( @d1
, @d2
, @d3
, @d4
, @d5
, @d5
, @d6
)
SET mycol = TRIM(BOTH FROM @d4)
;
如果我需要加载一个异常大的文件,因为我不想让“Hugh Jass”事务破坏innodb系统表空间(我无法取回的空间),我要么拆分文件(OSsplit
命令),或者男性使用percona toolkitpt fifo split
动态地将文件拆分为管道。您可以添加一个您正在阅读的文件的(假)样本吗?请检查:)您确定您的引用都是正确的(尽管在这段代码中它们看起来很好)?这里有一些略显棘手的引号,而您插入字符串“NumberOfLine”而不是变量这一事实使我认为引号中有一些错误。可能不相关,但请使用一个准备好的语句。@PatrahiNumber1
从txt文件的第一行(头)写入DB。但是应该有从以下行写入的实际值。至少我不能发现一个可以阻止它的错误。所以可能值实际上在数据库中。所以我想知道你到底是怎么检查的。工作台是否向您显示了表的完整内容?但是,创建SQL语句的字符串连接的整个业务刚刚中断。为什么我们要花时间调试使用了众所周知易受SQL注入攻击的模式的代码。帕特拉希:说“它不起作用”对所观察到的行为几乎是无用的描述。它是否抛出编译器错误?编译成功但引发执行错误?是否显示已成功运行,但结果意外?扔给我们一根骨头,伙计!“不起作用”传达的有用信息很少。请注意,此代码示例不处理kanat表的当前内容。。。之前有报道称,它包含许多行,行的Number1值为“NumberOfLine”。在删除这些行之前,它们仍将在表中。本例中的代码执行INSERT语句。(此答案中显示的代码未经编译或测试。显然,关于读取行和获取分配给numberOfLine的值的位被省略(由三个点表示…)当我将鼠标悬停在ps.executeUpdate()上时,代码的行为是相同的。);我可以看到我想保存在DB中的值,但当我打开DB时,它只保存了变量的名称。我现在发现,当我调试它时,它为1循环插入了1000行变量的名称!这怎么可能?@Patrahi:你从表中删除了这些行吗?如果这些行在表中,它们将被删除直到它们被删除或表被截断为止。(我想您可能正在查看以前的工作中的行,并认为它们是最近一次执行时插入的。)