2017-05-07 55 views
0
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'IDPaciente' 

この例外が発生します。これは私のコードです:SQLServer例外:無効な列名

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管理スタジオ2012を使用しています)、正しくデータベースに接続しています。

私は間違っていますか? ありがとうございました!

+2

はすべて削除quetes '' – Sami

+0

uは、直接SSMSに対してコードを実行しようとした同じエラーを出されました? –

+0

@RyanTuosto「IDPaciente」という名前の列があります。 – Gazelle

答えて

3

してみてください、引用符を削除します。

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値のために引用しています。

+0

が進歩しましたが、それでも動作しません。引用符を取り出すと、いくつかの種類のエラーが発生します。 "John"のような値を挿入すると、 "John"または "John"の近くに不正な構文があり、無効な列名であると表示されます。おっと、私はそれを最初にチェックさせて、あなたの編集を見ていませんでした。 – Gazelle

+0

'Strig'値の引用符を保持する – Sami

+2

@Gazelleこれは、文字列リテラルを一重引用符(二重引用符で囲まれていない)で囲む必要があるためです。しかし実際の解決策は、YCF_Lによる答えで提供されています。文字列連結を使用せず、パラメータ付きのプリペアドステートメントを使用します。 –

0

列名から引用符を削除します。

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

列名は引用符で囲んでいません。削除してもう一度やり直してください。

デモ: -

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'. 
3

あなたのコードは、セキュリティで保護されていないあなたは簡単に私が代わりにPreparedStatementを使用することをお勧めの構文エラーまたはSQLインジェクションを得ることができます。

あなたはあなたのクエリに問題があり、列はそうあなたの代わりにこれを使用することができます''の間であってはならない。

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

あなたのコラムの一つは、あなたがsetIntを使用する必要がint型である場合は、もし日付setDate 、 等々。

3

のみ最初はあなたに現在のエラーを与えているのにあなたは、4つの問題があります。

  1. 一重引用符(')は、テキスト・リテラルではなく、列名を引用するためのものです。 MS SQL Serverでは、二重引用符(")または角括弧([])を使用して列名を引用できますが、引用符を付ける必要はありません。SQL Injection攻撃を防ぐために

  2. 、どこハッカーは文字列の連結を使用して、ユーザーが入力した文字列でSQL文を作成決してあなたのデータを盗むんし、あなたのテーブルを削除して、潜在的な構文エラーを防ぐために、ます。常にPreparedStatementを使用してください。

  3. 常にリソースをクリーンアップしてください。try-with-resourcesを使用することをお勧めします。

  4. INSERTステートメントにexecuteQuery()を使用しないでください。 executeUpdate()を使用してください。 javadocが言うように:

    Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE ; or an SQL statement that returns nothing, such as a DDL statement.

  5. ので

は、あなたのコードは次のようになります。

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(); 
} 
関連する問題