データベースの基本
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
チュートリアル
ソース コードをインストールしてください
。この記事で十分です。