关于数据库、数据源、表、脚本语句的创建、连接与使用的个人学习随笔

创建数据库创建表的工具有很多,看起来似乎很不一样,但其实里面的知识是通用的,理解了数据库相关的知识和相应操作,就算换个工具,也最多是趁不趁手的问题,所以,如果你是准备自学数据库的话,下面的这些基础知识多多少少总会对你有帮助的。

数据库的作用:
数据库其实在更多时候起的是一个索引的作用,类似于一本书籍里的目录部分,数据库一般不用于储存具体的数据,而更多的是用于储存那些数据相应的路径名,因为数据库储存的数据过多、内存过大的话,容易引发一些问题,具体是什么问题我还不是很清楚

不同的数据库扩展名不同:
1、SQL的就是MDF 。
2、Access数据库的扩展名是.mdb 。
3、MSSql数据库的扩展名是.mdf 。
4、Paradox数据库的扩展名是.DB 。
5、Oracle数据库的扩展名是.DBF。
6、dBase数据库的扩展名是.DBF 。
7、FoxPro数据库的扩展名是.DBF 。
8、MS Works数据库的扩展名是.wdb。

这里涉及到很多东西,在博客里很多大佬都有演示数据库的操作,但是他们弄的数据库文件有些其实是不一样的,推荐的很多工具也不一样,自学没人教又不会的话这些东西不知道的怕不是能把人直接送走(没错,说的就是之前的我)。
例如:
Microsoft SQL Server Management studio是创建SQL数据库用的,创建后的数据库后缀名为.mdf
用这个的话还需要用ODBC创建数据源,然后,嗯…这两个在加上你写代码用的工具就够了(比如QT create、vs什么的,在这些写代码的工具里面是不用进行配置属性等方面的更改的,只需要写代码进行相应的操作,至少在QT里面是这样,其他的我还没试过),可以算是一套。(这个是我用的,但这个似乎用的人比较少,听说是因为操作相对复杂,不是很方便,但这个工具相对比较有趣的一点在于它创建的表除了其他工具都有的数据类型,还有一个image类型,可以直接将图片转化为二进制存入数据库,再将数据库里储存的二进制数据读取出来转换为图片,这里需要提示一下,这个数据类型或许会让你觉得有点好玩,但这里我们需要明白一点,数据库其实在更多时候起的是一个索引的作用,类似于一本书籍里的目录部分,数据库一般不用于储存具体的数据,而更多的是用于储存那些数据相应的路径名,因为数据库储存的数据过多、内存过大的话,容易引发一些问题,具体是什么问题我还不是很清楚)

DB Browser for SQLite是创建Paradox数据库用的,创建后的数据库后缀名为.db,用这个的话大概也是需要用ODBC创建数据源的,然后,嗯…这两个在加上你写代码用的工具就够了,也可以算是一套。(本括号内为废话,可跳过:这个我没有完全用,只用了一点点,纯粹是当初不清楚数据库怎么搞,然后用网上碎碎的各种知识拼凑后因为搞不懂而混用掉进坑里——因为网上有资料说DB Browser for SQLite是打开数据库文件浏览创建表的工具,然后我当时用Microsoft SQL Server Management studio创建了数据库,用ODBC创建了数据源连接数据库,又用代码在这个数据库里创建了表格,然后因为不知道怎么用Microsoft SQL Server Management studio查看数据库里创建的表,就照着网上的讲的下了DB Browser for SQLite,试图用它去查看,然后用DB Browser for SQLite理所应当的没找到我之前数据库文件把我吓得半死然后在坑里躺了好久,当然现在觉得挺傻的,不过之前确实不是很清楚数据库就开始乱搞)

Navicat Premium 15 也是一个用于创建数据库数据表的工具,相对来说适用范围更广,使用者也更多,是当前的主流,如果刚开始自学数据库的话,比较推荐这个,虽然我目前还没用过,但看别人用过,确实相对来说会比其他的好很多。

关于如何在创建数据库的工具里手动创建表:
然后网上说的那些打开数据库里新建的表什么的,不同的数据库文件需要的工具是不一样的,
比如
以.mdf后缀名的数据库文件,它是以Microsoft SQL Server Management studio工具创建的,然后要打开这个数据库文件里创建的表的话也能用这个工具打开进行浏览什么的(如下图);
在这里插入图片描述

