2017-05-07 183 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

做ü試圖執行對直接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

您的代碼是不安全的,你可以很容易地得到語法錯誤或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(); 
} 

如果列一個是你必須使用setInt一個int,日期setDate , 等等。

3

你有四個方面的問題,但只有第一個是給你的當前錯誤:

  1. 單引號(')是引用的文本文字,不列名。在MS SQL Server中,可以使用雙引號(")或方括號([])引用列名,但根本不需要引用它們。

  2. 爲了防止SQL Injection攻擊,即黑客會竊取你的數據和刪除表,並防止潛在的語法錯誤,從未建立與用戶輸入的字符串,一個SQL語句,使用字符串連接。始終使用PreparedStatement

  3. 務必清理您的資源,最好使用try-with-resources

  4. 請勿將executeQuery()用於INSERT語句。使用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.

所以,你的代碼應該是:

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