65.9K
CodeProject 正在变化。 阅读更多。
Home

一个有用的数据库库

2006年12月6日

5分钟阅读

viewsIcon

54796

downloadIcon

704

本文介绍了一个有用的数据库库。

引言

所有程序员都会问自己一个问题,“连接字符串格式是什么?” 我自己仍然会问的一个问题是,“是 OLE、ODBC 还是 SQL?” 嗯,我知道有很多不同的方法可以与数据库交互和连接。我将向您展示一种我喜欢的编写数据库编程代码的方式。请原谅我可能存在的任何错误;这是我的第一篇文章,我不是一个出色的技术作家。

我们如何处理数据库

首先,让我们问自己几个问题

  1. 我的程序需要连接到数据库吗?
  2. 会是什么类型的数据库,例如,MS SQL、MS Access、MySQL?
  3. 我将对数据库执行什么操作,例如,SELECT、INSERT、CREATE?

在此示例中,我们假设

  1. 是的,我们需要一个数据库,
  2. 数据库将是 MS Access,并且
  3. 我们需要从数据库返回(SELECT)记录。

现在我们知道了要做什么,让我们来谈谈基础知识。要以编程方式在数据库上运行 SQL 语句,至少我们需要几样东西。

  1. 一个 Connection 类
  2. 一个 Command 类

对于 Access 数据库,它将是这样的