而以.db为后缀名的数据库文件的是用DB Browser for SQLite 工具创建的,然后要打开这个数据库文件里创建的表的话也能用这个工具打开进行浏览什么的(如下图)。
在这里插入图片描述
关于一些创建数据库工具的下载地址(建议自己找):
DB Browser for SQLite下载地址(当然你们也可以自己找):

https://sqlitebrowser.org/dl/

ODBC工具是电脑自带的(一般来说),自己在电脑里搜索找一下就行,不用另外下载

关于数据源与数据库连接的具体操作(如果你想在你的程序里进行数据库的相应操作,这一步是必不可少):
进行这一步的前置工作是——你已经完成了数据库的创建。
首先,打开创建数据库的工具,点开左边对象资源管理器里的数据库,右键单击,点击新建数据库。
在这里插入图片描述
给数据库取个名字
在这里插入图片描述
然后数据库就算建好了。

接下来要打开ODBC数据源连接刚才你新建的数据库
第一步,打开ODBC数据源,在用户DSN这一栏里,点击添加
在这里插入图片描述
然后选择你创建数据库的那个工具,我这里用的是SQL Server,所以选他,选中后点击完成。
在这里插入图片描述

然后填写相应信息,前两个你想写啥都行,最后一个服务器名,在你创建数据库那里可以看到,比如我这里的 LAPTOP-NV6N3MMM 就是服务器名,把它填上。

在这里插入图片描述

在这里插入图片描述
选择用用户登录输入ID和密码,登录ID和密码我设置的跟打开数据库的一样,弄完下一页
在这里插入图片描述
把更改默认数据库勾起来,然后选择自己刚才新建的数据库,弄完下一页
在这里插入图片描述
这一页对于我这种初学者来说就没有操作的必要了,直接点完成
在这里插入图片描述
然后点击测试数据源,点击后显示测试成功就完成了。
在这里插入图片描述

现在我们有了数据库和数据源,还差最后一步你们就可以自己的骚操作了。
在写代码的软件里(我这里是QT),
pro文件里需要添加

QT       += sql

share_variate.h文件

extern QSqlDatabase db;   

extern bool isOk;

extern bool isOpenDatabase;

share_variate.cpp文件

#include"share_variate.h"

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");;

bool isOk=0;

bool isOpenDatabase=0;

attandance_management_dabase.h文件

#ifndef ATTENDANCE_MANAGEMENT_DATABASE_H
#define ATTENDANCE_MANAGEMENT_DATABASE_H

bool OpenDatabase();

#endif // ATTENDANCE_MANAGEMENT_DATABASE_H

attandance_management_dabase.cpp文件

#include"attendance_management_database.h"
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QSqlError>
#include<QDebug>
#include<QMessageBox>
#include"share_variate.h"
//attendance_management_odbc_user
//attendance_management_odbc_t1.db
bool OpenDatabase()
{
//需要创建的是用户DSN,不能创建系统DSN和文件DSN,创建了后面那两个没用(也可能是我不会用,很大可能)
//QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); //这个我是在 share_variate.h里声明,share_variate.cpp里定义的
   db = QSqlDatabase::addDatabase("QODBC");   
   qDebug()<<"ODBC driver?"<<db.isValid();
   QString dsn = QString::fromLocal8Bit("a_m_odbc_1");      //数据源名称//按照上文我给的步骤图应该是dd,但那只是个演示,我并没有真正创建dd数据源,我创建的数据源名称其实是a_m_odbc_1
   db.setHostName("LAPTOP-NV6N3MMM");                         //LAPTOP-NV6N3MMM 服务器名
   db.setDatabaseName(dsn);                            //设置数据源名称
   db.setUserName("sa");                               //登录用户
   db.setPassword("18377369175clq");                   //密码
   isOk=db.open();
   if(!isOk)                                      //打开数据库
   {
       qDebug()<<db.lastError().text();
       QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
       return false;                                   //打开失败
   }
   else
   {
       qDebug()<<"database open success!";
       qDebug()<<"db.lastError().text():"<<db.lastError().text();
   }


   return true;
}

