主题:模拟数据库管理系统请求的数据结构和算法:
我计划在winform上这样做,这里有创建表、选择、删除、更新命令,就像sql一样。但我不知道如何用C#编写这些函数。有人有关于SQL的这些基本功能的文档吗?请帮帮我。有这方面知识的人能一步一步地指导我吗?我真的不知道该怎么办
发布于 2021-10-17 15:50:36
在现代编程中,有一种趋势是将数据(=模型)与数据的显示方式(=视图)分开。要将视图连接到模型,我们需要一个适配器类: viewmodel。这三个类统称为MVVM。考虑读点这方面的东西。
将模型和视图分开的优点是,您可以将模型重用到其他视图中,您可以更改模型而不必更改视图,也可以更改视图而不更改模型。最后,不需要表单就可以更容易地对模型类进行单元测试。
我提到MVVM,因为您试图将数据库处理与WinForms混合使用。数据库处理(模型)与如何显示获取的数据无关。
回到你的问题
显然,显示获取的数据没有问题(还没有)。因此,让我们关注如何在C#中获取数据库数据。
主要有两种方法:一种是通过DbConnection和DbCommand使用SQL。另一个常用的方法是使用实体框架和LINQ。
您提到您已经有了获取数据的SQL。所以我会集中讨论这个方法。如果您对实体框架感兴趣,请考虑阅读实体框架代码,并在电视上没有任何内容的情况下进行一些实验。
您需要一个方法来创建一个表。由于表是一起工作的,所以我的建议不是创建一个创建一个表的方法,而是创建一个在一个调用中创建数据库中所有表的方法。
public void CreateAllTables()
{
const string sqlText = "Create if not exists TableCustomers (
Id int,
FirstName Varchar(30),
...确切的语法在一定程度上取决于您正在使用的SQL方言: MicroSoft?MySql?SimpleSQL?嗯,我想你比我更了解Sql文本。关于如何发送此数据库:
using (var dbConnection = new DbConnection())
{
using (DbCommand dbCommand = dbConnection.CreateCommand())
{
dbCommand.CommandText = sqlText;现在有几种方法可以执行dbCommand:
DbCommand.ExecuteReaderDbCommand.ExecuteScalarDbCommand.ExecuteNonQuery在本例中:我们只执行命令。在与数据库通信之前,我们必须打开dbConnection:
dbConnection.Open();
dbCommand.ExecuteNonQuery();
}
}
}DbCommand.ExecuteNonQuery有一个返回值:受影响的行数。有时,检查这一点以确定是否发生错误是很方便的。
现在要获取一些数据
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文本和DbCommand填充AddWithParameter。
不同之处在于:我们不期望返回几行,我们只需要添加的学生会的Id。
如何返回命令中的Id取决于所使用的SQL方言。在SQLLight中,它应该是这样的:
const string sqlText = "INSERT INTO tableStudent (
FirstName, LastName, ...) Values(@FirstName, @LastName, ...);
SELECT last_insert_rowid();"添加新学生后,此SQL文本将返回学生的Id。
创建DbConnection和DbCommand。然后:
dbCommand.CommandText = sqlText;
dbCommand.AddWithValue("@FirstName, firstName);
dbCommand.AddWithValue("@LastName, lastName);
...打开数据库,执行只有一个结果的查询:ExecuteScalar,返回返回的Id作为int:
dbConnection.Open();
return (int)dbCommand.ExecuteScalar();继续播放
我已经向您展示了如何使用DbConnection和DbCommand与数据库进行通信。
我演示了如何向SQL文本添加参数。
要获取数据行,可以使用ExecuteReader并逐行读取、使用DbReader.Read和DbReader.GetString(colum number)等。
我演示了如何在不返回值的情况下执行:DbCommand.ExecuteNonQuery。用于创建表、删除表、更新表中的行、从表中删除行。
最后,我展示了如何返回一个值:DbCommand.ExecuteScalar。用于在添加新行时返回Id。
https://stackoverflow.com/questions/69604584
复制相似问题