首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据结构与算法

数据结构与算法
EN

Stack Overflow用户
提问于 2021-10-17 13:00:52
回答 1查看 56关注 0票数 0

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

  • 数据存储
  • 查询:支持选择、插入、更新查询

我计划在winform上这样做,这里有创建表、选择、删除、更新命令,就像sql一样。但我不知道如何用C#编写这些函数。有人有关于SQL的这些基本功能的文档吗?请帮帮我。有这方面知识的人能一步一步地指导我吗?我真的不知道该怎么办

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-17 15:50:36

在现代编程中,有一种趋势是将数据(=模型)与数据的显示方式(=视图)分开。要将视图连接到模型,我们需要一个适配器类: viewmodel。这三个类统称为MVVM。考虑读点这方面的东西。

将模型和视图分开的优点是,您可以将模型重用到其他视图中,您可以更改模型而不必更改视图,也可以更改视图而不更改模型。最后,不需要表单就可以更容易地对模型类进行单元测试。

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

回到你的问题

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

主要有两种方法:一种是通过DbConnection和DbCommand使用SQL。另一个常用的方法是使用实体框架和LINQ。

您提到您已经有了获取数据的SQL。所以我会集中讨论这个方法。如果您对实体框架感兴趣,请考虑阅读实体框架代码,并在电视上没有任何内容的情况下进行一些实验。

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

代码语言:javascript
复制
public void CreateAllTables()
{
    const string sqlText = "Create if not exists TableCustomers (
         Id int,
         FirstName Varchar(30),
         ...

确切的语法在一定程度上取决于您正在使用的SQL方言: MicroSoft?MySql?SimpleSQL?嗯,我想你比我更了解Sql文本。关于如何发送此数据库:

代码语言:javascript
复制
    using (var dbConnection = new DbConnection())
    {
        using (DbCommand dbCommand = dbConnection.CreateCommand())
        {
            dbCommand.CommandText = sqlText;

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

  • 检索项目序列:DbCommand.ExecuteReader
  • 准确检索一个对象:DbCommand.ExecuteScalar
  • 只执行,不返回数据:DbCommand.ExecuteNonQuery

在本例中:我们只执行命令。在与数据库通信之前,我们必须打开dbConnection:

代码语言:javascript
复制
            dbConnection.Open();
            dbCommand.ExecuteNonQuery();
        }
    }
}

DbCommand.ExecuteNonQuery有一个返回值:受影响的行数。有时,检查这一点以确定是否发生错误是很方便的。

现在要获取一些数据

代码语言:javascript
复制
public IEnumerable<Product> FetchStudentsByLastName(string lastName)
{
    const string sqlText = "Select Id, FirstName, LastName, ...
        From tableStudents
        Where LastName = @LastName;"

请注意,我的SQL以@LastName作为参数!

开头与CreateTables中相同:

代码语言:javascript
复制
using (var dbConnection = new DbConnection())
{
    using (DbCommand dbCommand = dbConnection.CreateCommand())
    {
        dbCommand.CommandText = sqlText;

要填充参数:

代码语言:javascript
复制
        // associate the parameter in the SQL text with the value:
        dbCommand.AddWithValue("@LastName", lastName);

现在,我们可以打开dbConnection并执行查询了。我们希望获取几行,所以我们必须使用DbCommand.ExecuteReader

代码语言:javascript
复制
        dbConnection.Open();
        using (DbDataReader dbReader = dbCommand.ExecuteReader())
        {

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

代码语言:javascript
复制
            while (dbReader.Read())
            {

显然有一排。我们选择Id作为0列,FirstName选择为第1列,LastName选择为第2列,等等:

代码语言:javascript
复制
                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中,它应该是这样的:

代码语言:javascript
复制
const string sqlText = "INSERT INTO tableStudent (
   FirstName, LastName, ...) Values(@FirstName, @LastName, ...);
   SELECT last_insert_rowid();"

添加新学生后,此SQL文本将返回学生的Id。

创建DbConnection和DbCommand。然后:

代码语言:javascript
复制
dbCommand.CommandText = sqlText;
dbCommand.AddWithValue("@FirstName, firstName);
dbCommand.AddWithValue("@LastName, lastName);
...

打开数据库,执行只有一个结果的查询:ExecuteScalar,返回返回的Id作为int:

代码语言:javascript
复制
dbConnection.Open();
return (int)dbCommand.ExecuteScalar();

继续播放

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

我演示了如何向SQL文本添加参数。

要获取数据行,可以使用ExecuteReader并逐行读取、使用DbReader.ReadDbReader.GetString(colum number)等。

我演示了如何在不返回值的情况下执行:DbCommand.ExecuteNonQuery。用于创建表、删除表、更新表中的行、从表中删除行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69604584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档