最后就是放到你的cpp文件里进行调用

//创建数据库
OpenDatabase();

这只是我的方法,大概给大家看一下怎么弄而已,不必全照着我的来。

当然,正如前面所说的,写代码的工具大抵都是能和数据库配合进行相应操作,vc自然也不例外,这里面大概的知识点和操作流程都差不多,只是换了个工具,需要进行一定的转换(这一块我后面会补上,目前还没有进行尝试,但已经在博客上看到了相应的操作,有需要的大家可以先搜一下)。

///
在vs里面,先打开“工具”,然后点击“连接数据库”
在这里插入图片描述
数据源名称就是你前面创建数据源自己设置的名称,再填上用户名和密码(我的用户名密码在数据库那里和在数据源那里设置得都一样,所以我也不清楚这个到底是哪个),再点击“测试连接”
在这里插入图片描述
出现下面这个说明大概就没出什么大问题了,然后再点击右下角的“高级”
在这里插入图片描述
复制最后一行的内容,像我这里就是“Dsn=a_m_odbc_1;uid=sa”,复制完先放好,后面在vs里写代码连接数据库时的那个语句要用
在这里插入图片描述
连接完数据库,就继续在工具那里,点击“连接服务器”,服务器的名称前面也有讲,点击确定
在这里插入图片描述
连接完数据库和服务器,我发现这里还有个新建查询,就顺便说一下,这个功能在创建数据库、表的那个工具里也有,其实就是用脚本语句对数据库进行一些相应的操作,比如搜索数据库内某个表格内的符合某些条件的某些信息、更新信息、删除信息、插入信息等等。

在这里插入图片描述
点击了新建查询之后就会出现下图,数据库就在自己创建的那个,服务器的名称我前面有讲怎么看自己的服务器的名称,复制过来填上,身份验证用SQL server(我用的是),然后点击连接
在这里插入图片描述
连接后大概长下图这样,那句select * from User_information就是脚本,这个后面会讲
在这里插入图片描述
然后我们继续回归正题,连接好数据库、服务器后,我们还要再向我前面上一个的例子那样,还要有一些代码连接数据库(具体的我还没搞过,晚点补上,SqlConnection肯定是要用的)

SqlConnection类
命名空间:
System.Data.SqlClient
程序集:
System.Data.SqlClient.dll
表示到 SQL Server 数据库的连接。 此类不能被继承。

以下示例创建一个 SqlCommand 和一个 SqlConnection。 打开SqlConnection并设置为Connection SqlCommand 然后,该示例调用 ExecuteNonQuery。 为此,将ExecuteNonQuery传递一个连接字符串和一个查询字符串,该字符串是 Transact-SQL INSERT 语句。 当代码退出 using 块时,连接会自动关闭。
C#

private static void CreateCommand(string queryString,
string connectionString)
{
using (SqlConnection connection = new SqlConnection(
           connectionString))
{
    SqlCommand command = new SqlCommand(queryString, connection);
    command.Connection.Open();
    command.ExecuteNonQuery();
}
}

若要确保连接始终关闭,请在块内部 using 打开连接,如以下代码片段所示。 这样做可确保代码退出块时自动关闭连接。
C#

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Do work here; connection closed on following line.
}

/
完成这一步之后,玩转数据库自然少不了脚本语句。

关于脚本(除了列名和准备填充的内容,其他部分大小写应该不用太过在意,至少在sql server里是这样):
刚开始接触数据库的自学者,大概在网上看到下面这些东西会感到疑惑,毕竟大多数博主都会默认你明白而不会在这方面做详细的讲解介绍(可能是代码类专业的在学校时这些老师都会在课上讲到,我并不清楚,纯属猜测)

INSERT INTO Notification_information (Notification_title, Notification_content,date,time)VALUES ('阿发阿女第四个是','安放的故事','2022-01-05','18:33:43')

