【问题标题】:SQLServer Exception: Invalid column nameSQLServer 异常:列名无效
【发布时间】:2017-10-05 08:15:24
【问题描述】:
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'IDPaciente'

我遇到了这个异常。这是我的代码:

    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);
    }

我怀疑问题可能出在查询本身。

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

我做错了什么? 谢谢!

【问题讨论】:

  • 删除所有 quetes ' '
  • 您是否尝试直接针对 SSMS 执行代码,是否引发相同的错误?
  • @RyanTuosto 它有一个名为“IDPaciente”的列,是的
  • @ahmedab​​delqader 是的,我试过直接执行它,它给出了同样的错误
  • ' 用于引用 文本文字,而不是列名。删除所有撇号,并使用PreparedStatement? 参数标记,而不是字符串连接。

标签: java sql exception jdbc sql-server-2012


【解决方案1】:

去掉引号,试试:

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 值的引号。

【讨论】:

  • 取得了一些进展,但仍然无法正常工作。取出引号会产生某种不同的错误。如果我插入像“John”这样的值,则表示“John”附近的语法不正确,或者“John”是无效的列名。哎呀,让我先检查一下,没有看到您的编辑。
  • 保留Strig 值的引号
  • @Gazelle 那是因为字符串文字应该用单引号(而不是双引号)括起来。但真正的解决方案在 YCF_L 的回答中提供:不要使用字符串连接,使用带参数的预处理语句。
  • @Sami 还有一件事,为什么语句在这种情况下不返回结果集?提前致谢
【解决方案2】:

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

您的查询有问题,列不应在'' 之间,因此您可以改用它:

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();
}

如果您的一列是 int,则必须使用 setInt,如果日期为 setDate,等等。

【讨论】:

    【解决方案3】:

    你有四个问题,虽然只有第一个是给你当前的错误:

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

    2. 为防止SQL Injection 攻击(黑客会窃取您的数据并删除您的表),并防止潜在的语法错误,从不构建 SQL 语句与用户输入的字符串,使用字符串连接。始终使用PreparedStatement

    3. 始终清理您的资源,最好使用try-with-resources

    4. 不要将executeQuery() 用于INSERT 语句。使用executeUpdate()。正如 javadoc 所说:

      执行此 PreparedStatement 对象中的 SQL 语句,该语句必须是 SQL 数据操作语言 (DML) 语句,例如 INSERTUPDATEDELETE;或不返回任何内容的 SQL 语句,例如 DDL 语句。

    所以,你的代码应该是:

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

    【讨论】:

      【解决方案4】:

      删除列名中的引号。

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

      【讨论】:

        【解决方案5】:

        列名没有在引号内输入,请删除它们并重试。

        演示:-

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

        结果:-

        (1 row(s) affected)
        

        尝试用引号再次插入它们。

        insert into MyTable ('id','name') values (1 , 'ahmed')
        

        结果:-

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 2016-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多