none
有经验的高手帮我看看我的想法能否实现 RRS feed

  • 问题

  •  我属于新手吧,没写过几行代码,有了点想法希望得到高手的指点

     我想写一个数据库操作类,可以自动判断所用的数据库,
    就是在外部完全不涉及到用哪个数据库的问题,现在只是想法
    还没具体写。我看过一点数据工厂,里面的东西没太理解吧。

      我现在卡在:如果一个页面用 DB.的方式用的很多,就好像
    在一个页面声明了多个DB的实例了吧?这样似乎不太合理吧?

    我的想法用代码简单表示如下:
    public partial class _Default : System.Web.UI.Page
    {//这里可以完全不知道用的是什么数据库!!
    DbDataReader dr = DB.GetInstance().getDataReader()

    DB.GetInstance().execute("SELECTE * FROM tb_table");
    }
    public class DB
    {
     public static GetInstance()
     {根据所用数据库,返回不同类的实例
     (比如访问Access的类或者是访问SqlServer的类)}
     ..............................
    }
    public class SqlDataBase()
    {//访问SQL数据库的类
     public static int execute(string strSql)
     {}
     public static SqlDataReader getDataReader()
     {}
    .....................
    }
    public class AccessDataBase()
    {//访问aceess数据库的类
     public static int execute(string strSql)
     {}
     public static OledbDataReader getDataReader()
     {}
    ..........................
    }


    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2010年9月10日 15:44

答案

  • 你的想法是可以实现的,而且已经有很多现成的实例,不过你这样Web层直接跑SQL存在一些问题:

    你想不关心数据库到底是什么而直接就执行SQL,这个想法在做一些简单的查询的时候,不会出问题,当底层又会用SQL,又用Access,又用MySQL,又用Oracle,甚至又用DB2的时候,写出一句多个库都能正常执行的SQL就会变得异常复杂.

    建议分层,将SQL的执行放到DAL层,把不同库的处理也放在DAL层,这样对Web层来说,就只管调用接口方法就行。

    Enterprise Library – Data Access Application Block 就是你的想法的现成的实现。

    • 已标记为答案 Mog Liang 2010年9月17日 8:42
    2010年9月11日 2:26

全部回复

  • 你的想法是可以实现的,而且已经有很多现成的实例,不过你这样Web层直接跑SQL存在一些问题:

    你想不关心数据库到底是什么而直接就执行SQL,这个想法在做一些简单的查询的时候,不会出问题,当底层又会用SQL,又用Access,又用MySQL,又用Oracle,甚至又用DB2的时候,写出一句多个库都能正常执行的SQL就会变得异常复杂.

    建议分层,将SQL的执行放到DAL层,把不同库的处理也放在DAL层,这样对Web层来说,就只管调用接口方法就行。

    Enterprise Library – Data Access Application Block 就是你的想法的现成的实现。

    • 已标记为答案 Mog Liang 2010年9月17日 8:42
    2010年9月11日 2:26
  • 你好

        自动判断是什么数据库,其实意义不大啊。因为,你的程序用什么数据库,在运行程序之前就已经知道了,所以直接用配置文件就好了,把自动判断数据库的代码剩下来。

        另外,你多少看到点单件模式的影子,呵呵,要是这样的话,从项目实践的角度,是不合适的,单件有单件使用场景,工厂有工厂场景。

        你多思考,多理解一下OOP,多实践,多体会一下。其实,代码没有行与不行的区别,只要好与不好的差距。


    1+1=The World >>> BLOG=http://blog.csdn.net/liuning800203 >>> Email=liuning800203@hotmail.com
    2010年9月11日 4:30
  •         private static DbCommand dbCommand = null;
            private static DbConnection dbConnection = null;
            private static DbTransaction dbTransaction = null;
            private static String strConnectionString = null;
            private static DbProviderFactory objFactory = null;

            public static bool BaseDbManagerInit(string name)
            {
                try
                {
                    strConnectionString = ConfigurationManager.ConnectionStrings[name].ConnectionString;
                    switch (ConfigurationManager.ConnectionStrings[name].ProviderName)
                    {
                        case "System.Data.SqlClient":
                            objFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
                            break;
                        case "System.Data.Oracle":
                            objFactory = DbProviderFactories.GetFactory("System.Data.Oracle");
                            break;
                        case "System.Data.OleDb":
                            objFactory = DbProviderFactories.GetFactory("System.Data.OleDb");
                            break;
                        case "System.Data.Odbc":
                            objFactory = DbProviderFactories.GetFactory("System.Data.Odbc");
                            break;
                        default:
                            //
                            return false;

                    }
                }
                catch (Exception E)
                {
                    //
                    return false;
                }
                if ((dbConnection = objFactory.CreateConnection()) == null)
                {
                    //
                    return false;
                }
                try
                {
                    dbConnection.ConnectionString = strConnectionString;
                    dbConnection.Open();
                }
                catch (Exception E)
                {
                    //
                    return false;
                }
                return true;
            }

    这是我写的数据工厂接口,根据配置文件的内容来链接的数据库,这样在上层只要修改配置文件就能链接不同的数据库。配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="Sql ConnectionString"
          connectionString="Data Source=PC-20090713UOVH\SQLEXPRESS;Initial Catalog=bf6500.db;Integrated Security=True;"
          providerName="System.Data.SqlClient" />
      </connectionStrings>
    </configuration>

    2010年10月7日 5:53