OleDBConnection _OleConn = new OleDbConnection(ConnectionString);
OleDbCommand _OleCmd = new OleCommand(SQLstring, _OleConn;

但是我们仍然需要将 SQL 语句运行到数据库,所以

_OleConn.Open();
//or
_OleCmd.Connection.Open();
OleCmd.ExecuteNonQuery();
_OleConn.Close();
//or
_OleCmd.Connection.Open();

很简单,至少在做过几次之后。我知道刚开始时,这些东西会让人感到困惑。但是有了 CodeProject 和 Google 这样的地方,您几乎可以解决遇到的任何问题。现在,让我们深入研究一下。

我不喜欢绕弯子

年轻程序员可能面临的最大问题之一是面向对象编程 (OOP)。我的意思是,我们可能会忍不住将过多的代码放入一个方法(或函数)中,原因可能是想在一个地方看到所有代码,或者仅仅是不知道更好的方法。将代码分解成逻辑部分非常有帮助。以数据库调用为例。如果您知道将从多个方法中反复调用数据库,请不要将代码放在每个方法中。创建一个包含数据库代码的方法,并每次都调用它。我知道我在这里谈论的是基础知识,但请坚持下去。所以,这是我的做法:我有一个“DB”类,它有一个静态方法“RunSqlCommand”,它接受一个参数“MySqlData”,这是一个不同的类,用于存储连接字符串、提供程序(我稍后会解释)以及要运行的 SQL 命令等值。

public static class MyDatabase
{
    public static void RunSqlCommands(MySqlData _MySQLData)
    {
        if (_MySQLData.MyDatabaseProvider == DatabaseProvider.MicrosoftJet)
        {
            OleDbConnection MyOleConn = 
              new OleDbConnection(_MySQLData.MyConnectionString);
            OleDbCommand MyOleComm = 
              new OleDbCommand(_MySQLData.MySQLString, MyOleConn);
            MyOleComm.Connection.Open();
            MyOleComm.ExecuteNonQuery();
            MyOleComm.Connection.Close();
        }
        else
        {
            SqlConnection MySqlConn = 
              new SqlConnection(_MySQLData.MyConnectionString);
            SqlCommand MySqlComm = 
              new SqlCommand(_MySQLData.MySQLString, MySqlConn);
            MySqlComm.Connection.Open();
            MySqlComm.ExecuteNonQuery();
            MySqlComm.Connection.Close();
        }
    }
}

您不需要将该类设置为静态,但这很有帮助。这样,您只需调用 MyDatabase.RunSqlCommands(_MySQLData);。这样事情会更简单。

连接字符串

获取数据库的连接字符串(通过 Google 搜索)很容易,只要格式正确。您可以在程序中以多种不同的方式存储它。我强调的一点是,**切勿将其硬编码到您的程序中**,除非您知道数据库永远不会移动或更改名称,或者您的程序将永远无法与不同的数据库配合使用。即使那样,我也不建议硬编码。好的,假设我们的程序将创建表并在这些表中进行操作。如果设计得当,您的程序可以与 SQL Server、Access、MySQL 和 Oracle 协同工作。因此,您将需要一种方法为其中每一个生成连接字符串。好吧,我认为我有一个很好的方法来做到这一点。

数据链接属性对话框

您可以轻松地将此功能集成到您的程序中,并且它非常有用。方法如下。添加对以下库的引用:

  • Microsoft ActiveX Data Objects 2.8 Library
  • Microsoft OLE DB Service Component 1.0 Type Library

然后添加以下 using 语句

using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Text;
using MSDASC; // add this
using ADODB;  // add this

实现它的代码

public static void GenerateConnectionString(ref MySqlData _MySqlData)
{
    DataLinksClass MyDataLink = new DataLinksClass();
    Connection MyADOConn = (Connection)MyDataLink.PromptNew();
    if (MyADOConn.Provider == "Microsoft.Jet.OLEDB.4.0")
    {
        _MySqlData.MyDatabaseProvider = DatabaseProvider.MicrosoftJet;
        _MySqlData.MyConnectionString = MyADOConn.ConnectionString;
    }
    else
    {
        _MySqlData.MyDatabaseProvider = DatabaseProvider.MicrosoftSQL;
        _MySqlData.MyConnectionString  = MyADOConn.ConnectionString;
        _MySqlData.MyConnectionString  = _MySqlData.MyConnectionString.Substring(
            (_MySqlData.MyConnectionString.IndexOf(";") + 1),
                (_MySqlData.MyConnectionString.Length - (
                    (_MySqlData.MyConnectionString.IndexOf(";") + 1))));
    }
}

再次,我使用静态方法是因为我不需要在每个地方都实现它。另外,我将 _MySqlData 的“ref”传递给它,该方法负责为许多连接字符串和提供程序分配值。

警告

我发现在多线程程序中使用这些方法时,当一个线程尝试执行某个方法而另一个线程正在执行同一个方法时,我会遇到错误。我尝试过 `Monitor.Lock` 和 `Lock`。但我发现最好的方法是将方法改为非静态,并创建一个类的实例。现在,我确信有人可能会骂我愚蠢,但我也知道有人会感谢我向他们展示这一点。

MyDatabaseLibrary

我有一个叫做 MyDatabaseLibrary 的东西。它是一个 DLL 文件,其中包含很多数据库代码。这个库非常简单(简单=好),您可以在这里看到它。

有了这个库,我就可以使用

  • MyDatabse
    1. 使用“RunSqlCommands”在数据库上运行 SQL,例如 INSERTCREATE
    2. 使用“GetDataBaseSchema”获取数据库的表
    3. 使用“GetDataTable”返回一条记录、多条记录或整个表
    4. 使用“GenerateConnectionString”生成连接字符串
  • MySqlData 类存储
    1. 连接字符串
    2. 数据库提供程序
    3. 要执行的 SQL 命令

DatabaseProvider 枚举存储了库使用的数据库提供程序列表。

使用 MyDatabaseLibrary

这是精彩的部分。要使用此库,您需要遵循以下步骤

  1. 创建一个 MySqlData 的新实例,例如,_msd
  2. 调用 GenerateConnectionString(ref _msd)
  3. 添加 SQL 命令 _msd.MySQLString = “SELECT * FROM <table>”;
  4. 调用 GetDataTable(_msd)

当然,您必须添加对该库的引用并添加您的“using”语句。另外,请确保您拥有该库使用的两个文件:Interop.Adodb.dllInterop.Msdasc.dll

结论

我构建了一个非常简单的程序来使用这个库,以便您可以看到如何自己使用它。您可以随意使用它。但请给我一些反馈。让我知道您的想法。祝您一切顺利!

© . All rights reserved.