INSERT INTO 就是插入的意思
Notification_information 指的是我创建的一个表的名字
(Notification_title, Notification_content,date,time) 括号里的是我那个表里面的每个列名,附图如下
在这里插入图片描述
VALUES (‘阿发阿女第四个是’,‘安放的故事’,‘2022-01-05’,‘18:33:43’) 则是准备赋给表格里的内容,其对应相应的列的名称及数据类型

其实这些就是脚本,你可以在写代码用的软件里,用代码去执行它,也可以在创建数据库的工具里执行,脚本的其中一个作用就与这个有关,有时候你在代码里运行时,程序没有报错也没有中断,但数据却没能导入数据库,这时你就应该将你的脚本弄出来进行检查(因为大概率是脚本格式不对,如果你是用多个QString或者多个string之类的相加组成相应脚本的话),比如:

notification_textedit_content_qstr=ui->textEdit->toPlainText();
title_send_lineEdit_qstr=ui->title_write_lineEdit->text();
//获取当前时间
QTime notification_time=QTime::currentTime();
//qDebug()<<"时间time:"<<time;
notification_time_qstr=notification_time.toString("HH:mm:ss");

//获取当前日期
QDate notification_date=QDate::currentDate();
notification_date_qstr=notification_date.toString();
QSqlQuery query;
QString Notification_information_insert="INSERT INTO Notification_information (Notification_title, Notification_content,date,time)";
QString Notification_information_values="VALUES ("
        +title_send_lineEdit_qstr+','
        +notification_textedit_content_qstr+','
        +notification_date_qstr+','
        +notification_time_qstr+")";
QString Notification_information_all=Notification_information_insert+Notification_information_values;
query.exec(Notification_information_all);

这是一个错误示范,从外表上来看,逻辑似乎是没有问题的,并且运行也是没有问题的,程序不会中断也不会报错。但这里只要你在后面再加一句

qDebug()<<Notification_information_all;

将其脚本输出出来,大概是长这样

INSERT INTO Notification_information (Notification_title, Notification_content,date,time)VALUES (阿发阿女第四个是,安放的故事,周一 7月 4 2022,21:47:57)

这时候其实就可以看出脚本有问题了,
这里面,中文字符串应该用单括号括起来,如’阿发阿女第四个是’,‘安放的故事’
日期date的格式也是错的,应该将格式变换为yyyy-MM-dd这种,即’2022-01-05’,注意,这里也要用单括号将其括起来。
如果你不确定,就再把这个脚本复制粘贴到创建数据库的工具里试运行一下,如果有错误,在那个工具里就会有相应显示、警告、报错之类的,不出意外的话,大多数能创建数据库创建表的工具都是能进行脚本执行的,最多是位置不一样,只能是大家自己找找。
下面举个我目前在用的例子:
在Microsoft SQL Server Management studio工具里,
一开始打开是这样(注意:这里指的是创建了数据库以及数据表后的操作,该演示也是在创建好后的情况下进行的)
在这里插入图片描述
如果我们直接左键点击 新建查询 (新建查询:用于将脚本放入并运行脚本),就会导致下面问题
在这里插入图片描述
看到这个红色波浪线是不是已经感觉不对劲了?再点击执行,就会出现下面这一幕
在这里插入图片描述

出现上面这个问题是因为我们想要对表Notification_information 进行操作,却没有选中相应的表Notification_information

