SqlHelper数据库通用访问类的创建和使用
- 格式:doc
- 大小:108.50 KB
- 文档页数:3
C#--SqlServer--插⼊⼀条数据和插⼊多条数据的⽅法1,SQLHelper帮助类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;using System.Configuration;//引⼊读取配置⽂件的命名空间namespace DAL.Helper{/// <summary>/// 通⽤数据访问类/// </summary>public class SQLHelper{// private static string connString = "Server=aaaa\\sqlexpress;DataBase=StudentManageDB;Uid=sa;Pwd=password01!";//public static readonly string connString = Common.StringSecurity.DESDecrypt(ConfigurationManager.ConnectionStrings["connString"].ToString());static string connString = "Server=.;DataBase=TighteningResultDB;Uid=sa;Pwd=123";/// <summary>/// 执⾏增、删、改⽅法/// </summary>/// <param name="sql"></param>/// <returns></returns>public static int Update(string sql){SqlConnection conn = new SqlConnection(connString);SqlCommand cmd = new SqlCommand(sql, conn);try{conn.Open();return cmd.ExecuteNonQuery();}catch (Exception ex){//将错误信息写⼊⽇志...throw ex;}finally{conn.Close();}}/// <summary>/// 执⾏单⼀结果(select)/// </summary>/// <param name="sql"></param>/// <returns></returns>public static object GetSingleResult(string sql){SqlConnection conn = new SqlConnection(connString);SqlCommand cmd = new SqlCommand(sql, conn);try{conn.Open();return cmd.ExecuteScalar();}catch (Exception ex){//将错误信息写⼊⽇志...throw ex;}finally{conn.Close();}}/// <summary>/// 执⾏结果集查询/// </summary>/// <param name="sql"></param>/// <returns></returns>public static SqlDataReader GetReader(string sql){SqlConnection conn = new SqlConnection(connString);SqlCommand cmd = new SqlCommand(sql, conn);try{conn.Open();return cmd.ExecuteReader(CommandBehavior.CloseConnection);}catch (Exception ex){conn.Close();//将错误信息写⼊⽇志...throw ex;}}/// <summary>/// 执⾏查询返回⼀个DataSet/// </summary>/// <param name="sql"></param>/// <returns></returns>public static DataSet GetDataSet(string sql){SqlConnection conn = new SqlConnection(connString);SqlCommand cmd = new SqlCommand(sql, conn);SqlDataAdapter da = new SqlDataAdapter(cmd);//创建数据适配器对象DataSet ds = new DataSet();//创建⼀个内存数据集try{conn.Open();da.Fill(ds);//使⽤数据适配器填充数据集return ds;}catch (Exception ex){//将错误信息写⼊⽇志...throw ex;}finally{conn.Close();}}}}2,插⼊⼀条数据:public int AddTighteningResult(PMOpenProtocol.TighteningResultData data){//【1】编写SQL语句StringBuilder sqlBuilder = new StringBuilder();//如果字符串⽐较长,可以⽤StringBuildersqlBuilder.Append("insert into TighteningResult(TighteningID,ProductSN,StationCode,StationName,BoltNumber,TighteningStatus,ResultDateTime,FinalTouque,FinalAngle,OperateDateTime,OperateFlat,ErrorInfo)"); sqlBuilder.Append(" values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}')");//【2】解析对象string sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_1, data.t_D_TIGHTENING_STATUS_1, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_1, data.t_D_ANGLE_1, "", 0, "");//【3】提交到数据库try{return SQLHelper.Update(sql);}catch (SqlException ex){throw new Exception("数据库操作出现异常!具体信息:" + ex.Message);}catch (Exception ex){throw ex;}}sql语句:insert intoTighteningResult(TighteningID,ProductSN,StationCode,StationName,BoltNumber,TighteningStatus,ResultDateTime,FinalTouque,FinalAngle,OperateDateTime,OperateFlat,ErrorInfo) values('','','','Stn 01','01','NG','2021/8/29 23:05:42','4.1983','0','',0,'') 3,插⼊多条数据:搜索到的⽅法:使⽤UNION ALL来进⾏插⼊操作:代码如下:INSERT INTO MyTable(ID,NAME)SELECT 4,'000'UNION ALLSELECT 5,'001'UNION ALLSELECT 6,'002'实现上⾯的⽅法:public int AddMultiTighteningResult(PMOpenProtocol.TighteningResultData data){//【1】编写SQL语句StringBuilder sqlBuilder = new StringBuilder();//如果字符串⽐较长,可以⽤StringBuildersqlBuilder.Append("insert into TighteningResult(TighteningID,ProductSN,StationCode,StationName,BoltNumber,TighteningStatus,ResultDateTime,FinalTouque,FinalAngle,OperateDateTime,OperateFlat,ErrorInfo)"); sqlBuilder.Append(" select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");//【2】解析对象string sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_1, data.t_D_TIGHTENING_STATUS_1, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_1, data.t_D_ANGLE_1, "", 0, "");if (data.t_D_Number_of_Bolts >= 2){sqlBuilder=new StringBuilder(sql);sqlBuilder.Append("union all select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_2, data.t_D_TIGHTENING_STATUS_2, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_2, data.t_D_ANGLE_2, "", 0, "");}if (data.t_D_Number_of_Bolts >= 3){sqlBuilder = new StringBuilder(sql);sqlBuilder.Append("union all select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_3, data.t_D_TIGHTENING_STATUS_3, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_3, data.t_D_ANGLE_3, "", 0, "");}if (data.t_D_Number_of_Bolts >= 4){sqlBuilder = new StringBuilder(sql);sqlBuilder.Append("union all select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_4, data.t_D_TIGHTENING_STATUS_4, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_4, data.t_D_ANGLE_4, "", 0, "");}if (data.t_D_Number_of_Bolts >= 5){sqlBuilder = new StringBuilder(sql);sqlBuilder.Append("union all select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_5, data.t_D_TIGHTENING_STATUS_5, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_5, data.t_D_ANGLE_5, "", 0, "");}if (data.t_D_Number_of_Bolts >= 6){sqlBuilder = new StringBuilder(sql);sqlBuilder.Append("union all select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10},'{11}'");sql = string.Format(sqlBuilder.ToString(),"", "", "", data.StationName, data.OrdinalBoltNumber_6, data.t_D_TIGHTENING_STATUS_6, Convert.ToDateTime(data.t_D_REAL_TIME), data.t_D_TORQUE_6, data.t_D_ANGLE_6, "", 0, "");}//【3】提交到数据库try{return SQLHelper.Update(sql);}catch (SqlException ex){throw new Exception("数据库操作出现异常!具体信息:" + ex.Message);}catch (Exception ex){throw ex;}}sql语句:insert intoTighteningResult(TighteningID,ProductSN,StationCode,StationName,BoltNumber,TighteningStatus,ResultDateTime,FinalTouque,FinalAngle,OperateDateTime,OperateFlat,ErrorInfo)select '','','','Stn 01','01','NG','2021/8/29 23:09:20','4.1983','0','',0,''union all select '','','','Stn 01','02','NG','2021/8/29 23:09:20','0','0','',0,''union all select '','','','Stn 01','03','OK','2021/8/29 23:09:20','475.19','360.791','',0,''union all select '','','','Stn 01','04','NG','2021/8/29 23:09:20','4.5254','0','',0,''union all select '','','','Stn 01','05','NG','2021/8/29 23:09:20','4.6731','0','',0,''union all select '','','','Stn 01','06','NG','2021/8/29 23:09:20','3.9974','0','',0,''。
sqlsugarhelper-单例-回复什么是sqlsugarhelper单例模式?单例模式是面向对象编程中常用的一种创建对象的设计模式。
它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
sqlsugarhelper单例模式是在使用sqlsugarhelper的过程中,对其进行封装,使其只能实例化一个对象,并提供一个全局访问点。
这样,就可以确保在整个程序中,只有一个实例能够操作数据库。
sqlsugarhelper是一个基于.NET平台的开源ORM(对象关系映射)框架。
它简化了与数据库的交互操作,提供了一系列简单易用的API,使开发人员无需编写复杂的SQL语句,就能够实现对数据库的操作。
那么,为什么需要将sqlsugarhelper更改为单例模式呢?这是因为在某些情况下,我们需要确保在整个应用程序中,只有一个数据库连接实例。
这样可以避免频繁地创建和释放连接,减少了资源的消耗,并提高了性能。
接下来,我们来逐步讲解sqlsugarhelper单例模式的实现过程。
第一步,创建一个名为SqlSugarHelper的类,该类负责连接数据库、执行SQL语句等操作。
在这个类的私有构造函数中,连接数据库并初始化数据库连接实例。
第二步,在SqlSugarHelper类中,创建一个私有静态属性_instance,用于保存SqlSugarHelper类的唯一实例。
初始时,将其置为null。
第三步,创建一个公共静态方法GetInstance(),在这个方法中进行单例模式的实现。
首先判断_instance是否为空,如果为空,则实例化一个SqlSugarHelper对象并将其赋值给_instance。
如果不为空,则直接返回_instance。
这样就保证了在整个应用程序中,只有一个SqlSugarHelper 对象。
第四步,为SqlSugarHelper类提供其他相关的数据库操作方法,比如执行查询、插入、更新和删除等。
sqliteopenhelper接口使用方法SQLiteOpenHelper接口使用SQLiteOpenHelper是Android平台上用于管理SQLite数据库的一个重要接口。
它提供了数据库的创建、升级和打开等功能,方便我们在Android应用中使用数据库。
本文将详细介绍SQLiteOpenHelper接口的各种方法及其使用方法。
1. 简介SQLiteOpenHelper是Android提供的一个辅助类,用于管理SQLite数据库的创建和升级。
它是一个抽象类,我们需要继承它并实现一些方法才能使用。
2. 方法2.1 构造方法SQLiteOpenHelper提供了两个构造方法:•SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)•SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version,DatabaseErrorHandler errorHandler)其中,参数说明如下:•context:上下文对象,一般传入当前的Activity或Application的实例。
•name:数据库名称。
•factory:可选的游标工厂,默认为null。
•version:数据库版本号。
•errorHandler:可选的数据库错误处理器,默认为null。
2.2 onCreate()当数据库首次创建时,系统会调用onCreate()方法,我们可以在此方法中执行数据库表的创建操作。
注意,onCreate()方法只会在数据库第一次创建的时候调用。
2.3 onUpgrade()当数据库需要升级时,系统会调用onUpgrade()方法。
我们可以在此方法中执行数据库表的修改操作。
需要注意的是,如果应用发布后,要修改数据库结构,则需要修改数据库的版本号(version),并实现此方法。
help_topic建表语句当我们谈到数据库时,"建表语句"通常指的是用于创建数据库中表格的SQL语句。
SQL是结构化查询语言的缩写,是用于管理关系型数据库的标准语言。
下面是一个简单的例子,展示了如何使用SQL语句来创建一个名为"users"的表格:sql.CREATE TABLE users (。
id INT PRIMARY KEY,。
username VARCHAR(50) NOT NULL,。
email VARCHAR(100) NOT NULL,。
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP.);在这个例子中,我们使用了CREATE TABLE语句来创建一个名为"users"的表格。
表格中包含了id、username、email和created_at四个字段。
id被定义为INT类型,并且被指定为主键(PRIMARY KEY),这意味着它的值必须是唯一的。
username和email字段被定义为VARCHAR类型,并且被指定为NOT NULL,这表示它们的值不能为空。
最后,created_at字段被定义为TIMESTAMP类型,并且被指定为默认值为当前时间戳。
除了上面的例子,建表语句还可以包括其他的约束和属性,比如外键约束、唯一约束、默认值等。
在实际应用中,建表语句的具体内容会根据表格的需求和设计来进行调整。
总的来说,建表语句是用来定义数据库中表格结构的重要工具,它可以帮助我们在数据库中存储和管理数据。
希望这个回答能够帮助你更好地理解建表语句的概念和用法。
SQLHelper#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysqlimport threadingfrom DBUtils.PooledDB import PooledDBclass SqlHelper(object):def __init__(self):self.pool = PooledDB(creator=pymysql, # 使⽤链接数据库的模块maxconnections=6, # 连接池允许的最⼤连接数,0和None表⽰不限制连接数mincached=2, # 初始化时,链接池中⾄少创建的链接,0表⽰不创建blocking=True, # 连接池中如果没有可⽤连接后,是否阻塞等待。
True,等待;False,不等待然后报错ping=0,# ping MySQL服务端,检查是否服务可⽤。
# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host='127.0.0.1',port=3306,user='root',password='123',database='cmdb',charset='utf8')self.local = threading.local()def open(self):conn = self.pool.connection()cursor = conn.cursor()rv = getattr(self.local, 'stack', None)if not rv:self.local.stack = rv = []rv.append((conn, cursor))return cursordef close(self, cursor, conn):cursor.close()conn.close()def fetchall(self, sql, *args):""" 获取所有数据 """conn, cursor = self.open()cursor.execute(sql, args)result = cursor.fetchall()self.close(conn, cursor)return resultdef fetchone(self, sql, *args):""" 获取所有数据 """conn, cursor = self.open()cursor.execute(sql, args)result = cursor.fetchone()self.close(conn, cursor)return resultdef __enter__(self):rv = self.open()print(self.local.stack)return rvdef __exit__(self, exc_type, exc_val, exc_tb):rv = getattr(self.local, 'stack', [])if not rv:returnconn, cursor = rv.pop()conn.close()cursor.close()db = SqlHelper()if __name__ == '__main__':with db as c1:print(111)with db as c2:print(222)print(333)with db as c3:print(666)。
sql创建数据库语句SQL是结构化查询语言的缩写,是一种用于管理关系型数据库的编程语言。
SQL语言可以用于创建、修改和删除数据库中的表、索引、视图和存储过程等数据库对象。
本文将介绍SQL创建数据库的语句,帮助读者了解如何使用SQL语言创建自己的数据库。
一、创建数据库在SQL中创建数据库的语句是CREATE DATABASE。
该语句需要指定数据库的名称,例如:CREATE DATABASE my_database;这个语句将创建名为“my_database”的数据库。
如果要在创建数据库时指定数据库的字符集和排序规则,可以使用以下语句:CREATE DATABASE my_databaseCHARACTER SET utf8mb4COLLATE utf8mb4_general_ci;这个语句将创建名为“my_database”的数据库,并将字符集设置为“utf8mb4”,排序规则设置为“utf8mb4_general_ci”。
二、创建表在SQL中创建表的语句是CREATE TABLE。
该语句需要指定表的名称、列名和数据类型,例如:CREATE TABLE my_table (id INT PRIMARY KEY,name VARCHAR(255),age INT);这个语句将创建名为“my_table”的表,并定义了3个列:id、name和age。
其中,id列被定义为主键,数据类型为INT;name列被定义为VARCHAR类型,长度为255;age列被定义为INT类型。
在创建表时,还可以指定列的约束条件,例如:CREATE TABLE my_table (id INT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT DEFAULT 0);这个语句将创建名为“my_table”的表,并定义了3个列:id、name和age。
其中,id列被定义为主键,数据类型为INT;name列被定义为VARCHAR类型,长度为255,并且设置了NOT NULL约束条件;age列被定义为INT类型,并设置了DEFAULT约束条件,当没有指定age列的值时,将默认为0。
使用SQLiteOpenHelper创建数据库SQLiteOpenHelper 是Android 提供的一个抽象工具类,负责管理数据库的创建、升级工作。
如果我们想创建数据库,就需要自定义一个类继承SQLiteOpenHelper,然后覆写其中的抽象方法。
一、创建SQLiteOpenHelper类【文件1-1】MySQLiteOpenHelper.java1.package com.itheima.android.sqlite.db;2.3.import android.content.Context;4.import android.database.sqlite.SQLiteDatabase;5.import android.database.sqlite.SQLiteDatabase.CursorFactory;6.import android.database.sqlite.SQLiteOpenHelper;7.import android.util.Log;8./**9.*10.* @author wzy2015-10-2311.* 管理数据库的创建和升级12.*13.*/14.public class MySQLiteOpenHelper extends SQLiteOpenHelper{15.16.private static final String TAG = "MySQLiteOpenHelper";217.//定义数据库文件名18.public static final String TABLE_NAME ="myuser.db";19.20./**21.*22.* @param context23.* @param name 数据库文件的名称24.* @param factory null25.* @param version 数据库文件的版本26.*/27.private MySQLiteOpenHelper(Context context, String name, CursorFactory factory,28.int version){29.super(context, name, factory,version);30.}31./**32.* 对外提供构造函数33.* @param context34.* @param version35.*/36.public MySQLiteOpenHelper(Context context,int version){37.//调用该类中的私有构造函数38.this(context,TABLE_NAME,null, version);39.}40./*41.* 当第一次创建数据的时候回调方法42.*/43.@Override44.public void onCreate(SQLiteDatabase db){45.Log.d(TAG,"onCreate");46.//创建数据库表的语句47.String sql= "create table t_user(uid integer primary key not null,48.c_name varchar(20),c_age integer,c_phone varchar(20))";49.db.execSQL(sql);50.}51./*52.* 当数据库升级是回调该方法53.*/54.@Override55.public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {56.Log.d(TAG,"onUpgrade: oldVersion"+oldVersion+" newVersion="+newVersion);57.String sql= "alter table t_user add c_money float";58.db.execSQL(sql );59.}60./*61.* 当数据库被打开时回调该方法362.*/63.@Override64.public void onOpen(SQLiteDatabase db) {65.Log.d(TAG,"onOpen");66.}67.68. }注意:上面的代码我们只是定义了一个MySQLiteOpenHelper类继承了SQLiteOpenHelper类。
创建数据库的SQL语句可以使用CREATE DATABASE语句。
以下是创建数据库的步骤:
1.打开数据库管理工具或命令行界面。
2.输入CREATE DATABASE语句,后跟数据库的名称。
例如:CREATE DATABASE
mydatabase。
3.按下Enter键执行该语句。
4.如果数据库已经存在,则会收到一个错误消息。
在这种情况下,可以使用IF NOT EXISTS语句
来避免错误。
例如:CREATE DATABASE IF NOT EXISTS mydatabase。
5.等待数据库创建完成。
这可能需要一些时间,具体取决于数据库的大小和服务器性能。
6.使用USE语句切换到新创建的数据库。
例如:USE mydatabase。
7.现在您可以使用该数据库来创建表、视图等对象,并开始使用数据库进行各种操作。
请注意,创建数据库需要具有适当的权限。
如果您没有足够的权限,请联系您的数据库管理员或系统管理员以获取帮助。
sqlserver建库建表(数据库和数据表的常⽤操作)数据库和数据表(开发常⽤操作)⼀,数据库的创建⼀个SQLServer 是由两个⽂件组成的:数据⽂件(mdf) 和⽇志⽂件(ldf),所以我们创建数据库就是要为其指定数据库名、数据⽂件和⽇志⽂件。
a) create database 数据库名;例:create database mydb;数据⽂件和⽇志⽂件存放在默认⽂件夹数据库⽂件名为mydb.mdf,⽇志⽂件的名字为mydb.ldfb) 创建数据库的完整语句(⾃⼰定义数据⽂件和⽇志⽂件的位置)create database mydbon(name='mydb123',filename='C:\mydb.mdf',--数据⽂件保存位置size=10,--数据库初始⼤⼩以M 为单位maxsize=50,--数据库⼤⼩的最⼤值filegrowth=5 --当数据库数据⼤⼩超过默认值,每次增长的⼤⼩)log on(name='mydb_ldf',filename='C:\mydb_log.ldf',size=5,maxsize=50,filegrowth=5);2) 使⽤数据库use 数据库名;3) 删除数据库drop database数据库名;1. 数据库的备份:将数据库⽂件⽣成⼀个本份⽂件(dat⽂件)backup database 数据库名 to disk=’路径’;backup database mydb to disk='D:\mmm.dat' with format;2. 数据库的还原:根据备份⽂件恢复数据库a) 查看备份⽂件的信息restore filelistonly from disk='D:\mmm.dat';b) 将数据库⽂件还原到备份前的位置restore database mydb from disk='D:\mmm.dat';c) 将数据库⽂件还原到指定位置restore database mydb from disk='D:\mmm.dat'with move 'mydb' to 'F:\mydb.mdf',move 'mydb_log' to 'F:\mydb_log.ldf';三,模式(命名空间)1. 创建模式create schema 模式名 authorization 登录名;例:create schema model01 authorization sa;2. 删除模式a) 级联删除:如果模式中有表,先删除表再删除模式。
如何使用SQL创建和管理数据库在当今数字化时代,数据已成为企业和组织管理的重要组成部分。
而SQL(结构化查询语言)是一种用于创建和管理数据库的强大工具。
无论是作为数据库管理员(DBA)还是开发人员,了解如何使用SQL创建和管理数据库都是必须的技能。
本文将介绍如何使用SQL创建和管理数据库,并分为以下章节:第一章:概述在本章节中,我们将简要介绍数据库以及SQL的基本概念。
数据库是一个组织结构化数据的集合,而SQL是一种用于管理这些数据的语言。
我们还将了解SQL的常见用途以及它与其他数据库管理系统的关系。
第二章:SQL的基本操作在这一章中,我们将学习SQL的基本操作,包括创建表格、插入数据、更新数据和删除数据。
我们将以示例代码的形式演示每个操作,并给出详细说明,以便读者能清楚地理解每个操作的用途和语法。
第三章:数据类型和约束在本章中,我们将详细介绍SQL的数据类型和约束。
数据类型定义了一个列或字段可以存储的数据的类型。
而约束则定义了对数据的限制条件,以确保数据的完整性和一致性。
我们将讨论常见的数据类型和约束,如整数、字符串、日期和主键、外键等。
第四章:查询和过滤数据在这一章节中,我们将学习如何使用SQL查询和过滤数据库中的数据。
查询是从数据库中检索数据的过程,而过滤是根据特定条件筛选数据的过程。
我们将介绍SQL的基本查询语句和常用的过滤条件,如WHERE子句、AND和OR操作符等。
我们还将探讨如何对查询结果进行排序和分组。
第五章:连接和关联数据表在本章中,我们将研究连接和关联多个数据表的方法。
连接是将两个或多个表格中的相关数据关联起来的过程,而关联则是指定数据之间的关系。
我们将学习不同类型的连接操作,如内连接、外连接和自连接,并提供示例代码帮助读者更好地理解这些概念。
第六章:索引和优化查询在这一章节中,我们将讨论索引的作用和优化查询的方法。
索引是一种数据结构,可以提高查询的速度和效率。
我们将介绍如何创建索引以及何时使用索引。
SqlHelper数据库通用访问类
对数据库的操作进行分析可以知道,对数据库的操作分为增、删、
改、查4种操作。下面分两类进行介绍:
1、进行增、删、改操作都是利用Command对象的
ExecuteNonQuery()方法来执行的,该方法返回执行相应的增、删、改
操作之后在数据库中受影响的行数;
2、而对数据库的查询可以分为两大类:
一类是连接式查询,这种查询是利用Command对象的
ExecuteReader()方法来执行的,返回一个SqlDataReader对象。特点
是:在查询时与数据库一直保持着连接,速度快并且只向前;
另一类是非连接式查询,这种查询是利用DataAdapter对象的
Fill()方法来填充一个DataSet或者DataTable,然后将填充后的DataSet
对象或者DataTable对象进行数据绑定。特点是:无须一直与数据库
保持着连接,缺点:速度上会比连接式查询稍慢。 在非连接式查询
中,有一种特殊情况,那就是有时仅仅需要查询结果集中的第1行第
1列的值,在这种情况下,利用Command对象的ExecuteScaler()方法
来执行查询。
通过上面的分析,我们就可以写一个针对SQL Server数据库的
通用访问类了,它提供4种操作:
1、对数据库进行增、删、改的操作,利用SqlCommand对象的
ExecuteNonQuery()方法来执行;
2、对数据库进行连接式查询操作,利用SqlCommand对象的
ExecuteReader()方法来执行(注意:在进行相关查询操作之后,必须关
闭SqlDataReader对象和SqlConnection对象)。
3、对数据库进行非连接式查询操作:
(a)查询返回多条记录的话,这种操作利用SqlDataAdapter对
象的Fill()方法来执行(注意:在调用 SqlDataAdapter 对象的 Fill()
方法时,如果关联的数据库连接对象没有打开,则SqlDataAdapter对
象会自动打开关联的连接对象,并在 Fill() 方法之后自动关闭这个连
接对象;如果在调用 Fill() 方法时数据库连接对象已经打开,那么在
Fill() 方法之后关联的数据库连接对象继续保持打开状态)。
(b)对于查询结果只有1行1列的情况,则可以利用SqlCommand
对象的ExecuteScaler()方法来执行。为了适用于各种情况,这个方法
的返回值的类型是Object类型,使用时需要做相应的类型转换。
以上操作数据库的方法用图表示如下:
数据库操作
增、删、改
查
调用Command对象的ExecuteNonQuery()方法来执
行。
返回值:操作对数据库所影响的行数。
连接式查询
非连接式查询
调用Command对象的ExecuteReader()方法来执行。
特点:速度快,只向前;在查询时一直与数据库
保持着连接;
返回值:一个SqlDataReader 对象
调用DataAdapter对象的Fill()方法来填充一
个DataSet或者DataTable.
特点:无须一直与数据库保持连接;
缺点:速度上比连接式查询稍慢。
有种特殊情况:当仅仅只需要获取结果集中
第1行第1列的值时,调用Command对象的
ExecuteScaler()方法来执行;
返回值:结果集中第1行第1列的值(是
Object类型,使用时需要类型转换)。
图1 操作数据库的方法归类图