ADO.NET第一章:Connection对象
一、案例介绍
在开始学习之前,我们先来了解一下我们所要开发的程序——音像店管理程序。在本书中,我们将循序渐进地实现音像店中售卖电影信息的编辑和检索功能。考虑到需要保存音像店中售卖电影的信息,我们在SQL Server中先完成数据库和数据表的创建。
1.1、数据库设计
表1-1 FilmInfo电影信息表
字段名称 |
数据类型 |
长度 |
说明 |
|
ID |
int |
4 |
电影编号,主键,自动增长 |
|
Name |
varchar |
50 |
电影名称,非空 |
|
TypeName |
varchar |
50 |
电影类型名称 |
|
Actors |
varchar |
200 |
主要演员列表 |
|
Amount |
int |
4 |
库存数量,大于等于0 |
|
Price |
money |
8 |
价格,大于等于0 |
|
Desc |
varchar |
max |
说明 |
|
测试数据:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
霸王别姬 导演: 陈凯歌 编剧: 芦苇 / 李碧华 主演: 张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达 / 更多... 类型: 剧情 / 爱情 / 同性 制片国家/地区: 中国大陆 / 中国香港a 语言: 汉语普通话 上映日期: 1993-07-26(中国大陆) / 1993-01-01(中国香港) 片长: 171分钟 / 155分钟(美国剧场版) 又名: 再见,我的妾 / Farewell My Concubine 大话西游之大圣娶亲 导演: 刘镇伟 编剧: 刘镇伟 主演: 周星驰 / 吴孟达 / 朱茵 / 蔡少芬 / 蓝洁瑛 / 更多... 类型: 喜剧 / 爱情 / 奇幻 / 古装 制片国家/地区: 中国香港 / 中国大陆 语言: 粤语 / 汉语普通话 上映日期: 2014-10-24(中国大陆) / 2017-04-13(中国大陆重映) / 1995-02-04(中国香港) 片长: 95分钟 / 110分钟(重映版) 又名: 西游记完结篇仙履奇缘 / 齐天大圣西游记 / 大话东游之二 / A Chinese Odyssey Part Two - Cinderella 无间道 导演: 刘伟强 / 麦兆辉 编剧: 麦兆辉 / 庄文强 主演: 刘德华 / 梁朝伟 / 黄秋生 / 曾志伟 / 郑秀文 / 更多... 类型: 剧情 / 悬疑 / 犯罪 制片国家/地区: 中国香港 语言: 粤语 上映日期: 2003-09-05(中国大陆) / 2002-12-12(中国香港) 片长: 101分钟 / 97分钟(导演剪辑版) 又名: Infernal Affairs / Mou gaan dou 活着 导演: 张艺谋 编剧: 芦苇 / 余华 主演: 葛优 / 巩俐 / 姜武 / 牛犇 / 郭涛 / 更多... 类型: 剧情 / 家庭 / 历史 制片国家/地区: 中国大陆 / 中国香港 语言: 汉语普通话 上映日期: 1994-06-30(中国香港) / 1994-05-17(戛纳电影节) 片长: 132分钟 又名: 人生 / Lifetimes / To Live 我不是药神 导演: 文牧野 编剧: 韩家女 / 钟伟 / 文牧野 主演: 徐峥 / 王传君 / 周一围 / 谭卓 / 章宇 / 更多... 类型: 剧情 / 喜剧 制片国家/地区: 中国大陆 语言: 汉语普通话 / 英语 / 上海话 / 印地语 上映日期: 2018-07-05(中国大陆) / 2018-06-30(大规模点映) 片长: 117分钟 又名: 中国药神 / 印度药神 / 印度药商 / 生命之路 / Dying to Survive / Drug Dealer 大闹天宫 导演: 万籁鸣 / 唐澄 编剧: 李克弱 / 万籁鸣 主演: 邱岳峰 / 富润生 / 毕克 / 尚华 / 于鼎 / 更多... 类型: 动画 / 奇幻 制片国家/地区: 中国大陆 语言: 汉语普通话 上映日期: 1961(中国大陆) / 1964(中国大陆) / 1978(中国大陆) / 2004(中国大陆) 片长: 114分钟 又名: 大闹天宫 上下集 / The Monkey King / Havoc in Heaven / Uproar in Heaven 鬼子来了 导演: 姜文 编剧: 姜文 / 史建全 / 述平 / 尤凤伟 主演: 姜文 / 香川照之 / 袁丁 / 姜宏波 / 丛志军 / 更多... 类型: 剧情 / 喜剧 制片国家/地区: 中国大陆 语言: 汉语普通话 / 日语 / 唐山话 上映日期: 2000-05-12(戛纳电影节) / 2002-04-27(日本) 片长: 139分钟 / 162分钟(戛纳电影节) 又名: Devils on the Doorstep 大话西游之月光宝盒 导演: 刘镇伟 编剧: 刘镇伟 / 吴承恩 主演: 周星驰 / 吴孟达 / 罗家英 / 蓝洁瑛 / 莫文蔚 / 更多... 类型: 喜剧 / 爱情 / 奇幻 / 古装 制片国家/地区: 中国香港 / 中国大陆 语言: 粤语 / 汉语普通话 上映日期: 2014-10-24(中国大陆) / 1995-01-21(中国香港) 片长: 87分钟 又名: 西游记101回月光宝盒 / 齐天大圣东游记 / 大话东游之一 / A Chinese Odyssey Part One - Pandora's Box 茶馆 导演: 谢添 编剧: 老舍 主演: 于是之 / 郑榕 / 蓝天野 / 英若诚 / 黄宗洛 / 更多... 类型: 剧情 / 历史 制片国家/地区: 中国大陆 语言: 北京话 上映日期: 1982 片长: 118分钟 又名: The Teahouse 让子弹飞 导演: 姜文 编剧: 朱苏进 / 述平 / 姜文 / 郭俊立 / 危笑 / 李不空 / 马识途 主演: 姜文 / 葛优 / 周润发 / 刘嘉玲 / 陈坤 / 更多... 类型: 剧情 / 喜剧 / 动作 / 西部 制片国家/地区: 中国大陆 / 中国香港 语言: 汉语普通话 / 四川话 / 山西话 上映日期: 2010-12-16(中国大陆) 片长: 132分钟 又名: 让子弹飞一会儿 / 火烧云 / Let The Bullets Fly IMDb链接: tt1533117 1 霸王别姬 剧情 张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达 5 35.80 段小楼(张丰毅)与程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分。 段小楼在认为该成家立业之时迎娶了名妓菊仙(巩俐),致使程蝶衣认定菊仙是可耻的第三者,使段小楼做了叛徒,自此,三人围绕一出《霸王别姬》生出的爱恨情仇战开始随着时代风云的变迁不断升级,终酿成悲剧。 2 大话西游之大圣娶亲 喜剧 周星驰 / 吴孟达 / 朱茵 / 蔡少芬 / 蓝洁瑛 7 55.30 至尊宝(周星驰 饰)被月光宝盒带回到五百年前,遇见紫霞仙子(朱茵 饰),被对方打上烙印成为对方的人,并发觉自己已变成孙悟空。 紫霞与青霞(朱茵 饰)本是如来佛祖座前日月神灯的灯芯(白天是紫霞,晚上是青霞),二人虽然同一肉身却仇恨颇深,因此紫霞立下誓言,谁能拔出她手中的紫青宝剑,谁就是她的意中人。紫青宝剑被至尊宝于不经意间拔出,紫霞决定以身相许,却遭一心记挂白晶晶(莫文蔚 饰)的至尊宝拒绝。后牛魔王救下迷失在沙漠中的紫霞,并逼紫霞与他成婚,关键时刻,至尊宝现身。 3 无间道 悬疑 刘德华 / 梁朝伟 / 黄秋生 / 曾志伟 / 郑秀文 16 27.10 1991年,香港黑帮三合会会员刘健明(刘德华)听从老大韩琛(曾志伟)的吩咐,加入警察部队成为黑帮卧底,韩琛许诺刘健明会帮其在七年后晋升为见习督察。1992年,警察训练学校优秀学员陈永仁(梁朝伟)被上级要求深入到三合会做卧底,终极目标是成为韩琛身边的红人。2002年,两人都不负重望,也都身背重压,刘健明渐想成为一个真正的好人,陈永仁则盼着尽快回归警察身份。 重案组从陈永仁手中获悉一批毒品交易情报,锁紧目标人物韩琛,没料情报被刘健明泄出,双方行动均告失败。但此事将双方均有卧底的事实暴露,引发双方高层清除内鬼的决心。命运迥异又相似的刘健明和陈永仁开始在无间道的旅程中接受严峻考验。 4 活着 家庭 葛优 / 巩俐 / 姜武 / 牛犇 / 郭涛 1 98.90 根据余华同名小说改编。 富少福贵(葛优)嗜赌成性,妻子家珍(巩俐)屡劝无果后带着女儿凤霞离开了他,当夜,福贵输光所有家产气死父亲,被迫靠变卖母亲首饰租间破屋过活。一年后,家珍手拉凤霞怀抱刚出世的儿子有庆回到家中,福贵痛改前非,开始靠演皮影戏过起安份守己的日子。 但好景不常,内战时期,福贵被国民党抓去当劳工,一番辗转终回到家乡与一家人团圆后,凤霞因病变成哑巴,而在后来的大跃进运动和文化大革命中,他虽获某些小福,逆境却也一直与他如影相随。 5 我不是药神 喜剧 徐峥 / 王传君 / 周一围 / 谭卓 / 章宇 2 55.50 普通中年男子程勇(徐峥 饰)经营着一家保健品店,失意又失婚。不速之客吕受益(王传君 饰)的到来,让他开辟了一条去印度买药做“代购”的新事业,虽然困难重重,但他在这条“买药之路”上发现了商机,一发不可收拾地做起了治疗慢粒白血病的印度仿制药独家代理商。赚钱的同时,他也认识了几个病患及家属,为救女儿被迫做舞女的思慧(谭卓 饰)、说一口流利“神父腔”英语的刘牧师(杨新鸣 饰),以及脾气暴烈的“黄毛”(章宇 饰),几个人合伙做起了生意,利润倍增的同时也危机四伏。程勇昔日的小舅子曹警官(周一围 饰)奉命调查仿制药的源头,假药贩子张长林(王砚辉 饰)和瑞士正牌医药代表(李乃文 饰)也对其虎视眈眈,生意逐渐变成了一场关于救赎的拉锯战。 6 大闹天宫 动画 邱岳峰 / 富润生 / 毕克 / 尚华 / 于鼎 105 9.50 话说在东土傲来国有一座花果山,山上有一尊石猴吸收日精月华化身为一只神猴(邱岳峰 音),统领着山中的猴子猴孙。为求得一件称心的宝贝,神猴孙大圣潜入龙宫,强硬求来大禹治水时的定海神针如意金箍棒。东海龙王(毕克 音)心有不甘,于是上天将此事诉诸玉帝(富润生 音)。玉皇大帝命令太白金星(尚华 音)下界招安,许以爵位。不知有诈的孙大圣欣然前往,却发现只是负责养马的弼马温。得知受骗的猴王反下天庭,与天兵天将在花果山展开大战…… 本片根据古典名著《西游记》中的故事改编,前后历时4年创作,并荣获1962年捷克斯洛伐克卡罗维发利国际电影节短片特别奖、1978年英国伦敦国际电影节年度杰出电影奖、1982年厄瓜多尔第四届国际儿童电影节三等奖、第二届中国电影“百花奖”最佳美术片奖。 7 鬼子来了 剧情 姜文 / 香川照之 / 袁丁 / 姜宏波 / 丛志军 5 35.80 第二次世界大战期间,中国河北挂甲台村的农民马大三(姜文饰)在日本人的统治下过着平静的生活。一个晚上,游击队绑架了日军陆军士兵花屋小三郎(香川照之饰)和翻译董汉臣,把他们捆绑塞入麻袋放在马大三家里,并吩咐马好好看管,几天后的大年三十来带人。马大三和村民战战兢兢地看守两人,花屋小三郎和董汉臣数次发出求救信号,皆被村民化解。半年过去了,村民们担心事情暴露,却又不敢把花屋等放了。 马大三最终被董汉臣说动,把花屋和董送到了日军宪兵队驻地,以换取粮食。日军宪兵军官酒冢猪吉是花屋的同乡。他表面上对马等人客气,但背后指责花屋让皇军蒙耻并殴打了他。宪兵队整队去马的村子里和村民联欢送粮,酒到酣时却乍露杀机。 8 大话西游之月光宝盒 爱情 周星驰 / 吴孟达 / 罗家英 / 蓝洁瑛 / 莫文蔚 7 81.90 孙悟空(周星驰)护送唐三藏(罗家英)去西天取经路上,与牛魔王合谋欲杀害唐三藏,并偷走了月光宝盒,此举使观音萌生将其铲除心思,经唐三藏请求,孙悟空被判五百年后重新投胎做人赎其罪孽。 五百年后孙悟空化身强盗头头至尊宝。当遇见预谋吃唐僧肉的妖怪姐妹蜘蛛精春三十娘(蓝洁瑛)和白骨精白晶晶(莫文蔚)时,因为五百年前孙悟空曾与白晶晶有过一段恋情,至尊宝与她一见钟情,但因菩提老祖将二人妖怪身份相告,至尊宝仍带领众强盗开始与二妖展开周旋,过程中,白晶晶为救至尊宝打伤春三十娘,自己也中毒受伤,为了救白晶晶,至尊宝去找春三十娘,遭白晶晶误会,绝望自杀,至尊宝开始用月光宝盒以期使时光倒流。 9 茶馆 历史 于是之 / 郑榕 / 蓝天野 / 英若诚 / 黄宗洛 7 95.50 世纪之交,古老的中国正迎来前所未有的巨大变革。老态龙钟的大清王朝摇摇欲坠,六君子的鲜血无法阻止历史车轮的滚动,老北京城的上空风云变幻,波谲云诡。王利发(于是之 饰),北京城内裕泰茶馆的年轻掌柜。他谨记父亲的教诲,体面周全地迎送四方宾客。小小的茶馆内,三教九流各色人等穿梭于此:提笼架鸟哀叹时运的松二爷(黄宗洛 饰);慨叹国之将亡的刚毅满人常四爷(郑榕 饰);一心谋求实业救国的秦仲义(蓝天野 饰);丧尽天良买卖人口的刘麻子(英若诚 饰);打算娶老婆的庞太监(童超 饰)……你方唱罢我登场,小小茶馆之内演尽世间的沧桑与凄凉 10 让子弹飞 动作 朱苏进 / 述平 / 姜文 / 郭俊立 / 危笑 / 李不空 / 马识途 4 47.30 民国年间,花钱捐得县长的马邦德(葛优 饰)携妻(刘嘉玲 饰)及随从走马上任。途经南国某地,遭劫匪张麻子(姜文 饰)一伙伏击,随从尽死,只夫妻二人侥幸活命。马为保命,谎称自己是县长的汤 师爷。为汤师爷许下的财富所动,张麻子摇身一变化身县长,带着手下赶赴鹅城上任。有道是天高皇帝远,鹅城地处偏僻,一方霸主黄四郎(周润发 饰)只手遮天,全然不将这个新来的县长放在眼里。张麻子痛打了黄的武教头(姜武 饰),黄则设计害死张的义子小六(张默 饰)。原本只想赚钱的马邦德,怎么也想不到竟会被卷入这场土匪和恶霸的角力之中。鹅城上空愁云密布,血雨腥风在所难免
数据库与SQL:
SQL脚本:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
USE [master] GO /****** Object: Database [FilmDB] Script DatD: 04/07/2021 09:49:07 ******/ CREATE DATABASE [FilmDB] ON PRIMARY ( NAME = N'FilmDB', FILENAME = N'D:\FilmDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'FilmDB_log', FILENAME = N'D:\FilmDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO ALTER DATABASE [FilmDB] SET COMPATIBILITY_LEVEL = 100 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [FilmDB].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [FilmDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [FilmDB] SET ANSI_NULLS OFF GO ALTER DATABASE [FilmDB] SET ANSI_PADDING OFF GO ALTER DATABASE [FilmDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [FilmDB] SET ARITHABORT OFF GO ALTER DATABASE [FilmDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [FilmDB] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [FilmDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [FilmDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [FilmDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [FilmDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [FilmDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [FilmDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [FilmDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [FilmDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [FilmDB] SET DISABLE_BROKER GO ALTER DATABASE [FilmDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [FilmDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [FilmDB] SET TRUSTWORTHY OFF GO ALTER DATABASE [FilmDB] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [FilmDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [FilmDB] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [FilmDB] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [FilmDB] SET READ_WRITE GO ALTER DATABASE [FilmDB] SET RECOVERY FULL GO ALTER DATABASE [FilmDB] SET MULTI_USER GO ALTER DATABASE [FilmDB] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [FilmDB] SET DB_CHAINING OFF GO EXEC sys.sp_db_vardecimal_storage_format N'FilmDB', N'ON' GO USE [FilmDB] GO /****** Object: Table [dbo].[FilmInfo] Script DatD: 04/07/2021 09:49:08 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[FilmInfo]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NOT NULL, [TypeName] [varchar](50) NULL, [Actors] [varchar](200) NULL, [Amount] [int] NULL, [Price] [money] NULL, [Desc] [varchar](max) NULL, CONSTRAINT [PK_FilmInfo] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO INSERT INTO [FilmDB].[dbo].[FilmInfo] ([Name] ,[TypeName] ,[Actors] ,[Amount] ,[Price] ,[Desc]) VALUES ('霸王别姬','剧情','张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达',5,35.8,'段小楼(张丰毅)与程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分。 段小楼在认为该成家立业之时迎娶了名妓菊仙(巩俐),致使程蝶衣认定菊仙是可耻的第三者,使段小楼做了叛徒,自此,三人围绕一出《霸王别姬》生出的爱恨情仇战开始随着时代风云的变迁不断升级,终酿成悲剧。'), ('大话西游之大圣娶亲','喜剧','周星驰 / 吴孟达 / 朱茵 / 蔡少芬 / 蓝洁瑛',7,55.3,'至尊宝(周星驰 饰)被月光宝盒带回到五百年前,遇见紫霞仙子(朱茵 饰),被对方打上烙印成为对方的人,并发觉自己已变成孙悟空。 紫霞与青霞(朱茵 饰)本是如来佛祖座前日月神灯的灯芯(白天是紫霞,晚上是青霞),二人虽然同一肉身却仇恨颇深,因此紫霞立下誓言,谁能拔出她手中的紫青宝剑,谁就是她的意中人。紫青宝剑被至尊宝于不经意间拔出,紫霞决定以身相许,却遭一心记挂白晶晶(莫文蔚 饰)的至尊宝拒绝。后牛魔王救下迷失在沙漠中的紫霞,并逼紫霞与他成婚,关键时刻,至尊宝现身。'), ('无间道','悬疑','刘德华 / 梁朝伟 / 黄秋生 / 曾志伟 / 郑秀文',16,27.1,'1991年,香港黑帮三合会会员刘健明(刘德华)听从老大韩琛(曾志伟)的吩咐,加入警察部队成为黑帮卧底,韩琛许诺刘健明会帮其在七年后晋升为见习督察。1992年,警察训练学校优秀学员陈永仁(梁朝伟)被上级要求深入到三合会做卧底,终极目标是成为韩琛身边的红人。2002年,两人都不负重望,也都身背重压,刘健明渐想成为一个真正的好人,陈永仁则盼着尽快回归警察身份。 重案组从陈永仁手中获悉一批毒品交易情报,锁紧目标人物韩琛,没料情报被刘健明泄出,双方行动均告失败。但此事将双方均有卧底的事实暴露,引发双方高层清除内鬼的决心。命运迥异又相似的刘健明和陈永仁开始在无间道的旅程中接受严峻考验。'), ('活着','家庭','葛优 / 巩俐 / 姜武 / 牛犇 / 郭涛 ',1,98.9,'根据余华同名小说改编。 富少福贵(葛优)嗜赌成性,妻子家珍(巩俐)屡劝无果后带着女儿凤霞离开了他,当夜,福贵输光所有家产气死父亲,被迫靠变卖母亲首饰租间破屋过活。一年后,家珍手拉凤霞怀抱刚出世的儿子有庆回到家中,福贵痛改前非,开始靠演皮影戏过起安份守己的日子。 但好景不常,内战时期,福贵被国民党抓去当劳工,一番辗转终回到家乡与一家人团圆后,凤霞因病变成哑巴,而在后来的大跃进运动和文化大革命中,他虽获某些小福,逆境却也一直与他如影相随。'), ('我不是药神','喜剧','徐峥 / 王传君 / 周一围 / 谭卓 / 章宇',2,55.5,'普通中年男子程勇(徐峥 饰)经营着一家保健品店,失意又失婚。不速之客吕受益(王传君 饰)的到来,让他开辟了一条去印度买药做“代购”的新事业,虽然困难重重,但他在这条“买药之路”上发现了商机,一发不可收拾地做起了治疗慢粒白血病的印度仿制药独家代理商。赚钱的同时,他也认识了几个病患及家属,为救女儿被迫做舞女的思慧(谭卓 饰)、说一口流利“神父腔”英语的刘牧师(杨新鸣 饰),以及脾气暴烈的“黄毛”(章宇 饰),几个人合伙做起了生意,利润倍增的同时也危机四伏。程勇昔日的小舅子曹警官(周一围 饰)奉命调查仿制药的源头,假药贩子张长林(王砚辉 饰)和瑞士正牌医药代表(李乃文 饰)也对其虎视眈眈,生意逐渐变成了一场关于救赎的拉锯战。'), ('大闹天宫','动画','邱岳峰 / 富润生 / 毕克 / 尚华 / 于鼎',105,9.5,'话说在东土傲来国有一座花果山,山上有一尊石猴吸收日精月华化身为一只神猴(邱岳峰 音),统领着山中的猴子猴孙。为求得一件称心的宝贝,神猴孙大圣潜入龙宫,强硬求来大禹治水时的定海神针如意金箍棒。东海龙王(毕克 音)心有不甘,于是上天将此事诉诸玉帝(富润生 音)。玉皇大帝命令太白金星(尚华 音)下界招安,许以爵位。不知有诈的孙大圣欣然前往,却发现只是负责养马的弼马温。得知受骗的猴王反下天庭,与天兵天将在花果山展开大战…… 本片根据古典名著《西游记》中的故事改编,前后历时4年创作,并荣获1962年捷克斯洛伐克卡罗维发利国际电影节短片特别奖、1978年英国伦敦国际电影节年度杰出电影奖、1982年厄瓜多尔第四届国际儿童电影节三等奖、第二届中国电影“百花奖”最佳美术片奖。'), ('鬼子来了','剧情','姜文 / 香川照之 / 袁丁 / 姜宏波 / 丛志军',5,35.8,'第二次世界大战期间,中国河北挂甲台村的农民马大三(姜文饰)在日本人的统治下过着平静的生活。一个晚上,游击队绑架了日军陆军士兵花屋小三郎(香川照之饰)和翻译董汉臣,把他们捆绑塞入麻袋放在马大三家里,并吩咐马好好看管,几天后的大年三十来带人。马大三和村民战战兢兢地看守两人,花屋小三郎和董汉臣数次发出求救信号,皆被村民化解。半年过去了,村民们担心事情暴露,却又不敢把花屋等放了。 马大三最终被董汉臣说动,把花屋和董送到了日军宪兵队驻地,以换取粮食。日军宪兵军官酒冢猪吉是花屋的同乡。他表面上对马等人客气,但背后指责花屋让皇军蒙耻并殴打了他。宪兵队整队去马的村子里和村民联欢送粮,酒到酣时却乍露杀机。'), ('大话西游之月光宝盒','爱情','周星驰 / 吴孟达 / 罗家英 / 蓝洁瑛 / 莫文蔚',7,81.9,'孙悟空(周星驰)护送唐三藏(罗家英)去西天取经路上,与牛魔王合谋欲杀害唐三藏,并偷走了月光宝盒,此举使观音萌生将其铲除心思,经唐三藏请求,孙悟空被判五百年后重新投胎做人赎其罪孽。 五百年后孙悟空化身强盗头头至尊宝。当遇见预谋吃唐僧肉的妖怪姐妹蜘蛛精春三十娘(蓝洁瑛)和白骨精白晶晶(莫文蔚)时,因为五百年前孙悟空曾与白晶晶有过一段恋情,至尊宝与她一见钟情,但因菩提老祖将二人妖怪身份相告,至尊宝仍带领众强盗开始与二妖展开周旋,过程中,白晶晶为救至尊宝打伤春三十娘,自己也中毒受伤,为了救白晶晶,至尊宝去找春三十娘,遭白晶晶误会,绝望自杀,至尊宝开始用月光宝盒以期使时光倒流。'), ('茶馆','历史','于是之 / 郑榕 / 蓝天野 / 英若诚 / 黄宗洛 ',7,95.5,'世纪之交,古老的中国正迎来前所未有的巨大变革。老态龙钟的大清王朝摇摇欲坠,六君子的鲜血无法阻止历史车轮的滚动,老北京城的上空风云变幻,波谲云诡。王利发(于是之 饰),北京城内裕泰茶馆的年轻掌柜。他谨记父亲的教诲,体面周全地迎送四方宾客。小小的茶馆内,三教九流各色人等穿梭于此:提笼架鸟哀叹时运的松二爷(黄宗洛 饰);慨叹国之将亡的刚毅满人常四爷(郑榕 饰);一心谋求实业救国的秦仲义(蓝天野 饰);丧尽天良买卖人口的刘麻子(英若诚 饰);打算娶老婆的庞太监(童超 饰)……你方唱罢我登场,小小茶馆之内演尽世间的沧桑与凄凉'), ('让子弹飞','动作','朱苏进 / 述平 / 姜文 / 郭俊立 / 危笑 / 李不空 / 马识途',4,47.3,'民国年间,花钱捐得县长的马邦德(葛优 饰)携妻(刘嘉玲 饰)及随从走马上任。途经南国某地,遭劫匪张麻子(姜文 饰)一伙伏击,随从尽死,只夫妻二人侥幸活命。马为保命,谎称自己是县长的汤 师爷。为汤师爷许下的财富所动,张麻子摇身一变化身县长,带着手下赶赴鹅城上任。有道是天高皇帝远,鹅城地处偏僻,一方霸主黄四郎(周润发 饰)只手遮天,全然不将这个新来的县长放在眼里。张麻子痛打了黄的武教头(姜武 饰),黄则设计害死张的义子小六(张默 饰)。原本只想赚钱的马邦德,怎么也想不到竟会被卷入这场土匪和恶霸的角力之中。鹅城上空愁云密布,血雨腥风在所难免'); GO
1.2、业务说明
假设你是管理员,要对电影信息进行添加、编辑、删除和查询等操作,那么,我们在应用程序中应该如何管理或操作SQL Server数据库中的数据呢?在接下来的章节中将会陆续揭晓答案。
二、ADO.NET简介
ADO.NET是微软新一代.NET数据库访问架构,ADO是ActiveX Data Object ActiveX(数据对象)的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一套统一的操作方法,来实现对数据的管理,实现数据库应用程序的开发。如图1-1所示,ADO.NET作为应用程序和数据源之间实现沟通的一种技术而存在。
接下来,我们再简单了解ADO.NET的两个重要组成部分:.NET数据提供程序(.NET Data Provider)和数据集(DataSet),如图
1、.NET数据提供程序(.NET Data Provider)
.NET数据提供程序是一个类集,用于连接到数据源、执行命令和返回结果。也就是说,.NET数据提供程序主要是包含了对数据库进行操作的方法。在.NET数据提供程序中,包含了四大核心的对象:
l Connection对象:用于连接数据源。
l Command对象:对数据源执行命令。
l DataReader对象:从数据源读取数据。
l DataAdapter对象:从数据源获取数据填充到DataSet并更新。
对于这些对象的使用,我们在本章下一节详细讲解第一个Connection对象,其它对象先抛开不管。
2、数据集(DataSet)
数据集是从数据源中检索到的数据在内存中的缓存,提供了数据的脱机存储方式。本课程暂未涉及数据集的使用。
三、Connection对象
连接对象Connection的作用是建立与数据源的连接,在ADO.NET中,一切操作皆以连接为基础。所以,应用程序要实现对数据库中数据的管理,首先要建立与数据库的连接。就像我们打电话,首先得拨号,而拨通了对方就相当于建立了连接,然后才能通话。
图1-3 建立数据连接过程跟打电话类似
3.1.连接字符串
在应用程序中,无论连接的是何种数据源,我们先要知道对方在哪里,就像打电话前要知道对方的号码一样。连接对象需要通过一个字符串来表明数据源的位置,这个字符串被称为“连接字符串” 。以SQL Server数据库为例,下面是连接字符串常见的写法:
string conStr = "server=.;database=FilmDB;uid=sa;pwd=123456;";
回顾一下,SQL Server的登录方式主要有两种,Windows身份验证(不需要填用户名和密码)和SQL Server身份验证(需要填用户名和密码)。这里以SQL Server身份验证方式登录为例。在上面的代码中我们创建了一个连接本地服务器上名为FilmDB数据库的连接字符串,我们可以看到,连接字符串由被分号隔开的四个部分组成,分别的作用是:
l server:表示要连接到的数据库服务器的地址。.表示本机。如果要连接远程服务器,则需要指明远程服务器名称或IP地址。
l database:表示要连接到的数据库名称。这里我们连接的是前面创建的FilmDB这个数据库。
l uid:表示登录数据库服务器的登录用户名。这里的sa表示系统管理员账号。也可以写成user id=sa,效果是一样的。
l pwd:表示登录数据库服务器的密码。这里的密码是123456。也可以写成password=123456,效果是一样的。
3.2.连接数据库
建立与SQL Server数据库的连接,需要用SqlConnection类来完成。下面我们先在Visual Studio中使用代码来演示连接的建立过程,进而掌握SqlConnection类的用法。打开Visual Studio,创建控制台应用程序FilmManageSystem,如图1-4所示:
图1-4 创建项目
在项目中,输入代码,建立连接,如图1-5:
图1-5 建立连接
如果连接未出错,运行效果如图1-6所示:
图1-6 连接成功
下面我们来详细了解关键代码的含义:
(1) using System.Data.SqlClient:因为连接类SqlConnection所在的命名空间为System.Data.SqlClient,所以要先引入该命名空间;(注:这个命名空间非常重要,后面章节很多类都在这个命名空间中)
(2) SqlConnection conn = new SqlConnection(conStr):通过SqlConnection类来创建一个具体的连接实例,创建时需要指定连接字符串;
(3) conn.Open():调用连接对象的Open()方法打开连接。Open()方法类似于手机上的呼叫按钮,输入号码后要按下呼叫按钮才能够拨出。连接对象也是一样,设置了连接字符串后调用Open()方法才开始真正的和数据库建立连接;
(4) conn.Close():调用连接对象的Close()方法关闭连接。Close()方法类似于打完电话后要挂掉电话一样。当连接使用完后一定不要忘记了调用Close()方法来关闭连接,因为连接是非常“稀缺”的资源。
以上就是连接建立和使用的过程。
3.3. 总结
ADO.NET是实现应用程序和数据源交互的一座桥梁。在使用ADO.NET操作数据库的时候,连接是第一个要完成的工作,通过连接字符串和SqlConnection类来实现连接的建立。建立连接后,要用Open()方法打开连接,使用完连接后要记得用Close()方法关闭连接。
更新:
using System; using System.Collections.Generic; using System.Linq; using System.Text; //引入 using System.Data.SqlClient; namespace FilmSystem2 { class Program { static void Main(string[] args) { //连接字符串 String connStr = "server=.;database=FilmDB;uid=sa;pwd=sa"; //连接对象 SqlConnection conn = new SqlConnection(connStr); Console.Write("要更新的电影编号:"); int id = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("名称:"); String name = Console.ReadLine(); Console.WriteLine("类型:"); String typeName = Console.ReadLine(); Console.WriteLine("演员:"); String actors = Console.ReadLine(); Console.WriteLine("数量:"); int amount = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("价格:"); double price = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("描述:"); String desc = Console.ReadLine(); //将要执行的sql语句 String sql =String.Format(@"UPDATE [FilmInfo] SET [Name] = '{0}' ,[TypeName] = '{1}' ,[Actors] ='{1}' ,[Amount] = {3},[Price] = {4},[Desc] ='{5}' WHERE ID={6}",name,typeName,actors,amount,price,desc,id); //创建命令对象 SqlCommand cmd = new SqlCommand(sql, conn); //打开数据库 conn.Open(); //执行并返回影响行数 int result = cmd.ExecuteNonQuery(); if (result > 0) { Console.WriteLine("更新成功!"); } //关闭数据库 conn.Close(); } } }
添加
using System; using System.Collections.Generic; using System.Linq; using System.Text; //引入 using System.Data.SqlClient; namespace FilmSystem {class Program { static void Main(string[] args) { //连接关键字 String connStr = @"server=.;database=FilmDB;uid=sa;pwd=sa"; //创建连接对象 SqlConnection conn = new SqlConnection(connStr); Console.Write("名称:"); string name = Console.ReadLine(); Console.Write("类型:"); String typeName = Console.ReadLine(); Console.Write("演员:"); String actors = Console.ReadLine(); Console.Write("数量:"); int Amount =Convert.ToInt32(Console.ReadLine()); Console.Write("价格:"); double price = Convert.ToDouble(Console.ReadLine()); Console.Write("描述:"); String desc =Console.ReadLine(); //要执行的sql String sql = String.Format(@"INSERT INTO [FilmDB].[dbo].[FilmInfo]([Name],[TypeName],[Actors] ,[Amount],[Price] ,[Desc]) VALUES('{0}' ,'{1}' ,'{2}',{3} ,{4} ,'{5}')",name,typeName,actors,Amount,price,desc); //创建命令对象,指定要执行的sql与连接 SqlCommand cmd = new SqlCommand(sql, conn); //打开连接 conn.Open(); //执行并返回影响行数 int result = cmd.ExecuteNonQuery(); if (result > 0) { Console.WriteLine("添加成功"); } //关闭连接 conn.Close(); } } }
删除
using System; using System.Collections.Generic; using System.Linq; using System.Text; //引入 using System.Data.SqlClient; namespace FileSystem3 { class Program { static void Main(string[] args) { //连接字符串 String connStr = "server=.;database=FilmDB;uid=sa;pwd=sa"; //连接对象 SqlConnection conn = new SqlConnection(connStr); Console.Write("请输入要删除电影的编号:"); int id = Convert.ToInt32(Console.ReadLine()); //将要执行的sql String sql =String.Format(@"DELETE FROM [FilmDB].[dbo].[FilmInfo] WHERE ID={0}",id); //命令对象 SqlCommand cmd = new SqlCommand(sql, conn); //打开连接 conn.Open(); // 执行并返回影响行数 int result = cmd.ExecuteNonQuery(); if (result > 0) { Console.WriteLine("删除电影成功!"); } //关闭连接 conn.Close(); } } }
部门管理
1、创建部门数据库 DepDB
2、创建部门表 Dep(id 自动增长,name nvarchar(50) 不为空)
3、完成添加功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace DepSys { class Program { static void Main(string[] args) { String connStr = "server=.;database=DepDB;uid=sa;pwd=sa"; SqlConnection conn = new SqlConnection(connStr); Console.WriteLine("名称:"); String name = Console.ReadLine(); String sql = String.Format(@"INSERT INTO [DepDB].[dbo].[dep] ([name]) VALUES('{0}')", name); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int result = cmd.ExecuteNonQuery(); //执行,返回影响行数 if (result > 0) { Console.WriteLine("添加成功!"); } conn.Close(); } } }
4、完成更新功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace DepSys { class Program { static void Main(string[] args) { //insert(); update(); } private static void update() { Console.WriteLine("将更新的编号:"); String id = Console.ReadLine(); Console.WriteLine("名称:"); String name = Console.ReadLine(); String sql = String.Format(@"UPDATE [DepDB].[dbo].[dep] SET [name] = '{0}' WHERE id={1}", name,id); exeSql(sql); } private static void insert() { Console.WriteLine("名称:"); String name = Console.ReadLine(); String sql = String.Format(@"INSERT INTO [DepDB].[dbo].[dep] ([name]) VALUES('{0}')", name); exeSql(sql); } private static void exeSql(String sql) { String connStr = "server=.;database=DepDB;uid=sa;pwd=sa"; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int result = cmd.ExecuteNonQuery(); //执行,返回影响行数 if (result > 0) { Console.WriteLine("执行成功!"); } conn.Close(); } } }
5、完成删除功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace DepSys { class Program { static void Main(string[] args) { //insert(); //update(); delete(); } private static void delete() { Console.Write("请输入要删除的部门编号:"); String id = Console.ReadLine(); String sql = String.Format(@"DELETE FROM [DepDB].[dbo].[dep] WHERE id={0}",id); exeSql(sql); } private static void update() { Console.WriteLine("将更新的编号:"); String id = Console.ReadLine(); Console.WriteLine("名称:"); String name = Console.ReadLine(); String sql = String.Format(@"UPDATE [DepDB].[dbo].[dep] SET [name] = '{0}' WHERE id={1}", name,id); exeSql(sql); } private static void insert() { Console.WriteLine("名称:"); String name = Console.ReadLine(); String sql = String.Format(@"INSERT INTO [DepDB].[dbo].[dep] ([name]) VALUES('{0}')", name); exeSql(sql); } private static void exeSql(String sql) { String connStr = "server=.;database=DepDB;uid=sa;pwd=sa"; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int result = cmd.ExecuteNonQuery(); //执行,返回影响行数 if (result > 0) { Console.WriteLine("执行成功!"); } conn.Close(); } } }
课堂练习题,创建一个图书数据库BookDB,添加book表,字段如下
bh,int 自动增长,主键
sm,nvarchar(100) 书名 不为空
jg decimal(9,2) 价格 可空
完成,增加、修改、删除功能,尽量带菜单