组件中定义数据库类型, 用enum表示
定义各个数据库访问的接口 private IDbConnection Connection = null;
private IDbTransaction Transaction = null;
private IDbCommand  Command = null;
private IDataReader DataReader = null; 再去实现数据库打开时判断是什么类型的(sql, oledb, oracle, odbc), 采用不同的方式实例化connection对象, 它的值赋给IDbConnection的实例数据库的设sql语句, 执行语句, 取得结果, 取Reader, 取Scalar, 全都要判断一下数据库类型,再通过接口去实例化, 去执行语句, 去取值

解决方案 »

  1.   

    我的身份认证程序:
    <%@ Import NameSpace="System.Data.SqlClient" %>
    <%@ Import NameSpace="System.Data" %>
    Dim strName as string
    strName=Request.QueryString("name")
    Response.write("<font size=2>用户名:"+strName+"<br>")
    Dim myConnection as new SQLConnection("server=HH-Server;uid=shuiyu;pwd=shuiyu;database=shuiyu")
    Dim myDataAdapter as new SQLDataAdapter("select * from USERS_R where username='"+strName+"'",myConnection)
        Dim myDataSet as DataSet = new DataSet() 
        myDataAdapter.Fill(myDataSet,"USERS_R") 
        Dim myDataView as DataView
        myDataView = new DataView(myDataSet.Tables("USERS_R"))
        Dim strFlag as String =myDataView(0)("Flag").ToString().trim()
        Select strFlag
         Case "1"
            Response.write("权限:超级管理员<br>")
         Case "2"
            Response.write("权限:部门管理员<br>")
         Case "3"
            Response.write("权限:录入人员<br>")
         Case "4"
            Response.write("权限:一般用户<br>")
        end select
        Session("username")=myDataView(0)("Flag")   
        Dim nTimes as integer =myDataView(0)("TIMES")+1
        Response.write("登录次数:"+nTimes.ToString()+"<br>")
        myDataSet.Tables("USERS_R").Rows(0)("LASTDT")= DateTime.now
        myDataSet.Tables("USERS_R").Rows(0)("TIMES")=nTimes
        myDataSet.Tables("USERS_R").Rows(0)("IP")= Request.UserHostAddress
        myDataAdapter.UpdateCommand=new SqlCommand("Update USERS_R Set TIMES='"+nTimes.ToString()+"',LASTDT='"+DateTime.now.ToString()+"',IP='"+request.UserHostAddress+"' where username='"+strName+"'",myConnection)
        myDataAdapter.Update(myDataSet,"USERS_R")
      

  2.   

    还有, 事务的操作,,,这个很重要构造command对象时要考虑transaction, 在关闭conn, reader,时要考虑关闭transaction
      

  3.   

    执行的语句一般都不会是标准的sql -92的
    所以实现这个好的没什么实际意义
      

  4.   

    参见petshop3.0支持sql server 和oracle==================================
    弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪的
    星星蓝蓝的天.
      

  5.   

    我这边有个操作Oracle的类,大家看看。
    ---------
    using System;
    using System.Data;
    using System.Data.OracleClient;namespace DataOracle
    {
    /// <summary>
    /// ForOracle 的摘要说明。
    /// </summary>
    public class ForOracle
    { /// <summary>
    /// 数据库连接
    /// </summary>

    protected OracleConnection oracleConn; /// <summary>
    /// 字符串连接
    /// </summary>

    protected string ConnectionString;
    public ForOracle()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    this.ConnectionString="Data Source = aris;user id=sa;password=sa";
    } /// <summary>
    /// 将查询语句的查询结果填充到DataTable
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>如果失败则返回null</returns>
    public System.Data.DataTable getDataTable(string SQLString)
    {
    System.Data.DataSet ds = new System.Data.DataSet();
    try
    {
    OracleDataAdapter custDA = new OracleDataAdapter(SQLString,this.ConnectionString);
    custDA.Fill(ds);
    return ds.Tables[0];
    }
    catch
    {
    return null;
    }
    } /// <summary>
    /// 分批将查询语句的查询结果填充到DataTable
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>如果失败则返回null</returns>
    public System.Data.DataTable getDataTable(string SQLString,int StartRecord,int MaxRecords,string ScrTable)
    {
    System.Data.DataSet ds = new System.Data.DataSet();
    try
    {
    OracleDataAdapter custDA = new OracleDataAdapter(SQLString,this.ConnectionString);
    custDA.Fill(ds,StartRecord,MaxRecords,ScrTable);
    return ds.Tables[0];
    }
    catch
    {
    return null ;
    }
    } /// <summary>
    /// 打开数据库连接
    /// </summary>
    /// <returns></returns>
    protected  bool openConnection()
    {
    if(this.oracleConn.State==System.Data.ConnectionState.Closed)
    {
    this.oracleConn.Open();
    return true;
    }
    else
    {
    return true;
    }
    } /// <summary>
    /// 关闭数据库连接
    /// </summary>
    /// <returns></returns>
    protected bool closeConnection()
    {
    if(this.oracleConn.State == System.Data.ConnectionState.Open)
    {
    this.oracleConn.Close();
    return true;
    }
    else
    {
    return true;
    } }
    /// <summary>
    /// 执行SQL语句
    /// </summary>
    /// <param name="SQLString">SQL语句</param>
    /// <returns>返回SQL语句影响的行数,如果失败则返回-1</returns>
    public int excuteSql(string SQLString)
    {
    this.oracleConn = new OracleConnection(this.ConnectionString);
    this.openConnection();
    OracleCommand mCommand = new OracleCommand(SQLString,oracleConn);
    try
    {
    int rows = mCommand.ExecuteNonQuery();
    return rows;
    }
    catch
    {
    return -1;
    }
    finally
    {
    this.closeConnection();
    }
    }

    /// <summary>
    /// 执行Sql语句
    /// </summary>
    /// <param name="isolLevel">事务级别</param>
    /// <param name="SQLStrings">一组Sql语句</param>
    /// <returns>返回没个Sql语句的所影响的行数</returns> public int[] excuteSql(IsolationLevel isolLevel,params string[] SQLStrings)
    {
    this.oracleConn = new OracleConnection(this.ConnectionString);
    this.openConnection();

    int length = SQLStrings.Length;
    int[] Rows = new int[length];
    //启动一个事务
    OracleTransaction myTrans;
    myTrans = this.oracleConn.BeginTransaction(isolLevel);

    OracleCommand mCommand = new OracleCommand();
    mCommand.Connection = this.oracleConn;
    mCommand.Transaction = myTrans;
    try
    {
    //string sql = "";
    for(int i=0;i<length;++i)
    {
    //sql += SQLStrings[i] + "  \n";
    mCommand.CommandText = SQLStrings[i];
    Rows[i] = mCommand.ExecuteNonQuery();
    }
    //mCommand.CommandText = sql;
    //mCommand.ExecuteNonQuery();
    myTrans.Commit();
    return Rows;
    }
    catch
    {
    myTrans.Rollback();
    return null;
    }
    finally
    {
    this.closeConnection();
    }
    } /// <summary>
    /// 当执行的查询只需要返回一个结果时使用此方法
    /// </summary>
    /// <param name="SQLString"></param>
    /// <returns></returns> public System.Object getResult(string SQLString)
    {
    this.oracleConn = new OracleConnection(this.ConnectionString);
    this.openConnection();
    OracleCommand mCommand = new OracleCommand(SQLString,oracleConn);
    try
    {
    object obj= mCommand.ExecuteScalar();
    return obj;
    }
    catch
    {
    return null;
    }
    finally
    {
    this.closeConnection();
    }

    }
    /// <summary>
    /// 检测某条记录是否在数据库中存在
    /// </summary>
    /// <param name="GUIDName">主健的资段名</param>
    /// <param name="GUID">主健的值</param>
    /// <param name="tableName">表名</param>
    /// <returns>如果存在返回true</returns> public bool isInDb(string GUIDName,string GUID ,string tableName)
    {
    if(GUID.Trim()!="")
    {
    string strSql="select count(*) aa from " + tableName + " where " + GUIDName + "='" + GUID + "'";
    System.Data.DataTable dt = this.getDataTable(strSql);
    if(dt == null || (int)dt.Rows[0][0] == 0)
    {return false;}
    else
    {return true;}
    }
    else{return false;}
    }
    public bool isInDb(string GUID,string tableName)
    {
    return this.isInDb("GUID",GUID,tableName);
    }
    }
    }
    ------------
    希望对各位有点帮助!
      

  6.   

    其实用MS Data Access就可以了。
    http://www.aspxcn.com/dotnetbbs/View.aspx?fbId=17&Id=233175这个是我在它的基础上封装的。
      

  7.   

    大家帮忙解决下这类问题关于对得到的DATASET 进行相关操作我动态生成了下面的SQL 代码select isnull(employee9_id,99999) employee9_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee8_id,99999) employee8_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee7_id,99999) employee7_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee6_id,99999) employee6_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee5_id,99999) employee5_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee4_id,99999) employee4_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee3_id,99999) employee3_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee2_id,99999) employee2_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001select isnull(employee1_id,99999) employee1_id from tb_work_arranged_list_ei_exchage where work_arranged_list_id=20030002 or work_arranged_list_id=20030001
    我想把得到的结果指定插入 某一列
    怎么做呢?
    我本来想用下面的代码实现 但发现不可能只插入一列还有个小问题 假如我想对得到的数据进行 DISTINCT 怎么做呢/
    是不是用            ds2.Tables(0).DefaultView.RowFilter = "distinct empolyee_id" 能实现呢?
     temp = 10
                    Dim ds2 As New DataSet
                    Dim odAdapt2 As OleDb.OleDbDataAdapter
                    Do While temp >= 1
                        sql = "select isnull(employee" & temp & "_id,99999) employee" & temp & "_id from tb_work_arranged_list_ei_exchage where " & temp1
                        odAdapt2 = New OleDb.OleDbDataAdapter(sql, conn)
                        odAdapt2.Fill(ds2)
                        Response.Write(sql)
                        Response.Write("<br></br>")
                        temp -= 1
                    Loop
                    odAdapt2 = Nothing
                    Response.End()