列名称'xxx'无效

时间:2013-11-16 01:25:43

标签: java sql sql-server-2008

我按照面向对象方法做了两个代码。其中一个是DatabaseConnection代码,您可以在其中找到服务器的查询,连接和断开连接。 我的DatabaseConnection类运行正常,但我的App类有问题,因为通过执行面向对象方法,所以我无法在App类中使用此代码:

PreparedStatment ps=connection.prepareStatement(query);
ps.setString(1,x);
ps.setInt(2,x);

...等 因为PrepareStatement在DatabaseConnection类中。 所以我用String.format替换它,我可以告诉你:

String varidProduct=new String();
String varNameProduct=new String();
String varBrandProduct=new String();
int varPriceProduct;
String varDate=new String();
int varquantStorage;

     System.out.print("Please write ID: ");
     varidProduct = input.readLine().trim();
     System.out.print("Please write product name: ");
     varNameProduct=input.readLine().trim();
     System.out.print("Please write the brand: ");
     varBrandProduct=input.readLine().trim();
     System.out.print("Ingrese el price: ");
     varPriceProduct=Integer.parseInt(input.readLine().trim());
     System.out.print("Please insert the date (day/month/year): ");
     varDate=input.readLine().trim();
     System.out.print("Ingrese la cantidad en Bodega: ");
     varquantStorage=Integer.parseInt(input.readLine().trim());

     String sqlCommandText = String.format("insert into Product values (%s,%s,%s,%d,%s,%d)",varidProduc,varNameProduct,varBrandProduct,varPriceProduct,varDate,varquantStorage);                                            





      if(connection.executeSQLcommand(sqlCommandText)>0)
                //I am calling here a method in DatabaseConnection.class
          System.out.println("The information has been inserted.");
      else
         System.out.println("The information has not been inserted.");
      }catch(Exception e){ System.out.println(e.getMessage());} 

     }

如果我只插入数字作为varidProduc,varNameProduct,varBrandProduc,varPriceProduct和varDate,系统会响应更新,但是如果我写字符串(因为在我的数据库SQL Server 2008中,这些列都是varchar,除了日期)系统响应我的“无效列名称”除外。我真的不知道我在这里做错了什么。 对不起,如果我的拼写错过了什么,我来自智利,我正在努力!哈哈

我刚刚阅读了一些关于无效列名的其他答案,但其中没有一个与我的问题有关。

感谢您的时间!如果您需要更多详细信息,请告诉我们!

3 个答案:

答案 0 :(得分:0)

如果您坚持使用/必须使用String.format构建SQL,请在SQL语句中引用字符串值:

String.format("insert into Product values ('%s','%s','%s',%d,'%s',%d)",
    varidProduc,varNameProduct,varBrandProduct,
    varPriceProduct,varDate,varquantStorage);

否则值将被解释为标识符,在本例中为列名。

答案 1 :(得分:0)

第一步是将insert语句写成更具可读性:

INSERT INTO Product (Column names here) VALUES (Column values here)

真正的问题是你的字符串值%s应该像这样转义:

'%s'

答案 2 :(得分:0)

我认为问题在于日期字符串'/'中的正斜杠,我认为你必须逃避sql的正斜杠,你必须使用'\'作为转义字符。

So finally your code should be something like this : 

After reading the date....
vardate.replace('/','\\/');

String sqlCommandText = String.format("insert into Product values ('%s','%s','%s',%d,'%s',%d)",varidProduc,varNameProduct,varBrandProduct,varPriceProduct,varDate,varquantStorage)

Try using this. Let me know if this works..