我之前参与过一个PHP项目,其中准备好的语句使SELECT查询的速度提高了20%.
我想知道它是否适用于Python?我似乎无法找到任何明确表示它做或不做的事情.
声明是
SELECT * FROM tableA WHERE x = ?
Run Code Online (Sandbox Code Playgroud)
并通过java.sql.PreparedStatement'stmt'插入参数
stmt.setString(1, y); // y may be null
Run Code Online (Sandbox Code Playgroud)
如果y为null,则语句在每种情况下都不返回任何行,因为x = null它始终为false(应该是x IS NULL).一个解决方案是
SELECT * FROM tableA WHERE x = ? OR (x IS NULL AND ? IS NULL)
Run Code Online (Sandbox Code Playgroud)
但后来我必须设置两次相同的参数.有更好的解决方案吗?
谢谢!
为了使我们的代码更加标准化,我们被要求将我们将SQL变量硬编码的所有位置更改为预处理语句并改为绑定变量.
然而,我面临着一个问题setDate().
这是代码:
DateFormat dateFormatYMD = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
DateFormat dateFormatMDY = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date now = new Date();
String vDateYMD = dateFormatYMD.format(now);
String vDateMDY = dateFormatMDY.format(now);
String vDateMDYSQL = vDateMDY ;
java.sql.Date date = new java.sql.Date(0000-00-00);
requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER (REQUEST_ID," +
" ORDER_DT, FOLLOWUP_DT) " + "values(?,?,?,)";
prs = conn.prepareStatement(requestSQL);
prs.setInt(1,new Integer(requestID));
prs.setDate(2,date.valueOf(vDateMDYSQL));
prs.setDate(3,date.valueOf(sqlFollowupDT));
Run Code Online (Sandbox Code Playgroud)
SQL执行时出现此错误:
java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Date.java:138)
at com.cmsi.eValuate.TAF.TAFModuleMain.CallTAF(TAFModuleMain.java:1211)
Run Code Online (Sandbox Code Playgroud)
我应该使用setString(),而不是用to_date()?
我正在将PHP PDO和PostgreSQL用于一个新项目.
给定以下函数,如何返回刚刚插入的行的id?它现在的样子不起作用.
function adauga_administrator($detalii) {
global $db;
$ultima_logare = date('Y-m-d');
$stmt = $db->prepare("INSERT INTO site_admins (sa_nume, sa_prenume, sa_user_name, sa_password, sa_email, sa_id_rol, sa_status, sa_ultima_logare) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bindParam(1, $detalii['nume']);
$stmt->bindParam(2, $detalii['prenume']);
$stmt->bindParam(3, $detalii['username']);
$stmt->bindParam(4, md5(md5($detalii['parola'] . SIGURANTA_PAROLE) . SIGURANTA_PAROLE));
$stmt->bindParam(5, $detalii['email']);
$stmt->bindParam(6, $detalii['rol'], PDO::PARAM_INT);
$stmt->bindParam(7, $detalii['status'], PDO::PARAM_INT);
$stmt->bindParam(8, $ultima_logare);
$stmt->execute();
$id = $db->lastInsertId();
return $id;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用java PreparedStatment对象来构造一系列批量INSERT查询.查询语句的格式是......
String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";
Run Code Online (Sandbox Code Playgroud)
...所以字段值和表名都是变量(即,我有多个具有相同列格式的表,其中每个插入将指向不同的一个).如果删除"?",我可以让执行工作 tablename变量和硬代码,但每个预处理语句将被插入到不同的表中,因此需要保留一个变量,我在执行批处理查询之前立即填充...
stmt.setString(1, "tableName1");
Run Code Online (Sandbox Code Playgroud)
我怎么能让这个变成动态变量呢?
我正在努力将JSON对象插入到postgres v9.4 DB中.我已将名为"evtjson"的列定义为类型json (不是jsonb).
我试图在Java(jdk1.8)中使用预准备语句将Json对象(使用JEE javax.json库构建)插入到列中,但是我一直遇到SQLException错误.
我使用以下方法创建JSON对象:
JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
.add("New MbrID", newId)
.build();
Run Code Online (Sandbox Code Playgroud)
然后我将此对象作为参数传递给另一个方法,以使用预准备语句将其写入DB.(以及其他几个领域)作为:
pStmt.setObject(11, dtlRec);
Run Code Online (Sandbox Code Playgroud)
使用此方法,我收到以下错误:
org.postgresql.util.PSQLException:未安装hstore扩展.at org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:553)at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1036)
我也尝试过:
pStmt.setString(11, dtlRec.toString());
pStmt.setObject(11, dtlRec.toString());
Run Code Online (Sandbox Code Playgroud)
哪会产生不同的错误:
事件JSON:{"New MbrID":29}
SQLException:错误:列"evtjson"的类型为json,但表达式的类型为字符变化
提示:您需要重写或转换表达式.
但是,至少这告诉我DB正在将列识别为JSON类型.我确实尝试安装hstore扩展,但它告诉我它不是一个hstore对象.
OracleDocs显示了许多用于在preparedStatement中设置参数值的方法,但如果有人知道答案,我宁愿不尝试所有方法.(http://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html)这些还引用了一个额外的参数,SQLTYPE,但我不能找到这些任何引用.
我应该试试setAsciiStream吗?CharacterStream?CLOB?
我想知道是否还有使用预准备语句指定返回的列名.
我正在使用MySQL和Java.
当我尝试它:
String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");
Run Code Online (Sandbox Code Playgroud)
我得到这种类型的声明(在执行之前打印).
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Run Code Online (Sandbox Code Playgroud)
不过我想看到:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Run Code Online (Sandbox Code Playgroud)
我知道我不能这样做表名,正如这里讨论的那样 ,但是想知道是否有某种方法可以为列名做这些.
如果没有,那么我将只需要尝试确保我清理输入,这样就不会导致SQL注入漏洞.
我想检索数据库中插入行的id,但我不知道如何做到这一点.
我试图使用SQL子句返回RETURNING id,但不起作用.
如何在插入行后返回id?
这种方式对这个问题的答案似乎很难在互联网上找到.基本上我使用PreparedStatement将值插入MySQL数据库.我使用PreparedStatement来转义数据以防止SQL注入攻击.问题是,现在有办法撤回这些密钥.
String query="Insert INTO Table_A(name, age) (?, ?)";
//String query="Insert INTO Table_A(name, age) ('abc','123' )";//Doesn't escape
PreparedStatement prest;
prest = con.prepareStatement(query);
prest.setString(1,"abc");
prest.setInt(2,123);
prest.executeUpdate();
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error
//prest.executeQuery(); Throws an error
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能逃避输入并在Java中使用PreparedStatements?