C# ライブラリ管理システム (データベース)

データベースの基本

SQLはStructured Query Languageの略称で、中国語では「構造化照会言語」と訳されます。SQL は、リレーショナル データベースに保存されたデータの保存、取得、変更に使用されるコンピュータ言語です。

基本的な考え方

1.データベース(データベース)

  • 特定のデータ構造に従ってデータを整理、保存、管理するウェアハウス。一緒に保存された関連データのコレクション。

2. データベース管理システム (DBMS)

  • データベースを管理するために設計されたコンピュータ ソフトウェア システムMicrosoft の SQL Server Management Studio を使用します
  • SqlServer MySQL Access Oracle などのリレーショナル モデルに基づくデータベースであるリレーショナル データベースと、非リレーショナル データベースの 2 つのタイプに分けられます。違いは、クエリ言語として SQL を使用しないことです。

3. データベースシステム

  • データベースとデータベース管理システムから構成されます。

4. SQL は大文字と小文字を区別しませんが、大文字と小文字を区別して記述した方がよいでしょう。

インストール

ビデオ

データベース管理システム (DBMS)、Microsoft SQL Server
DBMS は、バックグラウンドで実行される一連のサービスです。この一連のサービスを処理するには、クライアント (DBMS クライアント、SQL Server Management Studio、SSMS)をダウンロードする必要があります。

サンプルデータベース
ここに画像の説明を挿入します
ここに画像の説明を挿入します

ログイン

 Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
 前面是服务器名 后面是数据库名字 

このようにコンピューターから直接 C# にログインすることもできますが、内部でこのようにログインすることもできます。
ここに画像の説明を挿入します

リモート接続を開く

外部ネットワークには接続できるが、自分のコンピュータには接続できない
1. まず Windows 認証を使用してログインし、このボックスをオンにします。
ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
2. SQL Server 構成マネージャー
ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
3. ファイアウォール
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
を再起動します
ここに画像の説明を挿入します

SQL

データベース管理システム (DBMS)、Microsoft SQL Server DBMS は、バックグラウンドで実行される一連のサービスです。この一連のサービスを処理するには、クライアント (つまり、DBMS クライアント、SQL Server Management Studio、SSMS Server=)
をダウンロードする必要があります。
ここに画像の説明を挿入します
ローカルホスト \SQLEXPRESS;データベース=マスター;Trusted_Connection=True;

新しいデータベースを作成する

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

新しいテーブルを作成する

ここに画像の説明を挿入します
主キーを設定する
ここに画像の説明を挿入します

Ctrlキーを押して保存
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

フレーズをチェックする

select * from t_user where id='1001' and psw='1'

ここに画像の説明を挿入します

データの挿入

これらの 3 と 10 は int 型なので、シングルクォーテーションを使用しなくても問題ありません。

insert into t_book values('20190101','计算机系统原理','王万森','高等教育出版社','10'),('20190102','机械设计原理','董永','北京教育出版社','3')
select * from t_book

ここに画像の説明を挿入します
別の挿入方法です。後で試してみましたが、[]は付けなくても問題ありませんでした。標準では各項目に[]を付ける必要があるようです。

insert into t_lend  ([uid],bid,name,[datetime]) values('2046','20190101','小明',getdate());
update t_book set number=number-1 where id='20190101'
select *from t_lend
select *from t_book

ここに画像の説明を挿入します
以下の設定が自動的に増加します
ここに画像の説明を挿入します

更新する

update t_book set id='111',[name]='高等数学',author='李四',number=100 where id='999'
select * from t_book

ここに画像の説明を挿入します
ここに画像の説明を挿入します
テーブル内の項目をインクリメントするように設定したい場合
ここに画像の説明を挿入します

消去

delete from t_lend where [no]=5;
update t_book set number=number+1 where id='20190101'
select *from t_lend
select *from t_book

ここに画像の説明を挿入します
ここに画像の説明を挿入します

複数行検索

ここに画像の説明を挿入します
ここに画像の説明を挿入します

複数行を削除する

delete from t_lend where [no] in('6','7')
select *from t_lend
select *from t_book

ここに画像の説明を挿入します
ここに画像の説明を挿入します

データベース設計

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

C#プログラミング