因而,正确的做法是,我们需要先点开相应数据库,左键选中相应表格,再将脚本填入,如下图
在这里插入图片描述
填入脚本后,点击执行,如果弹出下面提示,则说明你的脚本是没有问题的
在这里插入图片描述
注意:qDebud()的输出对于我们来说是十分重要的,特别是你将要进行数据库的相关操作时更是如此。
bool QSqlQuery :: exec(const QString&query)
执行SQL中的query。返回 true ,如果查询成功,则将查询状态设置为active;否则,返回false。返回false的话,建议用 .lastError().text(); 进行检查(头文件为#include),用qDebug()输出错误信息,操作大致如下

QSqlQuery query_select;
qDebug()<<"query_select:"<<query_select.exec("select * from Notification_information");
qDebug()<<"query_select.lastError().text():"<<query_select.lastError().text();

关于"[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 ‘Notification_information’ 无效。 [Microsoft][ODBC SQL Server Driver][SQL Server]该游标未声明。 QODBC3: Unable to execute statement"的一些可能的原因及解决方法:
1.系统中有多个实例,或者多个版本的sqlserver,需要核查端口号1433(或者拥有该表的sqlserver的端口号)
2.数据库中没有这张表(通过MDF依附或者sql脚本得到的表不一定满足运行需求)
a.生成sql脚本时只包含了架构,
b.MDF文件本身不完整
解决方法为自己创建相应的表
3.当前sqlserver的登录用户在运用的数据库中的权限是否为最高(权限低则查不到表)
4.使用SQL查询语句select * from Notification_information报这个错,可以试试将SQL语句改为select * from attendance_management_database.dbo.Notification_information
其中,attendance_management_database是数据库名
dbo是在创建数据库的工具里打开时能看到的表的前缀,上面的图仔细看的话是看得到的
Notification_information是表名
试试看能不能解决
5.检查一下的数据源连接的数据库是否正确,如果你的表在数据库A里,你的数据源连接的数据库是数据库B,也会导致这个问题

还有一些其他的小问题,比如说哪天你不小心关掉(或者你什么都没干,一个晚上过去,第二天早上就报错如下)。
注意:下图是打开创建数据库的工具准备检查数据库是不是出问题了时登录的报错截图,不是在写代码的工具里运行代码报的,那里报的错我没留图,忘了是什么了,反正大概的意思是数据源跟数据库有问题没连接上什么的,看到的时候大概率就知道要去检查一下数据源和数据库的。

标题: 连接到服务器
------------------------------

无法连接到 LAPTOP-NV6N3MMM。

------------------------------
其他信息:

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接) (Microsoft SQL Server,错误: 2)

有关帮助信息,请单击: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-2-database-engine-error

------------------------------

系统找不到指定的文件。

------------------------------
按钮:

确定
------------------------------

在这里插入图片描述

出现这种情况,可能是配置管理器里SQL Serve配置管理器中的SQL Serve代理 关闭了,你检查一下看看它的状态是不是已停止,是的话就把它打开启动,最后的状态应该是 正在运行(这些操作是基于我的LAPTOP-NV6N3MMM是在SQL Serve代理里的)在这里插入图片描述

在这里插入图片描述
这个大致原因就是这个,你需要看看你的放在哪里,如果那里已停止,就启动它,再重新打开你创建数据库的那个工具。
然后,至少我的问题是解决了。

最后再补充一些常用的数据库操作脚本

查询数据库中user_information表的所有信息

select * from user_information

插入数据库user_information表的id,name,sex等列,第一个括号内是列名,第二个括号内是插对应列的内容,注意,第二个括号内,中文要用单引号隔开

insert into user_information (id, name, sex,age,state,face_image,face_feature) values(12,'阿萨','男',12,1,'D://1.png','D://1.mat')

更新数据库中id为13的那一行信息的姓名name更改为 钱爱飞 :

update user_information set name= '钱爱飞' where id = 13

删除数据库中id为13的那一行信息

delete  from user_information where id=13

在写代码时灵活一些的脚本使用示例示范:
1:

QString delete_qstr=QString("delete  from user_information where id='%1'")
                .arg(ui->id_lineEdit->text());
                QSqlQuery query_delete;
                qDebug()<<"query_delete.exec(delete_qstr):"<<query_delete.exec(delete_qstr);
                qDebug()<<"query_delete.lastError():"<<query_delete.lastError();

2:

QString sql_select="select * from user_information";
QSqlQuery query;
qDebug()<<"query.exec(sql_select):"<<query.exec(sql_select);
qDebug()<<"query.lastError():"<<query.lastError();
while(query.next())
{
QTime time=QTime::currentTime();
QString time_qstr=time.toString("HH:mm:ss");
QString sql_time_change=QString("update user_information set attandance_time='%1' where name= '%2'")
                          .arg(time_qstr)
                          .arg(query.value(1).toString());
qDebug()<<"query.exec(sql_time_change):"<<query.exec(sql_time_change);
qDebug()<<"query.lastError():"<<query.lastError();
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值