数据结构与算法
Datastructure and algorithm
主题:
模拟数据库管理系统的数据结构和算法
要求:
- 数据存储
- 查询:支持Select、插入、更新查询
我打算在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
查看是否还有要读取的行。如果是这样,请使用 GetInt32
、GetString
等读取每行中的单元格:
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.Read
和 DbReader.GetString(colum number)
等
我展示了如何在没有 returning 值 DbCommand.ExecuteNonQuery
的情况下执行。用于创建 table、删除 table、更新 table 中的行、从 table 中删除行。
最后,我展示了如何 return 一个值:DbCommand.ExecuteScalar
。用于添加新行时 return Id。
主题: 模拟数据库管理系统的数据结构和算法 要求:
- 数据存储
- 查询:支持Select、插入、更新查询
我打算在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
查看是否还有要读取的行。如果是这样,请使用 GetInt32
、GetString
等读取每行中的单元格:
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
.
区别在于:我们不希望像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.Read
和 DbReader.GetString(colum number)
等
我展示了如何在没有 returning 值 DbCommand.ExecuteNonQuery
的情况下执行。用于创建 table、删除 table、更新 table 中的行、从 table 中删除行。
最后,我展示了如何 return 一个值:DbCommand.ExecuteScalar
。用于添加新行时 return Id。