在mysqli预处理语句中,NULL变为''(在字符串的情况下)或0(在整数的情况下).我想将它存储为真正的NULL.有没有办法做到这一点?
我在where子句中使用带有时间戳的PreparedStatement:
PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?");
s.setTimestamp(1, new Timestamp(1273017600000L)); //2010-05-05 00:00 GMT
s.setTimestamp(2, new Timestamp(1273104000000L)); //2010-05-06 00:00 GMT
ResultSet rs = s.executeQuery();
if(rs.next()) System.out.println(rs.getInt("value"));
Run Code Online (Sandbox Code Playgroud)
当我在客户端计算机上有不同的时区时,我得到的结果是不同的.这是Oracle jdbc中的错误吗?还是纠正行为?
Oracle数据库版本是10.2,我已经尝试使用oracle jdbc瘦驱动程序版本10.2和11.1.
参数是Timestamp,我预计在途中不会进行任何时间转换.数据库列类型是DATE,但我也使用TIMESTAMP列类型检查它,结果相同.
有没有办法达到正确的结果?我无法将整个应用程序中的默认时区更改为UTC.
谢谢你的帮助
我正在使用JDBC来执行如下所示的Oracle语句:
"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert
Run Code Online (Sandbox Code Playgroud)
我发现了几种在Java中调用上述语句的方法,主要是:
使用OraclePreparedStatement:
ps = (OraclePreparedStatement)conn.prepareStatement(sql);
ps.setString(1, "myvalue");
ps.registerReturnParameter(2, Types.VARCHAR);
ps.execute();
rs = ps.getReturnResultSet();
rs.next();
System.out.print(rs.getString(1));
Run Code Online (Sandbox Code Playgroud)使用CallableStatement:
cs = conn.prepareCall(sql);
cs.setString(1, "myvalue");
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
System.out.print(cs.getString(1));
Run Code Online (Sandbox Code Playgroud)谢谢你,AG.
我现在真的不知道该怎么做,我已经盯着它好几个小时了,并且要求它......我无法让它起作用!
require_once("Abstracts/DBManager.php");
require_once("UI/UI.Package.php");
class BlogDBM extends DBManager
{
private $table = "blog_records";
function saveRecord($title,$url,$desc,$feedId,$pubDate)
{
$PDO = $this->db->connect();
try
{
$query = $PDO->prepare("
INSERT INTO ".$this->table."
(title,url,desc,feed_id,pubdate) VALUES
(:title,:url,:desc,:feed_id,:pubdate)");
$query->bindParam(":title", $title);
$query->bindParam(":url", $url);
$query->bindParam(":desc", $desc);
$query->bindParam(":feed_id", $feedId, PDO::PARAM_INT);
$query->bindParam(":pubdate", $pubDate, PDO::PARAM_INT);
$query->execute();
//return $PDO->lastInsertId();
} catch(PDOException $e)
{
echo "Error " . $e->getMessage();
}
$PDO = NULL;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Perl的DBI模块.我使用占位符准备一个语句,然后执行查询.
是否可以打印出执行的最终查询而无需手动转义参数并将其放入占位符?
谢谢
我使用Statements批次来查询我的数据库.我现在做了一些研究,我想重写我的应用程序,preparedStatement但我很难弄清楚如何向preparedStatement批处理中添加查询.
这就是我现在正在做的事情:
private void addToBatch(String sql) throws SQLException{
sttmnt.addBatch(sql);
batchSize++;
if (batchSize == elementsPerExecute){
executeBatches();
}
}
Run Code Online (Sandbox Code Playgroud)
where sttmnt类型的类成员Statement.
我想要做的是使用preparedStatement的setString(int, String)方法来设置一些动态的数据,然后将其添加到批处理.
不幸的是,我不完全了解它是如何工作的,以及如何我可以使用setString(int, String)到特定的SQL批处理或创建一个新preparedStatemnt的每个SQL我有,然后将它们全部加入到一个批次.
有可能这样做吗?还是我真的错过了我的理解preparedStatement?
我通常使用实时服务器进行开发,但是我第一次想到我会实现这一目标,看看我是否可以将所有(C++)mysql代码作为嵌入式服务器运行.特别是,我非常喜欢准备好的陈述,因为他们(恕我直言)"通常"优于未准备好的品种.
我尝试过使用5.5.22中的libmysqld和5.6.4中的libmysqld并且都不起作用.
建立连接,简单的mysql_query/mysql_real_query命令工作正常,但是一旦我的第一个预处理语句发出mysql_stmt_fetch(),我就会得到讨厌的'命令不同步'错误.
一个非常类似的问题出现在oracles论坛(http://forums.mysql.com/read.php?168,507863,507863#msg-507863),没有解决方案.
我没有看到,也不相信我错过了mysql_real_connect()和mysql_stmt_fetch()之间的任何命令.
对于使用预准备语句的嵌入式服务器的任何示例,我的所有搜索都是空的.我也没有找到一个实际的句子"你不能这样做".
那么......它是否支持?
感谢您的专业知识.
//编辑以便进一步解密(并在必要时指示)我的完整mysql cmd序列如下:
mysql_library_init(); // as embedded
mysql_init();
mysql_options(MYSQL_SET_CHARSET_NAME); //to utf8
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION);
mysql_real_connect();
mysql_real_query("SET NAMES 'utf8'");
mysql_real_query("SET CHARACTER SET 'utf8'");
mysql_set_character_set("utf8"); // yes, you really do need to set utf8 four times
mysql_autocommit( mAutocommit );
Run Code Online (Sandbox Code Playgroud)
此时,mysql_real_query()调用DO工作.我继续...
//all this would only happen once for each stmt
{
mysql_stmt_init();
mysql_stmt_prepare(theQuery);
mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery
mysql_stmt_result_metadata()
mysql_num_fields(); // to assert …Run Code Online (Sandbox Code Playgroud) 我有一些自定义类型.它们基本上都是枚举.以下是它们的示例:
CREATE TYPE card_suit AS ENUM
('spades',
'clubs',
'hearts',
'diamonds');
Run Code Online (Sandbox Code Playgroud)
我在Java中有一些准备好的语句,看起来像这样:
// Setup stuff up here.
sql = "INSERT INTO foo (suit) VALUES (?)";
st.setString(1, 'spades');
st.executeUpdate(sql);
Run Code Online (Sandbox Code Playgroud)
而Java给了我一些令人讨厌的例外:
org.postgresql.util.PSQLException: ERROR: column "suit" is of type card_suit but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Run Code Online (Sandbox Code Playgroud)
他们很高兴给我一个提示,但我不确定如何遵循它.
我想在一个批处理中发送两个不同的预处理语句.
目前我正在两个中这样做,你可以在评论的行中看到并且它有效,但这不是这里的主要目标.任何人都可以告诉我应该用什么来代替这些评论才能让这个东西起作用?
import java.lang.ClassNotFoundException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.DriverManager;
public class Main
{
public static void main(String[] args)
{
Connection connection = null;
PreparedStatement preparedStatementWithdraw = null;
PreparedStatement preparedStatementDeposit = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/youtube", "root", "root");
preparedStatementWithdraw = withdrawFromChecking(connection, preparedStatementWithdraw, new BigDecimal(100), 1);
preparedStatementDeposit = depositIntoSaving(connection, preparedStatementDeposit, new BigDecimal(300), 1);
//preparedStatementDeposit.executeBatch();
//preparedStatementWithdraw.executeBatch();
System.out.println("Account Modified!");
}
catch(ClassNotFoundException error)
{
System.out.println("Error: " + error.getMessage());
}
catch(SQLException error)
{
System.out.println("Error: " …Run Code Online (Sandbox Code Playgroud) MySQL JDBC Driver将这两个属性定义为:
useServerPrepStmts - 如果服务器支持,请使用服务器端预处理语句?
cachePrepStmts - 驱动程序是否应该缓存客户端预处理语句的PreparedStatements的解析阶段,"检查"服务器端准备和服务器端预处理语句本身的适用性?
客户端准备好的语句是否可以重用PreparedStatements对象?
如果useServerPrepStmts启用了,那么究竟正在缓存什么,因为MySQL还没有执行计划缓存?