Null in prepares statement
Hi All,
I had the following code but it shows me an errors
Will you please find out where i made mistake.
Is it possible to use nulls in prepared statement as below.
String result=null;
int i=null;
int j=null;
try
String query= "Select TO_NUMBER(pk2_value) organization_id
, TO_NUMBER(pk1_value) item_id
FROM ENG_CHANGE_SUBJECTS
WHERE pk1_value IS NOT NULL
AND pk2_value IS NOT NULL
AND change_line_id IS NULL
AND entity_name like 'EGO_ITEM'
AND change_id = ?";
PreparedStatement pstmt=oaapplicationmodule.getOADBTransaction().getJdbcConnection().prepareStatement(query);
ResultSet rs=pstmt.executeQuery();
while(rs.next())
i=rs.getInt("item_id");
j= rs.getInt("organization_id");
result+=i+"\t\t"+j+"\n";
catch(SQLException sqlexception)
sqlexception.printStackTrace();
Regards
Zaheer
i=rs.getInt("item_id");
j= rs.getInt("organization_id");
this is not the way
try this
i=rs.getInt(1)
j= rs.getInt(2);
Also you are not setting the value for "change_id = ?" in your prepare statement before executing the query
like
pstmt.setLong(1, "value to be set");
pstmt.executeQuery();
Similar Messages
-
Setting date to null in prepared statement
Can anyone tell me how to set a date in Oracle to null using prepared statements.
prepared.setDateHave you tried using the setNull parameter? The following should work for you. (I haven't tested it.)
prepared.setNull(1, Types.DATE); -
How do I handle NULL returns from prepared statement?
Thanks in advance to all those who respond. As a beginner with Java/JSP/JDBC, I need all the help I can get!
Here's the problem...
I'm using a prepared statement in JSP to query a MySQL database.
If there is a value to return, everything works properly.
If the query returns a NULL (empty set) value, I get the following error:
javax.servlet.ServletException: Before start of result set
Here's the code (no negative comments please...I know I'm violating some conventions! I'll restructure it later. Right now I just need help with handling the NULL case):
<%
Driver DriverAppt = (Driver)Class.forName(MM_test_DRIVER).newInstance();
Connection ConnAppt = DriverManager.getConnection(MM_test_STRING,MM_test_USERNAME,MM_test_PASSWORD);PreparedStatement StatementAppt = ConnAppt.prepareStatement("SELECT lastname FROM appts_pid1 WHERE user_id = " + Recordset1__MMColParam + " AND year = " + yy + " AND month = '" + months[mm] + "' AND date = " + dates[dd] + " AND appttime = '16:15:00'");
ResultSet Appt = StatementAppt.executeQuery();
boolean Appt_isEmpty = !Appt.first();
boolean Appt_hasData = !Appt_isEmpty;
Object Appt_data;
int Appt_numRows = 0;
%>
Thanks for the help!!!I think I have a better handle on what's occurring here. To cut to the heart of the problem, I'm going to give a very simple example that illustrates what type of error handling I need.
HERE'S THE EXAMPLE:
Let's say that I have a database of users. There are only two columns in the database: user_id and lastname. There are only 2 users, user_id "1" has lastname "Jones" and user_id "2" has lastname "Smith".
I built a very simple web interface that let's a user enter a number to see if there's a lastname associated with that record. The user has no way of knowing if the user_id exists or not, so they may or may not enter a valid number.
If the user enters a valid user_id (in this case "1" or "2"), then the correct lastname is displayed. If the user enters an invalid user_id (in this case, anything other than "1" or "2") then I get the same "Before start of result set" error that I'm getting in my real application.
So, the question is: WHERE IN THIS CODE WOULD I HANDLE THE RETURN OF AN EMPTY SET?
The goal here is to have the sentence say "The user's lastname is .", basically returning null. If there has to be a value, then have the last sentence say "The user's lastname is unknown."
If you can solve this simple example, you'll have also solved the problem with my main application!!!! :-)
Here's the example code:
<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>
<%@ include file="Connections/example.jsp" %>
<%
String Recordset1__MMColParam = "1";
if (request.getParameter("user_id") !=null) {Recordset1__MMColParam = (String)request.getParameter("user_id");}
%>
<%
Driver DriverRecordset1 = (Driver)Class.forName(MM_example_DRIVER).newInstance();
Connection ConnRecordset1 = DriverManager.getConnection(MM_example_STRING,MM_example_USERNAME,MM_example_PASSWORD);
PreparedStatement StatementRecordset1 = ConnRecordset1.prepareStatement("SELECT * FROM test_table WHERE user_id = " + Recordset1__MMColParam + "");
ResultSet Recordset1 = StatementRecordset1.executeQuery();
boolean Recordset1_isEmpty = !Recordset1.next();
boolean Recordset1_hasData = !Recordset1_isEmpty;
Object Recordset1_data;
int Recordset1_numRows = 0;
%>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="test.jsp" method="get" enctype="application/x-www-form-urlencoded" name="form1" target="_self">
<p> Submit a user id and a lastname will be displayed.</p>
<p>
<input type="text" name="user_id">
<input type="submit" name="" value="Submit">
</p>
</form>
<p>The User's lastname is <%=(((Recordset1_data = Recordset1.getObject("lastname"))==null || Recordset1.wasNull())?"":Recordset1_data)%>.</p>
</body>
</html>
<%
Recordset1.close();
StatementRecordset1.close();
ConnRecordset1.close();
%>
A huge "THANK YOU!!!!" to all those who've helped me here!!! -
Use of Prepared Statement in adf
Hi Experts,
I am confused with the Use of prepared statement in adf.
My use case is ,
I have to update a table from every page in my application under certain conditions.
My question is ,
whether I have to create the VO iterator binding in every page and by calling the createinsert and insert the data in to the table or
use a common method in the Application module impl
which is using a prepared statement,(which is not even creating the ViewObject ) like
PreparedStatement st = null;
String sql = "INSERT INTO hr.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID) VALUES (seq,?,?,?)";
st=getDBTransaction().createPreparedStatement(sql,0);
st.setString(1, name);
st.setString(2, mgr_id);
st.setString(3, Loc_id);
st.execute();
getDBTransaction().commit();which is the best approach?
Studio Edition Version 11.1.1.2.0
RanjithRanjith,
Without further understanding the use case, there's not really much difference between the two approaches. In both cases, you'd have a binding in the page definition (either an iterator binding for the VO or a method binding for the AM service method). Both will use bind variables. The main difference I can see is that, depending on how you have configured your AM pooling settings, the VO method will incur fewer parses in the DB because the AM will cache prepared statements for you.
John -
Could not find prepared statement with handle %.
Greetings. I've seen several posts for this error on the web, but no clear cut answers. I captured the code below in profiler, with the intention of replaying in mgmt studio.
However, the attempt end in the following error: "Could not find prepared statement with handle 612."
declare @p1 int
set @p1=612
declare @p2 int
set @p2=0
declare @p7 int
set @p7=0
exec sp_cursorprepexec @p1 output,@p2 output,N'@P0 int,@P1 int,@P2 int,@P3 int,@P4 bit',N'EXEC dbo.mySproc @P0,@P1,@P2,@P3,@P4 ',4112,8193,@p7 output,219717,95,NULL,1,0
select @p1, @p2, @p7
Something noteworthy is that my sproc only has 5 input parameters, but this makes it look like it has many more.
How do I manipulate the code enough to make it work in mgmt studio? Thanks!
TIA, ChrisRDBAIn profiler you would normally see RPC:Starting and RPC:Completed. The statement shown in RPC staring is what you need to pick because as Erland explained, completed would show "funky" behavior.
Balmukund Lakhani | Please mark solved if I've answered your question, vote for it as helpful to help other users find a solution quicker
This posting is provided "AS IS" with no warranties, and confers no rights.
My Blog |
Team Blog | @Twitter
Author: SQL Server 2012 AlwaysOn -
Paperback, Kindle -
hi,
i have used following prepared Statement for the update in database.
Can any one tell me that,How can i use date in following method.
I have 4 field for date as given below:(BOLD shown)
I have used String in that place.
It is not working.
PreparedStatement pstatement = conn.prepareStatement(
"UPDATE sec_mast SET catg_code=?, vou_no=?, vou_date=?, vou_amt=?, due_date1=?, due_date2=?, mat_date=? where sec_no=? ");
pstatement.setInt(1,Integer.parseInt(request.getParameter("catg_code")));
pstatement.setString(2,request.getParameter("vou_no"));
pstatement.setString(3,request.getParameter("vou_date"));
pstatement.setInt(4,Integer.parseInt(request.getParameter("vou_amt")));
pstatement.setString(5,request.getParameter("due_date1"));
pstatement.setString(6,request.getParameter("due_date2"));
pstatement.setString(7,request.getParameter("mat_date"));
pstatement.setInt(8,Integer.parseInt(request.getParameter("sec_no")));
int rowCount = pstatement.executeUpdate();
conn.setAutoCommit(false);
conn.setAutoCommit(true);
plz help methanx for u r reply.
MY whole code is shown as below:
This page is for the updating the values in database..
<html>
<body>
<table>
<tr>
<td>
<%@ page import="javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page language="java" import="java.sql.*" %>
<%
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:pf","scott","ttlscott");
System.out.println("got connection");
%>
<%
String action = request.getParameter("action");
// Check if an update is requested
if (action != null && action.equals("update")) {
conn.setAutoCommit(false);
PreparedStatement pstatement = conn.prepareStatement(
"UPDATE sec_mast SET sec_no=? , catg_code=?, face_val=?, pur_val=?, int_paid=?, int_recd=?, brkr=?, vou_no=?, vou_date=?, vou_amt=?, due_date1=?, due_date2=?, lf_no=?, mat_date=? where tot_val=? ");
pstatement.setInt(1,Integer.parseInt(request.getParameter("sec_no")));
pstatement.setInt(2,Integer.parseInt(request.getParameter("catg_code")));
pstatement.setInt(3,Integer.parseInt(request.getParameter("face_val")));
pstatement.setInt(4,Integer.parseInt(request.getParameter("pur_val")));
pstatement.setInt(5,Integer.parseInt(request.getParameter("int_paid")));
pstatement.setInt(6,Integer.parseInt(request.getParameter("int_recd")));
pstatement.setInt(7,Integer.parseInt(request.getParameter("brkr")));
pstatement.setString(8,request.getParameter("vou_no"));
pstatement.setString(9,request.getParameter("vou_date"));
pstatement.setInt(10,Integer.parseInt(request.getParameter("vou_amt")));
pstatement.setString(11,request.getParameter("due_date1"));
pstatement.setString(12,request.getParameter("due_date2"));
pstatement.setString(13,request.getParameter("lf_no"));
pstatement.setString(14,request.getParameter("mat_date"));
pstatement.setInt(15,Integer.parseInt(request.getParameter("tot_val")));
int rowCount = pstatement.executeUpdate();
conn.setAutoCommit(false);
conn.setAutoCommit(true);
%>
<%
// Create the statement
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery
("SELECT * from sec_mast ");
%>
<%
// Iterate over the ResultSet
while ( rs.next() ) {
%>
<tr>
<form action="security_update.jsp" method="get">
<input type="hidden" value="update" name="action">
<td><input value="<%= rs.getInt("sec_no") %>" name="sec_no"></td>
<td><input value="<%= rs.getInt("catg_code") %>" name="catg_code"></td>
<td><input value="<%= rs.getInt("face_val") %>" name="face_val"></td>
<td><input value="<%= rs.getInt("pur_val") %>" name="pur_val"></td>
<td><input value="<%= rs.getInt("int_paid") %>" name="int_paid"></td>
<td><input value="<%= rs.getInt("int_recd") %>" name="int_recd"></td>
<td><input value="<%= rs.getInt("brkr") %>" name="brkr"></td>
<td><input value="<%= rs.getInt("tot_val") %>" name="tot_val"></td>
<td><input value="<%= rs.getString("vou_no") %>" name="vou_no"></td>
<td><input value="<%= rs.getDate("vou_date") %>" name="vou_date"></td>
<td><input value="<%= rs.getInt("vou_amt") %>" name="vou_amt"></td>
<td><input value="<%= rs.getDate("due_date1") %>" name="due_date1"></td>
<td><input value="<%= rs.getDate("due_date2") %>" name="due_date2"></td>
<td><input value="<%= rs.getString("lf_no") %>" name="lf_no"></td>
<td><input value="<%= rs.getDate("mat_date") %>" name="mat_date"></td>
<td><input type="submit" value="Update"></td>
</form>
</tr>
<%
%>
</table>
<%
// Close the ResultSet
rs.close();
// Close the Statement
statement.close();
// Close the Connection
conn.close();
} catch (SQLException sqle) {
out.println(sqle.getMessage());
} catch (Exception e) {
out.println(e.getMessage());
%>
</td>
</tr>
</body>
</html> -
Application is in 'Prepared' state instead of 'Active' state.
I m using below code to deploy an application on weblogic 11g
import java.io.*;
import java.util.Hashtable;
import weblogic.deploy.api.tools.*; //SesionHelper
import weblogic.deploy.api.spi .*; //WebLogicDeploymentManager
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.status.ProgressObject;
import javax.enterprise.deploy.spi.status.DeploymentStatus;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.spi.Target;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
public class WeblogicTest
public static void main(String ar[]) throws Exception
System.out.println("Start Deploying");
WebLogicDeploymentManager deployManager=SessionHelper.getRemoteDeploymentManager( "t3", "10.0.0.47", "7003", "weblogic",
"weblogic123");
System.out.println("Deploy Manager : " + deployManager);
DeploymentOptions options = new DeploymentOptions();
options.setName("TC33"); //TODO
Target targets[] = deployManager.getTargets();
System.out.println("Target : " + targets);
Target deployTargets[]=new Target[1];
int temp=0;
for (temp=0; temp < targets.length; temp++){
if(targets[temp].getName().equals("managed_2")){
deployTargets[0]=targets[temp];
ProgressObject processStatus=deployManager.distribute(deployTargets, new
File("\\\\10.0.0.47\\Builds\\VertexTest\\domain1\\tc3.3b74_6.2.2011.19\\test.ear"), null,options);
DeploymentStatus deploymentStatus=processStatus.getDeploymentStatus() ;
System.out.println("UnDeploymentStayus.getMessage(): "+deploymentStatus.getMessage() );
System.out.println("Start sleeping");
Thread.sleep(10000);
System.out.println("End sleeping");
TargetModuleID[] targetModuleIDs=deployManager.getAvailableModules(ModuleType.EAR, deployTargets);
System.out.println("\n\t targetModuleIDs [] = "+targetModuleIDs);
for (int j=0;j<targetModuleIDs.length;j++){
System.out.println("\n\t "+targetModuleIDs[j]);
deployManager.start(targetModuleIDs);
deployManager.start(targetModuleIDs);
}This code successfully deployed my application on desired managed server but my application is in 'Prepared' state instead of 'Active' state.
Currently, I have to manually update my application's state to 'Active'.
Can anybody tell me if I am missing something in my code.It actually looks fine, but what could be the problem is the time to deploy your application and
the sleep command of ten seconds. When your sleep is finished, is your application deployment finished?
Maybe you can add a while loop using the isCompleted method of the DeploymentStatus class, for example,
ProgressObject processStatus = deployManager.distribute(deployTargets, new File("\\\\10.0.0.47\\Builds\\VertexTest\\domain1\\tc3.3b74_6.2.2011.19\\test.ear"), null,options);
DeploymentStatus deploymentStatus = processStatus.getDeploymentStatus() ;
while (!deploymentStatus.isCompleted()) {
Thread.sleep(1000);
TargetModuleID[] targetModuleIDs = deployManager.getAvailableModules(ModuleType.EAR, deployTargets);
System.out.println(targetModuleIDs);
if (targetModuleIDs.length > 0) {
deployManager.start(targetModuleIDs);
}Or something else along those lines. -
Prepared statements related problem
Hi,
i have this strange problem with prepared statements i think.
When i execute an insert query without prepared statements i works fine (always), when i use prepared statements it sometimes gives a db error saying i'm trying to insert a null value.
The problem is that I'm not!!!
If i were why does it work sometimes?
It may be a bug but i don't know where to look for it... is it a prepared statements, application server or db2 problem?This is the code...
public void insertArticolo(Articolo item) throws Exception {
PreparedStatement ps = null;
try {
StringBuffer sql = new StringBuffer("insert into RUW.RUWT1_ARTICOLO (");
sql.append("C_ENTE, C_CONCESSIONE,N_ANNO_RUOLO,N_PROGR_RUOLO,N_PARTITA,N_PROGR_PARTITA,N_PROGR_TRIBUTO, ");
sql.append("C_TRIBUTO, C_TIPO_UFF,C_UFFICIO,");
sql.append("C_TIPO_IMP, N_ANNO_IMP, L_CARICO, S_ARTICOLO");
sql.append(") values (");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?" + ", ");
sql.append("?");
sql.append(")");
ps = connectionCreatePreparedStatement(sql.toString());
System.out.println(sql.toString());
KeyArticolo keyArticolo = item.getKeyArticolo();
KeyPartita keyPartita = keyArticolo.getKeyPartita();
Ente ente = keyPartita.getKeyRuolo().getEnte();
System.out.println("/"+ ente.getCodEnte()+ "/");
System.out.println("/"+ keyPartita.getKeyRuolo().getConcessione().getCodConc()+ "/");
System.out.println("/"+ keyPartita.getKeyRuolo().getAnnoRuolo()+ "/");
System.out.println("/"+ keyPartita.getKeyRuolo().getProgRuolo()+ "/");
System.out.println("/"+ keyPartita.getNumPartita()+ "/");
System.out.println("/"+ keyPartita.getProgPartita()+ "/");
System.out.println("/"+ item.getKeyArticolo().getProgArticolo()+ "/");
System.out.println("/"+ item.getCodEntrata()+ "/");
System.out.println("/"+ ente.getTipoUfficio()+ "/");
System.out.println("/"+ ente.getCodUfficio()+ "/");
System.out.println("/"+ item.getTipoImposta()+ "/");
System.out.println("/"+ item.getAnnoImposta()+ "/");
System.out.println("/"+ item.getCaricoOrigine()+ "/");
if (item.getDescArticolo().equals("")) {
item.setDescArticolo(" ");
System.out.println("/"+ item.getDescArticolo()+ "/");
ps.setLong(1,ente.getCodEnte());
ps.setLong(2,keyPartita.getKeyRuolo().getConcessione().getCodConc());
ps.setLong(3,keyPartita.getKeyRuolo().getAnnoRuolo());
ps.setLong(4,keyPartita.getKeyRuolo().getProgRuolo());
ps.setLong(5,keyPartita.getNumPartita());
ps.setLong(6,keyPartita.getProgPartita());
ps.setLong(7,item.getKeyArticolo().getProgArticolo());
ps.setString(8,item.getCodEntrata());
ps.setString(9,ente.getTipoUfficio());
ps.setString(10,ente.getCodUfficio());
ps.setString(11,item.getTipoImposta());
ps.setLong(12,item.getAnnoImposta());
ps.setLong(13,item.getCaricoOrigine());
ps.setString(14,item.getDescArticolo());
ps.executeUpdate();
catch (Exception e) {
e.printStackTrace();
connectionCloseStatement(ps);
throw e;
}and this is the result of the systemout
[10/03/06 14.07.07:051 CET] 76357635 SystemOut O insert into RUW.RUWT1_ARTICOLO (C_ENTE, C_CONCESSIONE,N_ANNO_RUOLO,N_PROGR_RUOLO,N_PARTITA,N_PROGR_PARTITA,N_PROGR_TRIBUTO, C_TRIBUTO, C_TIPO_UFF,C_UFFICIO,C_TIPO_IMP, N_ANNO_IMP, L_CARICO, S_ARTICOLO) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
/13199/
/66/
/2002/
/1564/
/28330/
/1/
/2/
/0997/
/120/
/2002/
/11900/
/ / -
Beginner question about prepared statements...PLEASE help! :-)
First let me say thanks for the assistance. This is probably really easy to do, but I'm new to JSP and can't seem to figure it out.
I want to dynamically populate a table that shows whether a particular person has an appointment at a given date and time with a user. To do this, I want to query the MySQL database for the lastname of the person with the appointment that occurs with the user at the year, month, date, and time, in question.
THE CODE BELOW DOESN'T WORK (obviously) BUT SOMEWHAT ILLUSTRATES WHAT I'M TRYING TO ACCOMPLISH:
<%
Driver DriverTestRecordSet = (Driver)Class.forName(MM_website_DRIVER).newInstance();
Connection ConnTestRecordSet = DriverManager.getConnection(MM_website_STRING,MM_website_USERNAME,MM_website_PASSWORD);
PreparedStatement StatementTestRecordSet = ConnTestRecordSet.prepareStatement("SELECT lastname FROM appts_pid1 WHERE user_id='<%=(((Recordset1_data = Recordset1.getObject(user_id))==null || Recordset1.wasNull())?"":Recordset1_data)%>' AND year='<%= yy %>' AND month='<%= months[mm] %>' AND date='<%= dates[dd] %>' AND appttime='16:15:00'");
ResultSet TestRecordSet = StatementTestRecordSet.executeQuery();
boolean TestRecordSet_isEmpty = !TestRecordSet.next();
boolean TestRecordSet_hasData = !TestRecordSet_isEmpty;
Object TestRecordSet_data;
int TestRecordSet_numRows = 0;
%>
The real problem comes in the prepared statement portion. If I build the prepared statement with static values like below, EVERYTHING WORKS GREAT:
PreparedStatement StatementTestRecordSet = ConnTestRecordSet.prepareStatement("SELECT lastname FROM appts_pid1 WHERE user_id='1' AND year='2002' AND month='October' AND date='31' AND appttime='16:15:00'");
But when I try to use dynamic values, everything falls apart. It's not that the values aren't defined, I use the user_id, year <%= yy %>, month <%= months[mm] %>, etc. elsewhere on the page with no problems. It's just that I can't figure out how to use these dynamic values within the prepared statement.
Thanks for reading this far and thanks in advance for the help!!!!Hi PhineasGage
You are little bit wrong in your
your preparedStatement.
Expression tag within scriptlet tag is invalid.
Whenever you are appending the statement with
expression tag, append it with "+" and remove
expression tag.
Hopefully it will work
ThanksThanks for the response!
I know that the expression tag within scriptlet tag is invalid. I just need a workaround for what I want to do.
I'm unclear what you mean by "Whenever you are appending the statement with expression tag, append it with a "+" and remove expression tag".
Could you give an example?
In the meantime, I've been trying to digest the docs on prepared statements and have changed the code to look like:
PreparedStatement StatementTestRecordSet = ConnTestRecordSet.prepareStatement("SELECT lastname FROM appts_pid1 WHERE user_id= ? AND year= ? AND month= ? AND date= ? AND appttime='13:15:00'");
StatementTestRecordSet.setInt(1,1);
StatementTestRecordSet.setInt(2,2002);
StatementTestRecordSet.setString(3,"October");
StatementTestRecordSet.setInt(4,31);
Again, WITH THE STATIC VALUES, THIS WORKS FINE...but when I try to use expressions or variables like below, things don't work:
StatementTestRecordSet.setInt(2,<%= yy %>);
Obviously, I'm doing something wrong, but there has to be a way to use variables within the prepared statement.
ALSO, the values are being passed to this page via URL in the form:
samplepage?user_id=1&year=2002&month=October&date=31
Based upon this information, is there another way (outside of stored procedures in the db) to do what I want to do? I'm open to ideas. -
Problem in inserting to MS Access using prepared statement
I am inserting a record in MS Access db and I am using prepared statement. I am encountering an error.... any help I would really appreciate it. So much time figuring out what the problem is....
ConvertText contxt = new ConvertText();
String bday = (String)cbYear.getSelectedItem() +
cbMonth.getItemCount()+(String)cbDay.getSelectedItem();
try{
// load MySQL driver
Class.forName(driver);
// Setup connection to DBMS
Connection conn = DriverManager.getConnection(url);
// Create statement
Statement stmt = conn.createStatement();
PreparedStatement insertPersons = conn.prepareStatement(
"INSERT INTO PERSONS VALUES(" +
"FIRST_NAME = ?," +
"LAST_NAME = ?," +
"MIDDLE_NAME = ?," +
"NICKNAME = ?," +
"GENDER = ?," +
"MARITALSTATUS = ?," +
"AGE = ?," +
"BIRTHDATE = ?," +
"ADDRESS = ?," +
"RES_PHONE_NUMBER = ?," +
"OFFICE_PHONE_NUMBER = ?," +
"CELL_NUMBER = ?," +
"COMPANY_NAME = ?," +
"EMAIL_ADDRESS = ?," +
"TIMESTAMP = ?)"
insertPersons.setString (1, tfFirstName.getText());
insertPersons.setString (2, tfLastName.getText());
insertPersons.setString (3, tfMiddleName.getText());
insertPersons.setString (4, tfNickName.getText());
insertPersons.setString (5, (String)cbGender.getSelectedItem());
insertPersons.setString (6, (String)cbMaritalStatus.getSelectedItem());
insertPersons.setInt (7, contxt.formatStringToInt(tfAge.getText()));
insertPersons.setDate (8, contxt.formatStringToSQLDate(bday));
insertPersons.setString (9, tfAddress.getText());
insertPersons.setString (10,tfResPhoneNumber.getText());
insertPersons.setString (11,tfOffPhoneNumber.getText());
insertPersons.setString (12,tfCellNumber.getText());
insertPersons.setString (13,tfCompanyName.getText());
insertPersons.setString (14,tfEmailAddress.getText());
insertPersons.setTimestamp(15, new Timestamp(System.currentTimeMillis()));
insertPersons.executeUpdate();
conn.close();
JOptionPane.showMessageDialog(null,"Record Inserted!", "INSERT",
JOptionPane.INFORMATION_MESSAGE);
}catch (SQLException ex){
System.err.println("==> SQLException: ");
System.out.println("Message: SQL Exception");
System.out.println("Message: " + ex.getMessage ());
System.out.println("SQLState: " + ex.getSQLState ());
System.out.println("ErrorCode: " + ex.getErrorCode ());
JOptionPane.showMessageDialog(null, ex.getMessage() + ex.toString(),"Error", JOptionPane.INFORMATION_MESSAGE);
}catch(Exception ex){
} ERROR Displayed:
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 30. java.sql.SQLExceptionHi cruzdhel,
Your SQL looks incorrect to me.
I am not familiar with that syntax.
I think it should be like this:
PreparedStatement insertPersons =
conn.prepareStatement("INSERT INTO PERSONS (FIRST_NAME," +
"LAST_NAME," +
"MIDDLE_NAME," +
"NICKNAME," +
"GENDER," +
"MARITALSTATUS," +
"AGE," +
"BIRTHDATE," +
"ADDRESS," +
"RES_PHONE_NUMBER," +
"OFFICE_PHONE_NUMBER," +
"CELL_NUMBER," +
"COMPANY_NAME," +
"EMAIL_ADDRESS," +
"TIMESTAMP)" +
"values (?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?," +
"?)");Hope this helps.
Good Luck,
Avi. -
hi guys, kinda need help in understanding the prepared statement. the code below is my example on how to get a date based on a serial number. how do i get the right expiry date? i do not know whether the code is right or wrong.
String reqSerial = request.getParameter("serial_no");
PreparedStatement psGetExpiry =
con.prepareStatement("SELECT expiry_date from identity WHERE serial_no=?");
ResultSet rsGetExpiry = null;
psGetExpiry.setString(1, reqSerial); //shouldn't here be setDate instead of setString
//cause what i want is the expiry date
rsGetExpiry = psGetExpiry.executeQuery();thx in advance
lost,
hayatiString reqSerial = request.getParameter("serial_no");
PreparedStatement psGetExpiry =
con.prepareStatement("SELECT expiry_date from identity WHERE serial_no=?");
ResultSet rsGetExpiry = null;
psGetExpiry.setString(1, reqSerial);
rsGetExpiry = psGetExpiry.executeQuery();
while (rsGetExpiry.next())
expiryDate = rsGetExpiry.getDate(1); <----- get your expiry date here -
Prepared statement - setDate(index, sql.Date, Cal) Help!
Hi everyone, I'm creating a form to query an Oracle table. I'm setting up the search criteria which includes a start and end date. (in this example I've just used the start date)
I get all the search parameters into my JSP and I created the following Calendar objects:
// Calendar creation
Calendar startCal = Calendar.getInstance();
startCal.set(start_year, start_month, start_day, start_hour, start_minute);
Calendar endCal = Calendar.getInstance();
endCal.set(end_year, end_month, end_day, end_hour, end_minute);
//define a sql.Date value for start and end date
java.sql.Date startDate = null;
java.sql.Date endDate = null;I then create a string that contains my SQL statement:
String sqlStmt = "select dateValue, value3 from someTable where dateValue >= ? and value2 = ?";In my Prepared Statement I pass in the following information:
ps = c.prepareStatement(sqlStmt);
ps.setDate(1, startDate, startCal);
ps.setString(2, searchValue);My question is the following - I define the hour and minute in my Cal object - will that information get passed into my "startDate" sql.Date object? According to the API it should work (at least that's my understading of it):
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html#setDate(int,%20java.sql.Date,%20java.util.Calendar)
My search does not blow up or report any errors but it never finds a match - even when I put in parameters that I know are a match.
Any feedback is appreciated.I think I got it. my java.sql.Date can't be null.
java.sql.Date startDate = null;
java.sql.Date endDate = null;needs to be:
java.util.Date startCalendarDate = startCal.getTime();
java.util.Date endCalendarDate = endCal.getTime();
java.sql.Date startDate = new java.sql.Date(startCalendarDate.getTime());
java.sql.Date endDate = new java.sql.Date(endCalendarDate.getTime()); -
Weblogic generated finder method not setting parameters in prepared statement
Hi,
I am using weblogic 6.1 sp2 and have a CMP bean with a finder defined as follows:
<query>
<query-method>
<method-name>findByPcPayclass</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>SELECT DISTINCT OBJECT(p) FROM Payments p, PaymentType
t WHERE p.paymentType.pcPayClass = '?1'</ejb-ql>
</query>
The weblogic generated code follwos:
public java.util.Collection ejbFindByPcPayclass(java.lang.String param0) throws
javax.ejb.FinderException
if(__WL_verbose) {
Debug.say("called findByPcPayclass");
java.sql.Connection __WL_con = null;
java.sql.PreparedStatement __WL_stmt = null;
java.sql.ResultSet __WL_rs = null;
__WL_pm.flushModifiedBeans();
try {
__WL_con = __WL_pm.getConnection();
} catch (java.lang.Exception e) {
__WL_pm.releaseResources(__WL_con, __WL_stmt, __WL_rs);
throw new javax.ejb.FinderException("Couldn't get connection: " + EOL +
e.toString() + EOL +
RDBMSUtils.throwable2StackTrace(e));
try {
java.lang.String __WL_query = "SELECT WL0.DEPOSIT_UID, WL0.GLA_ID, WL0.MARKET_CODE,
WL0.ORIGINAL_PAYMENT_ID, WL0.PAYMENT_ACCT_NUMBER, WL0.PAYMENT_ACK, WL0.PAYMENT_AMOUNT,
WL0.PAYMENT_CARD_CHECK_NUM, WL0.PAYMENT_CARE_SITE, WL0.PAYMENT_CUST_NAME, WL0.PAYMENT_DESIGNATOR,
WL0.PAYMENT_EFFECTIVE_DATE, WL0.PAYMENT_ID, WL0.PAYMENT_INV_ID, WL0.PAYMENT_MOBILE_NUMBER,
WL0.PAYMENT_SPLIT, WL0.PC_PAYCLASS, WL0.PT_UID, WL0.TT_UID FROM payment_type
WL2, payment_type WL1, payments WL0 WHERE (WL2.PC_PAYCLASS = '?1') AND WL0.PT_UID
= WL2.PT_UID " + __WL_pm.selectForUpdate();
if(__WL_verbose) {
Debug.say("Finder produced statement string " + __WL_query);
__WL_stmt = __WL_con.prepareStatement(__WL_query);
// preparedStatementParamIndex reset.
__WL_rs = __WL_stmt.executeQuery();
} catch (java.lang.Exception e) {
__WL_pm.releaseResources(__WL_con, __WL_stmt, __WL_rs);
throw new javax.ejb.FinderException(
"Exception in findByPcPayclass while preparing or executing " +
"statement: '" + __WL_stmt + "'" + EOL +
e.toString() + EOL +
RDBMSUtils.throwable2StackTrace(e));
The parameter is never set in the prepared statement before it executes. This
causes the finder to return an empty result set. Is this a bug or is there some
configuration that I missed. I am using ant 1.5 to do the ejbc. the ant target
follows:
<target name="ccas.ejbc" depends="ccas.compile, ccas.stage, dd.combine">
<ejbjar srcdir="${buildClasses}/"
descriptordir="${buildOutput}/ear_dd"
basejarname="CCAS"
flatdestdir="true"
dependency="full">
<support dir="${buildClasses}">
<include name="CCAS/**/*.class"/>
</support>
<weblogic destdir="${ear.stage.dir}"
rebuild="false"
keepgenerated="true"
jvmdebuglevel="16">
<classpath refid="classpath"/>
<wlclasspath refid="classpath"/>
</weblogic>
<include name="ejb-jar.xml"/>
<exclude name="**/*-weblogic*.xml"/>
</ejbjar>
</target>replace '?1' with ?1
"Eugene Stephens" <[email protected]> wrote in message
news:[email protected]...
>
Hi,
I am using weblogic 6.1 sp2 and have a CMP bean with a finder defined asfollows:
<query>
<query-method>
<method-name>findByPcPayclass</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>SELECT DISTINCT OBJECT(p) FROM Payments p,PaymentType
t WHERE p.paymentType.pcPayClass = '?1'</ejb-ql>
</query>
The weblogic generated code follwos:
public java.util.Collection ejbFindByPcPayclass(java.lang.String param0)throws
javax.ejb.FinderException
if(__WL_verbose) {
Debug.say("called findByPcPayclass");
java.sql.Connection __WL_con = null;
java.sql.PreparedStatement __WL_stmt = null;
java.sql.ResultSet __WL_rs = null;
__WL_pm.flushModifiedBeans();
try {
__WL_con = __WL_pm.getConnection();
} catch (java.lang.Exception e) {
__WL_pm.releaseResources(__WL_con, __WL_stmt, __WL_rs);
throw new javax.ejb.FinderException("Couldn't get connection: " +EOL +
e.toString() + EOL +
RDBMSUtils.throwable2StackTrace(e));
try {
java.lang.String __WL_query = "SELECT WL0.DEPOSIT_UID, WL0.GLA_ID,WL0.MARKET_CODE,
WL0.ORIGINAL_PAYMENT_ID, WL0.PAYMENT_ACCT_NUMBER, WL0.PAYMENT_ACK,WL0.PAYMENT_AMOUNT,
WL0.PAYMENT_CARD_CHECK_NUM, WL0.PAYMENT_CARE_SITE, WL0.PAYMENT_CUST_NAME,WL0.PAYMENT_DESIGNATOR,
WL0.PAYMENT_EFFECTIVE_DATE, WL0.PAYMENT_ID, WL0.PAYMENT_INV_ID,WL0.PAYMENT_MOBILE_NUMBER,
WL0.PAYMENT_SPLIT, WL0.PC_PAYCLASS, WL0.PT_UID, WL0.TT_UID FROMpayment_type
WL2, payment_type WL1, payments WL0 WHERE (WL2.PC_PAYCLASS = '?1') ANDWL0.PT_UID
= WL2.PT_UID " + __WL_pm.selectForUpdate();
if(__WL_verbose) {
Debug.say("Finder produced statement string " + __WL_query);
__WL_stmt = __WL_con.prepareStatement(__WL_query);
// preparedStatementParamIndex reset.
__WL_rs = __WL_stmt.executeQuery();
} catch (java.lang.Exception e) {
__WL_pm.releaseResources(__WL_con, __WL_stmt, __WL_rs);
throw new javax.ejb.FinderException(
"Exception in findByPcPayclass while preparing or executing " +
"statement: '" + __WL_stmt + "'" + EOL +
e.toString() + EOL +
RDBMSUtils.throwable2StackTrace(e));
The parameter is never set in the prepared statement before it executes.This
causes the finder to return an empty result set. Is this a bug or is theresome
configuration that I missed. I am using ant 1.5 to do the ejbc. the anttarget
follows:
<target name="ccas.ejbc" depends="ccas.compile, ccas.stage,dd.combine">
<ejbjar srcdir="${buildClasses}/"
descriptordir="${buildOutput}/ear_dd"
basejarname="CCAS"
flatdestdir="true"
dependency="full">
<support dir="${buildClasses}">
<include name="CCAS/**/*.class"/>
</support>
<weblogic destdir="${ear.stage.dir}"
rebuild="false"
keepgenerated="true"
jvmdebuglevel="16">
<classpath refid="classpath"/>
<wlclasspath refid="classpath"/>
</weblogic>
<include name="ejb-jar.xml"/>
<exclude name="**/*-weblogic*.xml"/>
</ejbjar>
</target> -
Prepared Statement Slow. ~Baffled~. Will the sun rise again?
HELP! (PANIC), Disaster
Problem?: Its slow.
How can you help?: Explain why and make suggestions to fix it.
NOTES:
1) there are indices on pd_idnum and pd_nappi_product_id
2) over 92000 records in the product table
Code Follows:
import java.sql.*;
import java.text.SimpleDateFormat;
public class DBTest
static PreparedStatement pstmtNewNappi = null;
ResultSet rsNappi6=null;
Connection myConn = null;
int pd_idnum=0;
SimpleDateFormat sDateFmt = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sTimeFmt = new SimpleDateFormat("hhmmss");
* Constructor for DBTest.
public DBTest()
super();
try
Class.forName("org.gjt.mm.mysql.Driver");
myConn = DriverManager.getConnection(
"jdbc:mysql://carl-lin:3306/mxprod", "carl", "lrac1234");
pstmtNewNappi = myConn.prepareStatement(
"SELECT pd_idnum FROM product WHERE pd_nappi_prod_id=?");
catch(ClassNotFoundException cnfe){cnfe.printStackTrace();}
catch(SQLException sqle){sqle.printStackTrace();}
public boolean isNewNappi(String nappi) throws SQLException
if(nappi != null)
pstmtNewNappi.setInt(1, Integer.parseInt(nappi));
System.out.println("before execute"
+new java.util.Date().getTime());
// This single line of code takes 2 seconds!! Why?
rsNappi6 = pstmtNewNappi.executeQuery();
System.out.println("after execute"
+new java.util.Date().getTime());
if(rsNappi6.next())
//if im in here the nappi is not new
pd_idnum = Integer.parseInt(rsNappi6.getString("pd_idnum"), 10);
return false;
return true;
public static void main(String[] args)
try
DBTest dbt = new DBTest();
boolean yes = dbt.isNewNappi("43");
System.out.println("yes: " + yes);
catch(SQLException sqle)
sqle.printStackTrace();
Maybe PreparedStatements are only fast for inserts(Forgive me for guesing)
Any help would be greatly appreciatedOh that came back like lighting allright but i got my hands on some more code here that (if my reasoning is correct) suggest that I'm using the prepared statement in the wrong way, but I can still not figure out why it is wrong. The DB is not the problem and I think the code below and its output is testament to that. Now that i've got fast code, I'm still not content because I still cant see what is wrong with the original code. In order for me to keep my sanity as a programmer I HAVE to know --WHAT IS WRONG aaaargh
Thanx for the help so far
Dewet
optimal code follows:
import java.sql.*;
public class Fix
public static void main(String[] args)
ResultSet prodSet = null;
String nappi = null;
String sql = null;
try
Class.forName("org.gjt.mm.mysql.Driver");
Connection myConn = DriverManager.getConnection("jdbc:mysql://carl:3306/mxprod?user=carl&password=lrac1234");
sql = "select pd_prod_name, pd_prod_name_mk from product where pd_nappi_prod_id = ?";
PreparedStatement stmt2 = myConn.prepareStatement(sql);
nappi = "43";
for (int i= 0; i < 10; i++)
System.out.println(i);
System.out.println(new java.util.Date().getTime());
stmt2.setString(1, nappi); // Nappi
prodSet = stmt2.executeQuery();
if(prodSet.next())
{*nappi found*/}
System.out.println(new java.util.Date().getTime());
if (stmt2 != null) stmt2.close();
myConn.close();
catch( Exception e )
e.printStackTrace();
output:
0
1055320536664
1055320536694
1
1055320536694
1055320536694
2
1055320536704
1055320536704
3
1055320536704
1055320536714
4
1055320536714
1055320536714
5
1055320536714
1055320536714
6
1055320536724
1055320536724
7
1055320536724
1055320536724
8
1055320536734
1055320536734
9
1055320536744
1055320536744 -
Oracle Cached Prepared Statement
We recently upgraded from WL 8.1 SP3 to WL 9.2 and in the process updated the JDBC Driver for Oracle from 10.2.0.1 to 10.2.0.2. After we went live we started seeing issue in one table. The table contains some special character which is not suppose to be there.
Here is the code & table details
PreparedStatement pstmt = cn.prepareStatement("INSERT INTO INFO_TABLE(user_name,user_status) values (?,?)");
pstmt.setString(1,requestObject.getUserName());
if(requestObject.isValidUser)
pstmt.setInt(2,requestObject.getStatus());
}else
pstmt.setNull(2,Types.VARCHAR);
cn.commit();
Table description:
USER_NAME VARCHAR2(60);
USER_STATUS VARCHAR2(5);
- The USER_STATUS columns valid values are 0-4 or NULL.
The problem is on certain occasions the valid user value in the table is some special character. I got the ascii value of this character as 128. We don't know yet whether setting int value and varchar (null) value on two different flow (but cached prepared statement) is the issue.
We can fix the code to use uniform data type but we need to be sure this is what causing the problem. Further when I read the docs http://e-docs.bea.com/wls/docs90/jdbc_admin/jdbc_datasources.html
I can associate the problem I face with this pointer however as I said, we need some sort of confirmation to make this change in the production code.
Here is what I am specifically looking for
1. Is there a way to confirm this problem?
2. Can we log the prepared statement being executed and the binded value being sent to the Oracle DB?
I suspect the VARCHAR null type is being casted to int value 128.
Would really appreciate any pointers on this.
ThanksPurushothaman Thambu wrote:
We recently upgraded from WL 8.1 SP3 to WL 9.2 and in the process updated the JDBC Driver for Oracle from 10.2.0.1 to 10.2.0.2. After we went live we started seeing issue in one table. The table contains some special character which is not suppose to be there.
Here is the code & table details
PreparedStatement pstmt = cn.prepareStatement("INSERT INTO INFO_TABLE(user_name,user_status) values (?,?)");
pstmt.setString(1,requestObject.getUserName());
if(requestObject.isValidUser)
pstmt.setInt(2,requestObject.getStatus());
}else
pstmt.setNull(2,Types.VARCHAR);
cn.commit();
Table description:
USER_NAME VARCHAR2(60);
USER_STATUS VARCHAR2(5);
- The USER_STATUS columns valid values are 0-4 or NULL.
The problem is on certain occasions the valid user value in the table is some special character. I got the ascii value of this character as 128. We don't know yet whether setting int value and varchar (null) value on two different flow (but cached prepared statement) is the issue.
We can fix the code to use uniform data type but we need to be sure this is what causing the problem. Further when I read the docs http://e-docs.bea.com/wls/docs90/jdbc_admin/jdbc_datasources.html
I can associate the problem I face with this pointer however as I said, we need some sort of confirmation to make this change in the production code.
Here is what I am specifically looking for
1. Is there a way to confirm this problem?
2. Can we log the prepared statement being executed and the binded value being sent to the Oracle DB?
I suspect the VARCHAR null type is being casted to int value 128.
Would really appreciate any pointers on this.
ThanksHi. I don't think there's any issue with WebLogic here, but the code you show
might confuse some drivers. I highly recommend using setString for all
varchar/char/varchar2 columns, not setInt(). If requestObject.getStatus()
has to return an int, try this:
if(requestObject.isValidUser)
pstmt.setString(2, (""+ requestObject.getStatus()) );
Joe
Maybe you are looking for
-
I just recently purchased Elements 13. I am in the process of creating a DVD face for a video. The design is complete and I would like to be able to save it as a JPEG so I can use it in another program that prints my DVD's. The problem is that it onl
-
How do I get my MacBook Pro to recognize my Toshiba external hard drive?
How do I get my MacBook Pro to recognize my Toshiba external hard drive? I'm working on transferring my music from our home computer to my new laptop and I already got all my music onto the hard drive but now, when I plug it into my MacBook Pro, it d
-
All Experts, In Purchase order i have maintained total 20 conditions out of which 7 are custom conditions. Now while doing custom clearing miro, only those 7 conditions ( JCDB,JCV1,JECV,J1CV,JEDB,JADC,JSDB ) are displayed ? Why and How ? And every ti
-
How to use SIM card in Droid 2 Global?
So I have a Droid 2 Global because it has SIM card capabilities. I called Verizon to allow international roaming. Then I got the unlock code for my phone. Next I put a new-bought SIM card from China Mobile into my Verizon Droid 2 Global. However, whe
-
A bug is walking around inside my screen! Possible to clean?
Yesterday I saw a bug walking around happy inside my 24". I got livid as I can do nothing about it but watching it crawling around inside. So, is there any way to clean this out? I've read posts stating the screen is possible to take of using some su