Dao.cs

SQLと通信する関数をカプセル化します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace WindowsFormsApp1
{
    
    
     class Dao
    {
    
    
        SqlConnection con;
        public SqlConnection connect()
        {
    
    
            //数据库连接字符串
            //string str = @"Data Source=localhost\SQLEXPRESS;Initial Catalog = BookDB;Integrated_Security=True";//Data Source:服务器的名称;Initial Catalog:数据库的名称
            string str = @"Data Source=localhost\SQLEXPRESS;Database = BookDB; Trusted_Connection = True;";//也就是我们安装的时候返回的连接字符串 然后将数据库的名字修改了下
            con = new SqlConnection(str);//创建数据库连接对象
            con.Open();//打开数据库
            return con;//返回数据库连接对象
        }

        //sql:sql语句
        public SqlCommand command(string sql)
        {
    
    
            SqlCommand cmd = new SqlCommand(sql,connect());
            return cmd;
        }
        //更新操作
        public int Execute(string sql)
        {
    
    
            return command(sql).ExecuteNonQuery();
        }

        //读取操作
        public SqlDataReader read(string sql)
        {
    
    
            return command(sql).ExecuteReader();//首先执行的是command这个函数 然后返回cmd 再cmd.ExecuteReader()
        }

        //关闭数据库连接
        public void Close()
        {
    
    
            con.Close();
        }
    }
}

データ.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    
    
    class Data
    {
    
    
        public static string UID = "", UName = "";//登录用户的ID 和姓名


    }
}

ログインページ

つまり、入力されたデータが t_user テーブルと t_admin テーブルに存在するかどうかを確認し (アカウントとパスワードの両方が満たされている必要があります)、存在する場合はページがリダイレクトされます。
ここに画像の説明を挿入します

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

コアコードのログイン方法

        //登录方法,验证是否允许登录
        public void login()
        {
    
    
            //用户
            if(UserradioButton1.Checked==true)
            {
    
    
                Dao dao = new Dao();//实例化
                
                //查询语句 拼成这样:select * from t_user where id='1001' and psw='1'
                //string sql = "select * from t_user where id='"+ textBox1.Text +"' and psw='"+textBox2.Text+"'";//写法1
                //string sql=string.Format("select * from t_user where id='{0}' and psw='{1}'",textBox1.Text,textBox2.Text);//写法2
                string sql = $"select * from t_user where id='{
      
      textBox1.Text}' and psw='{
      
      textBox2.Text}'";//写法3 
                log.SaveLog(sql);
                IDataReader dc = dao.read(sql);
                //log.SaveLog(dc[0].ToString()+dc["name"].ToString());//第一行

                if (dc.Read())//如果读到一行数据了 就返回真
                {
    
    
                    //把值存好
                    Data.UID = dc["id"].ToString();
                    Data.UName=dc["name"].ToString();

                    MessageBox.Show("登录成功");

                    UserFrm userFrm = new UserFrm();
                    this.Hide();
                    userFrm.Show();
                }
                else
                {
    
    
                    MessageBox.Show("登录失败");              
                }
                dao.Close();
                

            }
            //管理员
            if(AdmiradioButton2.Checked==true)
            {
    
    
                Dao dao = new Dao();//实例化

                string sql = $"select * from t_admin where id='{
      
      textBox1.Text}' and psw='{
      
      textBox2.Text}'";//写法3 
                log.SaveLog(sql);
                IDataReader dc = dao.read(sql);
               

                if (dc.Read())//如果读到一行数据了 就返回真
                {
    
    
                    //把值存好
                    Data.UID = dc["id"].ToString();
                   // Data.UName=dc["name"].ToString();

                    MessageBox.Show("登录成功");
                    //log.SaveLog(dc[0].ToString() + dc["name"].ToString());//第一行
                    AdminFrm frm= new AdminFrm();
                    this.Hide();
                    frm.ShowDialog();
                    
                    
                }
                else
                {
    
    
                    MessageBox.Show("登录失败");
                   
                }
                dao.Close();
            }
            //MessageBox.Show("单选框请先选中");
            
           
        }

