Java SQLServer异常:列名无效

Java SQLServer异常:列名无效,java,sql,exception,jdbc,sql-server-2012,Java,Sql,Exception,Jdbc,Sql Server 2012,我得到了这个例外。这是我的代码: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'IDPaciente' 我怀疑问题可能出在查询本身 我找了很多,找不到解决问题的办法。我尝试过刷新缓存、更改架构内的权限、重新启动sql server(我使用的是sql server management studio 2012)、正确连接到数据库,但似乎没有任何效果 我可能做错了什么? 谢谢大家! 删除引号,请尝试:

我得到了这个例外。这是我的代码:

com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'IDPaciente'
我怀疑问题可能出在查询本身

我找了很多,找不到解决问题的办法。我尝试过刷新缓存、更改架构内的权限、重新启动sql server(我使用的是sql server management studio 2012)、正确连接到数据库,但似乎没有任何效果

我可能做错了什么? 谢谢大家!

删除引号,请尝试:

    String query = "INSERT INTO Paciente('IDPaciente', 'NomePaciente', 'IdadePaciente', 'LocalidadePaciente') VALUES('"+IDTextField.getText()+"', '"+NomeTextField.getText()+"', '"+IdadeTextField.getText()+"', '"+LocalidadeTextField.getText()+"')";
    try
    {
        st = con.DatabaseConnection().createStatement();
        rs = st.executeQuery(query);
    }

同时删除
INT
值的引号。

删除列名中的引号

String query = "INSERT INTO Paciente(IDPaciente, NomePaciente, IdadePaciente, LocalidadePaciente) VALUES('"+IDTextField.getText()+"', '"+NomeTextField.getText()+"', '"+IdadeTextField.getText()+"', '"+LocalidadeTextField.getText()+"')";
try
{
    st = con.DatabaseConnection().createStatement();
    rs = st.executeQuery(query);
}

列名未在引号内键入,请删除它们,然后重试

演示:-

"INSERT INTO Paciente(IDPaciente, NomePaciente, IdadePaciente, LocalidadePaciente) VALUES('"+IDTextField.getText()+"', '"+NomeTextField.getText()+"', '"+IdadeTextField.getText()+"', '"+LocalidadeTextField.getText()+"')"
结果:-

Create table MyTable (id int , name varchar (50))
go
insert into MyTable (id,name) values (1 , 'ahmed')
insert into MyTable ('id','name') values (1 , 'ahmed')
尝试用引号再次插入它们

(1 row(s) affected)
结果:-

Create table MyTable (id int , name varchar (50))
go
insert into MyTable (id,name) values (1 , 'ahmed')
insert into MyTable ('id','name') values (1 , 'ahmed')

您的代码不安全,很容易出现语法错误或SQL注入。我建议改用PreparedStatement

您的查询有问题,列不应介于
''
之间,因此您可以使用此选项:

Msg 207, Level 16, State 1, Line 3
Invalid column name 'id'.
Msg 207, Level 16, State 1, Line 3
Invalid column name 'name'.

如果其中一列是int,则必须使用
setInt
、If date
setDate
,依此类推。

您有四个问题,尽管只有第一个问题给出了当前错误:

  • 单引号(
    )用于引用文本文字,而不是列名。在MS SQL Server中,可以使用双引号(
    )或方括号(
    []
    )引用列名,但根本不需要引用它们

  • 为了防止黑客窃取您的数据并删除您的表的攻击,并且为了防止潜在的语法错误,从不使用字符串连接使用用户输入的字符串生成SQL语句。始终使用

  • 始终清理您的资源,最好使用

  • 不要用于
    INSERT
    语句。使用。正如javadoc所说:

    执行此PreparedStatement对象中的SQL语句,该语句必须是SQL数据操作语言(DML)语句,例如插入、更新或删除;或者是不返回任何内容的SQL语句,例如DDL语句

  • 因此,您的代码应该是:

    String query = "INSERT INTO Paciente(IDPaciente, NomePaciente, IdadePaciente, "
            + "LocalidadePaciente) VALUES(?, ?, ?, ?)";
    
    try (PreparedStatement insert = con.prepareStatement(query)) {
        insert.setString(1, IDTextField.getText());
        insert.setString(2, NomeTextField.getText());
        insert.setString(3, IdadeTextField.getText());
        insert.setString(4, LocalidadeTextField.getText());
    
        insert.executeUpdate();
    }
    

    删除所有任务“”您是否尝试直接对SSM执行代码,是否引发了相同的错误?@RyanTuosto它有一个名为“IDPaciente”的列", yes@ahmedabdelqader是的,我尝试直接执行它,它给出了相同的错误
    用于引用文本文本,而不是列名。删除所有撇号,并使用
    PreparedStatement
    参数标记,而不是字符串连接。已取得一些进展,但仍不起作用。去掉引号会产生一些不同的错误。如果我插入一个像“John”这样的值,它表明我在“John”附近有一个不正确的语法,或者“John”是一个无效的列名。哎呀,让我先检查一下,没有看到您的编辑。保留
    Strig的引号values@Gazelle这是因为字符串文字应该用单引号(而不是双引号)括起来。但是YCF_L的回答提供了真正的解决方案:不要使用字符串连接,使用带参数的预处理语句。@Sami还有一件事,为什么语句在这个上下文中不返回结果集?提前谢谢