java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s)相关的知识,希望对你有一定的参考价值。

这个错误不知道怎么调啊 还有同时出现的是错误是 Servlet.service() for servlet action threw exception java.lang.RuntimeException: error.unexpected(后面省略)我是用JavaWebStudio做的struts程序十分急 在线等待
我把完整的内容加到BLOG里了 这里写不下了哦
http://hi.baidu.com/pr%5Flover/blog

参考技术A 你查询数据的sql 语句里面是否有参数,比如

select * from table where xx=?

可能是你没有设置参数值

if("NULL".equals(expression)||"".equals(expression))
sql+=m_TVshop_booksForm .getBook_id();
else
sql+=expression;
sql+="";

expression 如果为空,那 "NULL".equals(expression) 是肯定不行的, 另外条件不成立时, sql+=""; 里面好象少了 ' 吧,应该是sql+="'";
参考技术B 首先肯定的是错误提示是你的参数有错误

String sql="SELECT * FROM dbo.TVshop_books";

if("search".equals(search))

sql+=" where book_id=";
if("NULL".equals(expression)||"".equals(expression))
sql+=m_TVshop_booksForm .getBook_id();
else sql+=expression;

这里book_id后面接的参数必须是数字,否则就会报错。
再看你这个判断你的意思是如果expression为null或者为空字符串。。应该是写:
if (expression == null || "".equals(expression))

而且expression必须接着数字,你也少了 判断。。
最直接的检查办法就是先把expression写死成"123"之类的数字字符串。。再运行下。。看看有没有错误。。就知道到底是哪里错了。。

你接着就继续调试就很容易找到问题所在的

java.sql.SQLException:接近“on”:语法错误问题

【中文标题】java.sql.SQLException:接近“on”:语法错误问题【英文标题】:java.sql.SQLException: near "on": syntax error problem 【发布时间】:2018-12-19 10:24:21 【问题描述】:

在 Sqlite 3.6.0 中,如果存在或插入,我想更新记录。但是我收到一个错误,因为

java.sql.SQLException: near "on": syntax error

我的sql查询如下;

INSERT INTO tx (
               _id,
               amount,
               fee,
               prev_hash,
               nonce,
               action_time,
               completion_time,
               _from,
               _to,
               asset,
               hash,
               block,
               seq,
               [desc]
           )
           VALUES (
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?,
               ?
           )
           ON CONFLICT (
               _id
           )
           DO UPDATE SET amount = 1.0,
           fee = 0.001,
           prev_hash = 'e6d0ca4b71488972cb149eef427ffbeb6132449c045c88db89ddaa8ab0c3611f',
           nonce = 1544773280,
           action_time = 1544773276808,
           completion_time = 1544773276808,
           _from = 'SKK1P5eQqoN7FBKnughbvp3UBK2CyjRQhHBp',
           _to = 'SKK1KuAwe4kR1SfdoXDiQStVtRPvdTVaKy2ry',
           asset = 'SKK',
           hash = '',
           block = 100,
           seq = 15288,
           [desc] = 'denemee'

我的代码块如下;

sql = "insert into tx (_id,amount,fee,prev_hash,nonce,action_time,completion_time,_from,_to,asset,hash,block,seq,desc) "
                                    + "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?) on conflict (_id) do update set "
                                    + "amount =" + tx.amount + ",fee=" + tx.fee + ",prev_hash='" + tx.prev_hash
                                    + "'" + ",nonce=" + tx.nonce + ",action_time=" + tx.action_time
                                    + ",completion_time=" + tx.action_time + ",_from='" + tx.wallet + "'" + ",_to='"
                                    + tx.to + "'" + ",asset='" + tx.asset + "'" + ",hash=''" + ",block=100"
                                    + ",seq=" + tx.seq + ",desc='" + tx.desc + "'";
                            PreparedStatement pstmt = con.prepareStatement(sql);
                            pstmt.setString(1, tx._id);
                            pstmt.setString(2, String.valueOf(tx.amount));
                            pstmt.setString(3, String.valueOf(tx.fee));// fee
                            pstmt.setString(4, tx.prev_hash);// prev_hash
                            pstmt.setString(5, tx.nonce);// nonce
                            pstmt.setString(6, String.valueOf(tx.action_time));// action time
                            pstmt.setString(7, "");// completion_time
                            pstmt.setString(8, tx.wallet);// from
                            pstmt.setString(9, tx.to); // to
                            pstmt.setString(10, tx.asset);// asset
                            pstmt.setString(11, tx.hash);// hash
                            pstmt.setString(12, "");// block
                            pstmt.setInt(13, tx.seq);// seq
                            pstmt.setString(14, tx.desc);// desc
                            pstmt.executeUpdate();

原始查询在 sqlitestudio 成功运行,但出现错误。我知道 sqlite 版本 3.6.0 支持 upsert 事件。我在哪里做错了。我该如何正确处理这个问题。

【问题讨论】:

【参考方案1】:

您的问题是由于

我知道 sqlite 版本 3.6.0 支持 upsert 事件。

INSERT..... ON CONFLICT .... DO....(称为 UPSERT)的使用仅适用于 3.24.0 版本。

尝试在 3.24.0 之前的版本中使用 UPSERT (DO.....) 将导致 syntax error at ON

根据

UPSERT 是对 INSERT 的一种特殊语法,它会导致 INSERT 如果 INSERT 违反了 唯一性约束。 UPSERT 不是标准 SQL。 SQLite 中的 UPSERT 遵循 PostgreSQL 建立的语法。添加了 UPSERT 语法 到版本 3.24.0 (2018-06-04) 的 SQLite。

UPSERT 是一个普通的 INSERT 语句,后跟 上面显示的特殊 ON CONFLICT 子句。

SQL As Understood By SQLite - upsert

您需要使用 3.24.0 或更高版本的 SQLite 或寻找替代方法。

【讨论】:

但我了解我的 sqlite jar 版本 3.6.0。所以3.6.0版本高于3.24版本。出现这样的错误是否正常。 @Baltazar 好的,那么当你给我较低的 2400 万美元时,我会给你 600 万美元?或者阅读Version Numbers in SQLite。 哦,你是对的。我对版本感到困惑。但是找不到3.24版本的jar。你知道吗? @Baltazar 抱歉,但我只使用我使用的工具附带的任何版本,并且由于我的大部分工作都是在 Android 上,所以我倾向于避开新功能。附: 3.26.0 现已推出。 好的,非常感谢。我在central.maven.org/maven2/org/xerial/sqlite-jdbc/3.25.2找到版本

以上是关于java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s)的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:getShort() 的值无效 - ''

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

Oracle DB:java.sql.SQLException:关闭连接

Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er

java.sql.SQLException: Access denied for user 'root'@'d001' (using password: YES)(代码

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误