ログインボタン

        private void button1_Click(object sender, EventArgs e)
        {
    
    
            if(textBox1.Text!="" && textBox2.Text!="")
            {
    
    
                login();
            }
            else
            {
    
    
                MessageBox.Show("输入有空项,请输入");
            }

        }

管理者のホームページ

主にジャンプ関数を実行し、ページが閉じられたときにプログラムを終了するクローズ コールバック関数を追加します。
ここに画像の説明を挿入します

        public AdminFrm()
        {
    
    
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);
        }
        private void NI_FormClosing(object sender, FormClosingEventArgs e)
        {
    
    
            Application.Exit();
        }


        private void 图书管理ToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
    
            BookManageFrm frm = new BookManageFrm();
            frm.ShowDialog();
        }

書籍管理ページ

つまり、t_book 内のデータを操作して行の追加、行の変更、行の削除を行った後、その中の特定の行を検索して
ここに画像の説明を挿入します
書籍データ関数を取得します。

        //从数据库读取数据显示在表格控件中
        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = "select * from t_book";
            IDataReader dc = dao.read(sql);
            string a0,a1, a2,a3, a4,a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
    a0,a1,a2,a3,a4};
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

IDに基づくクエリ関数

        //根据ID查询
        public void InquireId()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select * from t_book where id='{
      
      textBox1.Text}'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

書籍タイトルに基づくクエリ機能

        //根据书名查询 模糊查询
        public void InquireName()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select * from t_book where name like '%{
      
      textBox2.Text}%'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

BookManageFrm_Load

        private void BookManageFrm_Load(object sender, EventArgs e)
        {
    
    
            Fresh();
            string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
            label2.Text = id + dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//书名+书号
        }

本を追加ボタン

            AddBookFrm frm=new AddBookFrm();
            frm.ShowDialog();//打开增加图书页面
            Fresh();//刷新页面

「ブックを変更」ボタン、ブックの変更ページを表示し、そこにパラメータを渡します

            try
            {
    
    
                string id= dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string author = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string press = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string number = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                AltBookFrm altBookFrm = new AltBookFrm(id,name,author,press,number);
                altBookFrm.ShowDialog();

                Fresh();//刷新数据
            }
            catch
            {
    
    
                MessageBox.Show("error");
            }

本を削除する

            try
            {
    
    

                string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                DialogResult dr=MessageBox.Show("确认删除吗?","信息提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
                if(dr==DialogResult.OK)
                {
    
    
                    string sql = $"delete from t_book where id='{
      
      id}'";
                    Dao dao =new Dao();
                    if(dao.Execute(sql)>0)
                    {
    
    
                        MessageBox.Show("删除成功");
                        Fresh();
                    }
                    else
                    {
    
    
                        MessageBox.Show("删除失败");
                    }
                    dao.Close();
                }

            }
            catch
            {
    
    
                MessageBox.Show("请先在表格选中要删除的图书记录","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }

リフレッシュする

        private void button4_Click(object sender, EventArgs e)
        {
    
    
            Fresh();
            textBox1.Text = "";
            textBox2.Text = "";
        }

書籍番号クエリと書籍タイトルクエリの場合は、上記の関数を呼び出すだけです。

        private void button5_Click(object sender, EventArgs e)
        {
    
    
            InquireId();
        }

        private void button6_Click(object sender, EventArgs e)
        {
    
    
            InquireName();
        }

複数行を削除する

            int n = dataGridView1.SelectedRows.Count;//获取当前选中的行数
            string sql = $"delete from t_book where id in (";
            for(int i = 0; i < n; i++)
            {
    
    
                sql += $"'{
      
      dataGridView1.SelectedRows[i].Cells[0].Value.ToString()}',";
            }
            sql = sql.Remove(sql.Length - 1);//删除最后一个字符 因为是从0开始计的
            sql += ")";
            log.SaveLog(sql);
            Dao dao = new Dao();
            if(dao.Execute(sql)>n-1)//受影响的行数大于n-1
            {
    
    
                MessageBox.Show($"成功删除{
      
      n}条图书信息");
                Fresh();
            }

本のページを追加

ここに画像の説明を挿入します
本を追加ボタン

           if(textBox1.Text!=""&& textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && textBox5.Text != "")
           {
    
    

            Dao dao = new Dao();
            
            string sql = $"insert into t_book values('{
      
      textBox1.Text}','{
      
      textBox2.Text}','{
      
      textBox3.Text}','{
      
      textBox4.Text}','{
      
      textBox5.Text}')";
            int n =dao.Execute(sql);
            if(n> 0)
            {
    
    
                MessageBox.Show("添加成功");
            }
            else
            {
    
    
                MessageBox.Show("添加失败");
            }

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
           }
           else
            {
    
    
                MessageBox.Show("输入不允许空");
            }

