数据结构与算法

Datastructure and algorithm

主题: 模拟数据库管理系统的数据结构和算法 要求:

我打算在winform上做,和sql一样有创建table、select、删除、更新命令。但我不知道如何用 C# 编写这些函数。有没有人有关于SQL的那些基本功能的文档?请帮我。 任何了解该主题的人都可以逐步指导我吗?真不知道怎么办

在现代编程中,倾向于将数据(= 模型)与数据显示方式(= 视图)分开。要将视图连接到模型,我们需要一个适配器 class:视图模型。这三个 classes 一起缩写为 MVVM。考虑阅读有关此的内容。

分离模型和视图的好处是,您可以为其他视图重用模型,可以更改模型而不更改视图,或者更改视图而不更改模型。最后,在不需要表单的情况下对模型 classes 进行单元测试要容易得多。

我提到 MVVM,因为您试图将数据库处理与 WinForms 混合使用。数据库处理(模型)与您如何显示获取的数据无关。

回到你的问题

显然您在显示获取的数据时没有问题(还)。因此,让我们关注如何在 C# 中获取数据库数据。

有两种主要方法:一种是使用 SQL,通过 DbConnection 和 DbCommand。另一种常用的方法是使用 entity framework 和 LINQ。

您提到您已经有 SQL 来获取数据。所以我将专注于该方法。如果您对 entity framework 感兴趣,请考虑阅读 Entity Framework Code First 并在电视上没有任何内容时做一些实验。

您需要一种方法来创建 table。由于 table 一起工作,我的建议是不要创建一个创建一个 table 的方法,而是创建一个在一次调用中创建数据库的所有 table 的方法。

public void CreateAllTables()
{
    const string sqlText = "Create if not exists TableCustomers (
         Id int,
         FirstName Varchar(30),
         ...

确切的语法有点取决于您使用的 SQL 方言:MicroSoft? MySql?简单SQL?嗯,我想你比我更了解 Sql 文本。关于如何将此发送到数据库:

    using (var dbConnection = new DbConnection())
    {
        using (DbCommand dbCommand = dbConnection.CreateCommand())
        {
            dbCommand.CommandText = sqlText;

现在有几种方法可以执行 dbCommand:

  • 检索项目序列:DbCommand.ExecuteReader
  • 只检索一个对象:DbCommand.ExecuteScalar
  • 仅执行,无数据return编辑:DbCommand.ExecuteNonQuery

在这种情况下:我们只执行命令。在与数据库通信之前,我们必须打开 dbConnection:

            dbConnection.Open();
            dbCommand.ExecuteNonQuery();
        }
    }
}

DbCommand.ExecuteNonQuery 有一个 return 值:受影响的行数。有时检查它以查看是否发生错误可能很方便。

现在获取一些数据

public IEnumerable<Product> FetchStudentsByLastName(string lastName)
{
    const string sqlText = "Select Id, FirstName, LastName, ...
        From tableStudents
        Where LastName = @LastName;"

注意我的 SQL 有 @LastName 作为参数!

开头和CreateTables一样:

using (var dbConnection = new DbConnection())
{
    using (DbCommand dbCommand = dbConnection.CreateCommand())
    {
        dbCommand.CommandText = sqlText;

要填写的参数:

        // associate the parameter in the SQL text with the value:
        dbCommand.AddWithValue("@LastName", lastName);

现在我们准备好打开 dbConnection 并执行查询。我们希望获取多行,所以我们必须使用 DbCommand.ExecuteReader:

        dbConnection.Open();
        using (DbDataReader dbReader = dbCommand.ExecuteReader())
        {

dbDataReader 包含获取的数据。使用 DbDataReader.Read 查看是否还有要读取的行。如果是这样,请使用 GetInt32GetString 等读取每行中的单元格:

            while (dbReader.Read())
            {

显然有一行。我们选择 Id 作为第 0 列,FirstName 作为第 1 列,LastName 作为第 2 列,依此类推:

                Student fetchedStudent = new Student
                {
                    Id = dbReader.GetInt32(0),          // column 0 is an Int32
                    FirstName = dbReader.GetString(1),  // column 1 is a string
                    LastName = dbReader.GetString(2),
                    ...
                }

                yield return fetchedStudent;
            }
        }
    }
}

要添加学生,我们会执行类似的操作:创建 DbConnection 和 DbCommand。使用 SQL 文本和 AddWithParameter.

填充 DbCommand

区别在于:我们不希望像return那样有几行,我们只想要添加的学生的Id。

如何 return 命令中的 Id 取决于您使用的 SQL 方言。在 SQLLight 中会是这样的:

const string sqlText = "INSERT INTO tableStudent (
   FirstName, LastName, ...) Values(@FirstName, @LastName, ...);
   SELECT last_insert_rowid();"

添加新学生后,此SQL文本将return学生的ID。

创建 DbConnection 和 DbCommand。那么:

dbCommand.CommandText = sqlText;
dbCommand.AddWithValue("@FirstName, firstName);
dbCommand.AddWithValue("@LastName, lastName);
...

打开数据库,执行查询,结果只有一个:ExecuteScalar, return returned Id as an int:

dbConnection.Open();
return (int)dbCommand.ExecuteScalar();

继续

我已经向您展示了如何使用 DbConnection 和 DbCommand 与数据库通信。

我展示了如何向您的 SQL 文本添加参数。

要获取数据行,请使用 ExecuteReader 并逐行读取,使用 DbReader.ReadDbReader.GetString(colum number)

我展示了如何在没有 returning 值 DbCommand.ExecuteNonQuery 的情况下执行。用于创建 table、删除 table、更新 table 中的行、从 table 中删除行。

最后,我展示了如何 return 一个值:DbCommand.ExecuteScalar。用于添加新行时 return Id。