如何在SQL SERVER中使用程序值进行搜索

时间:2014-05-25 23:05:31

标签: java sql sql-server

我试图在SQL查询中使用从用户获取的某些值,并尝试根据该输入进行搜索。我做了一些研究,并在网上发现了这一点。

st.executeQuery("SELECT * FROM Users WHERE UserName LIKE 'userName%'");

然后我尝试将其更改为

st.executeQuery("SELECT * FROM Users WHERE UserName='userName%'");

但那没用。我也尝试使用'@userName',但这也不起作用。所以现在我在这里,因为显然我犯了一些明显的错误,或者上述方法都不正确。现在,如果我硬编码值

st.executeQuery("SELECT * FROM Users WHERE UserName='Anwer'");

它工作正常。所以我认为我在如何使用程序的值上犯了错误。 我正在使用SQL Management Studio 2012编程语言Java。

3 个答案:

答案 0 :(得分:1)

您应该使用绑定值而不是内联字符串。这容易发生SQL注入攻击(黑客巧妙地构造一个输入值,让他们运行任意SQL)。

类似的东西:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM Users WHERE UserName=?");
ps.setString(1, "Anwer");
ResultSet resultSet = ps.executeQuery();

答案 1 :(得分:0)

如果您的用户名存储在名为userName的变量中,您可以这样做:

st.executeQuery("SELECT * FROM Users WHERE UserName='" + userName + "'");

答案 2 :(得分:0)

当然,PreparedStatements是许多实现的绝佳选择。根据您的使用情况,请另外注意存储过程。存储过程可以由数据库编译,准备和优化PL / SQL,并由您的应用程序调用它。示例如下所示

String getUser= "{call getUser(?,?,?)}";
callableStatement = dbConnection.prepareCall(getUser);
callableStatement.setString(1, "sampleUserName");
callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.executeUpdate(); //Excecute Stored Procedure

String firstName = callableStatement.getString(2);
String LastName = callableStatement.getString(3);