package com.keem.sql;
import java.util.*;
import java.lang.*;
import java.sql.*;
import java.math.BigDecimal;
import java.net.URL;
import com.keem.sql.*;public class QFieldArray{
/**
构造函数
*/
public QFieldArray(){
}
/**
新增字段
@param strFieldName 字段名
@param nType 字段类型
@param FieldValue 字段值
*/
public void addField(String strFieldName,int nType,Object FieldValue){
QField objField=new QField();
objField.setField(strFieldName,nType,FieldValue);
FList.add(objField);
}
/**
新增字段
@param FieldValue 已知的字段
*/
public void addField(QField FieldValue){
QField objField=new QField();
objField.setField(FieldValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,int FieldValue){
Integer nValue=new Integer(FieldValue);
addField(strFieldName,QField.FIELD_INT,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addFieldValue(String strFieldName,long FieldValue){
Long nValue=new Long(FieldValue);
addField(strFieldName,QField.FIELD_LONG,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,short FieldValue){
Short nValue=new Short(FieldValue);
addField(strFieldName,QField.FIELD_SHORT,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,byte FieldValue){
Byte nValue=new Byte(FieldValue);
addField(strFieldName,QField.FIELD_BYTE,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,float FieldValue){
Float nValue=new Float(FieldValue);
addField(strFieldName,QField.FIELD_FLOAT,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,double FieldValue){
Double nValue=new Double(FieldValue);
addField(strFieldName,QField.FIELD_DOUBLE,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,boolean FieldValue){
Boolean nValue=new Boolean(FieldValue);
addField(strFieldName,QField.FIELD_BOOLEAN,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,char FieldValue){
Character nValue=new Character(FieldValue);
addField(strFieldName,QField.FIELD_CHAR,nValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,String FieldValue){
addField(strFieldName,QField.FIELD_STRING,FieldValue);
}


/**
设置字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,BigDecimal FieldValue){
addField(strFieldName,QField.FIELD_BIGDECIMAL,FieldValue);
}
/**
设置字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,Blob FieldValue){
addField(strFieldName,QField.FIELD_BLOB,FieldValue);
} /**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,Clob FieldValue){
addField(strFieldName,QField.FIELD_CLOB,FieldValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,java.sql.Date FieldValue){
addField(strFieldName,QField.FIELD_DATE,FieldValue);
}
/**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,java.sql.Time FieldValue){
addField(strFieldName,QField.FIELD_TIME,FieldValue);
} /**
新增字段
@param strFieldName 字段名
@param FieldValue 字段值
*/
public void addField(String strFieldName,URL FieldValue){
addField(strFieldName,QField.FIELD_URL,FieldValue);
}


/**
清除所有字段
*/
public void clearField(){
FList.clear();
}
/**
取得字段数
*/
public int getLength(){
return FList.size();
}
/**
取得某一个字段
*/
public QField getField(int nIndex)
throws Exception
{
rangeCheck(nIndex);
return (QField)FList.get(nIndex);
}

/**
执行更新语句
@param conn 连接数据库对象
@param strTableName 要插入的表名
@param strWhere SQL的Where子句
*/
public void update(Connection conn,String strTableName,String strWhere)
throws SQLException,Exception
{
if( getLength()==0 ) {
throw new Exception("字段数:0");
}
String strSQL="update "+strTableName+"set ";
int nLength=getLength();

for( int i=0 ; i<nLength ; i++){
if( i< nLength-1 ){
strSQL+=getField(i).getFieldName()+"=?,";
}else{
strSQL+=getField(i).getFieldName();
}
}
if( strWhere != null)
strSQL+= " "+strWhere; PreparedStatement pstmt=conn.prepareStatement(strSQL);
for (int i=0 ;i<nLength; i++){
setField(pstmt,i);
}
pstmt.executeUpdate();
pstmt.close();

}
/**
执行插入语句
@param conn 连接数据库对象
@param strTableName 要插入的表名

*/
public void insert(Connection conn,String strTableName)
throws SQLException,Exception
{
if( getLength()==0 ) {
throw new Exception("字段数:0");
}
String strSQL="INSERT INTO "+strTableName+"(";

int nLength=getLength();

for ( int i=0 ; i<nLength ; i++){
if( i< nLength-1 ){
strSQL += getField(i).getFieldName() + ",";
}else{
strSQL +=getField(i).getFieldName();
}
}

strSQL += ") VALUES(";
for ( int i=0 ; i<nLength ; i++){
if( i< nLength-1 ){
strSQL += "?,";
}else{
strSQL +="?";
}
}
strSQL += ")";
PreparedStatement pstmt=conn.prepareStatement(strSQL);
pstmt.clearParameters();
for (int i=0 ;i<nLength; i++){
setField(pstmt,i);
}
pstmt.executeUpdate();
pstmt.close();
}

解决方案 »

  1.   

    /*
    新增要插入的字段
    @param pstmt PreparedStatement 对象
    @param nIndex 顺序
    */
    private void setField(PreparedStatement pstmt,int Index)
    throws Exception,SQLException
    {
    QField objField=getField(Index);
    int nIndex=Index+1;
    //pstmt.set
    switch(objField.getType()){
    case QField.FIELD_BOOLEAN:
    pstmt.setBoolean(nIndex,((Boolean)objField.getFieldValue()).booleanValue());
    break;
    case QField.FIELD_BYTE:
    pstmt.setByte(nIndex,((Byte)objField.getFieldValue()).byteValue());
    break;
    case QField.FIELD_BIGDECIMAL:
    pstmt.setBigDecimal(nIndex,((BigDecimal)objField.getFieldValue()));
    break;
    case QField.FIELD_CHAR:
    pstmt.setString(nIndex,""+((Character)objField.getFieldValue()).charValue());
    break;
    case QField.FIELD_DOUBLE:
    pstmt.setDouble(nIndex,((Double)objField.getFieldValue()).doubleValue());
    break;
    case QField.FIELD_FLOAT:
    pstmt.setFloat(nIndex,((Float)objField.getFieldValue()).floatValue());
    break;
    case QField.FIELD_INT:
    pstmt.setInt(nIndex,((Integer)objField.getFieldValue()).intValue());
    //System.out.println("<"+nIndex+">["+objField.getFieldName()+"]="+((Integer)objField.getFieldValue()).intValue());
    break;
    case QField.FIELD_LONG:
    pstmt.setLong(nIndex,((Long)objField.getFieldValue()).longValue());
    break;
    case QField.FIELD_SHORT:
    pstmt.setShort(nIndex,((Short)objField.getFieldValue()).shortValue());
    break;
    case QField.FIELD_STRING:
    pstmt.setString(nIndex+1,((String)objField.getFieldValue()));
    // System.out.println("<"+nIndex+">["+objField.getFieldName()+"]="+((String)objField.getFieldValue()));
    break;
    case QField.FIELD_BLOB:
    pstmt.setBlob(nIndex,((Blob)objField.getFieldValue()));
    break;
    case QField.FIELD_CLOB:
    pstmt.setBlob(nIndex,((Blob)objField.getFieldValue()));
    break;
    case QField.FIELD_DATE:
    pstmt.setDate(nIndex,((java.sql.Date)objField.getFieldValue()));
    break;
    case QField.FIELD_TIME:
    pstmt.setTime(nIndex,((java.sql.Time)objField.getFieldValue()));
    break;
    case QField.FIELD_URL:
    pstmt.setURL(nIndex,((URL)objField.getFieldValue()));
    break;
    }
    }
    /*
    检查nIndex是否越界
    */
    private void rangeCheck(int nIndex)
    throws Exception
    {
    if( ( nIndex<0 ) || ( nIndex >=getLength() ) ) 
    throw new Exception("nIndex: "+nIndex+", 字段数: "+getLength());
    }

    private ArrayList FList=new ArrayList();

    }
      

  2.   

    不知为什么,QFieldArray不知为什么运行不了
      

  3.   

    你没有Main方法,当然运行不了!晕倒!
      

  4.   

    上面是两个文件,大家帮忙看看,我的意思是在增加数据库非常方便
    如:
    QFieldArray fa=new QFieldArray();
    fa.add("field1","test1");
    fs.add("field2",1234);
    fa.insert(conn,"testtable");
    但可以编译,却不能运行
      

  5.   

    不能运行,除了什么错误信息?
    你把抓异常的地方用e.printStackTrace();方法打出来看看!
      

  6.   

    我试过了,就那个
    PreparedStatement pstmt=conn.prepareStatement(strSQL);
    pstmt.clearParameters();
    for (int i=0 ;i<nLength; i++){
    setField(pstmt,i);
    }
    有错误!也就是pstmt做为参数传过去操作后有错误!在setField中,pstmt的set方法不能用。