クリアボタン

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";

書籍ページの編集

ここに画像の説明を挿入します

string ID = "";//登录用户的ID 刚登录的时候就保存在data.cs中

次に、渡されたパラメーターを受け取るパラメーターを含むコンストラクターを作成します。


        public AltBookFrm()
        {
    
    
            InitializeComponent();
        }

        public AltBookFrm(string id,string name,string author,string press,string number)
        {
    
    
            InitializeComponent();
            ID =textBox1.Text = id;
            textBox2.Text = name;
            textBox3.Text = author;
            textBox4.Text = press;
            textBox5.Text = number;
        }

変更ボタン

            string sql = $"update t_book set id='{
      
      textBox1.Text}',[name]='{
      
      textBox2.Text}',author='{
      
      textBox3.Text}',press='{
      
      textBox4.Text}',number={
      
      textBox5.Text} where id='{
      
      ID}'";
            Dao dao = new Dao();
            if(dao.Execute(sql)>0)
            {
    
    
                MessageBox.Show("修改成功");
            }

ユーザーページ

アプリケーションを閉じるには、ジャンプしてこのページを閉じます。
ここに画像の説明を挿入します
終了するには、閉じるようにしてください。

        public UserFrm()
        {
    
    
            InitializeComponent();
            label1.Text = $"欢迎{
      
      Data.UName}登录";
            this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);

        }
        private void NI_FormClosing(object sender, FormClosingEventArgs e)
        {
    
    
            Application.Exit();
        }

ただジャンプしてください

        private void 当前借出图书和归还ToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
    
            UserBookCheckFrm u=new UserBookCheckFrm();
            u.Show();
            
        }



        private void 图书归还ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
    
    
             UserBookCondition userc=new UserBookCondition();
            userc.Show();
        }

本を見る・借りる

実際の操作は t_lend と t_book の 2 ページです t_lend ページはデータ行を追加します t_book の数値 + 1
ここに画像の説明を挿入します
書籍管理ページで書籍番号クエリと書籍タイトルクエリを
更新します

        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = "select * from t_book";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

本をチェックアウトボタン

            string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//获取书号
            string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
            int number=int.Parse(dataGridView1.SelectedRows[0].Cells[4].Value.ToString());//库存
            if(number<1)
            {
    
    
                MessageBox.Show("库存不足");
            }
            else
            {
    
    
                string sql = $"insert into t_lend  ([uid],bid,name,[datetime]) values('{
      
      Data.UID}','{
      
      id}','{
      
      name}',getdate());update t_book set number=number-1 where id='{
      
      id}'";
                Dao dao = new Dao();
                if(dao.Execute(sql)>1)//因为sql里面包含了两条语句
                {
    
    
                    MessageBox.Show($"{
      
      Data.UName}借书成功");
                    Fresh();
                }

            }

本の貸出状況と返却ページ

実際の操作は t_lend と t_book の 2 ページで、t_lend ページはデータを 1 行削減し、t_book の数値を+1
ここに画像の説明を挿入します
して返します。

            string no = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            string bookid = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
            string sql = $"delete from t_lend where[no] = {
      
      no}; update t_book set number = number + 1 where id = '{
      
      bookid}'";
            Dao dao = new Dao();
            if(dao.Execute(sql)>1)
            {
    
    
                MessageBox.Show("归还成功");
                Fresh();
            }

リフレッシュする

        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select *from t_lend where [uid]='{
      
      Data.UID}'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

参考文献


MySQL を学習するには、非常に優れたビデオ
SQL
チュートリアル
ソース コードをインストールしてください
。この記事で十分です。

おすすめ

転載: blog.csdn.net/chengcao123/article/details/126213786