ADO.NET基本操作(CRUD、Procedure、Transaction)
模型沿用上篇博客所提到的学生、教师、课程,以详细的代码进行演示。
增删改查
添加学生、教师、课程
using System.Data.SqlClient; namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); string insertStudent = "insert into 学生表(studentname,gender,birthday) values('张三','" + (int)Gender.Male + "','" + DateTime.Parse("1989-6-1") + "')";
SqlCommand cmd = new SqlCommand(insertStudent, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("添加学生成功"); string insertTeacher = "insert into 教师表(teachername,gender,birthday) values('教师1','" + (int)Gender.Female + "','" + DateTime.Parse("1974-8-1") + "')";
cmd = new SqlCommand(insertTeacher, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("添加教师成功"); string[] insertSubjects = new string[]
{
"insert into 课程表(subjectname) values('语文')",
"insert into 课程表(subjectname) values('数学')",
"insert into 课程表(subjectname) values('英语')",
}; for (int i = ; i < insertSubjects.Length; i++)
{
cmd = new SqlCommand(insertSubjects[i], conn);
cmd.ExecuteNonQuery();
} Console.WriteLine("添加课程成功");
}
}
} public enum Gender
{
Female, Male
}
}
修改学生、教师
using System.Data.SqlClient; namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); string modifyStudent = "update 学生表 set birthday='" + DateTime.Parse("1989-01-01") + "' where studentname = '张三'";
SqlCommand cmd = new SqlCommand(modifyStudent, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("修改学生成功"); string modifyTeacher = "update 教师表 set teachername = '教师' where teachername = '教师1'";
cmd = new SqlCommand(modifyTeacher, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("修改教师成功");
}
}
}
}
删除学生、教师
using System.Data.SqlClient; namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); string deleteStudent = "delete from 学生表 where studentname = '张三'";
SqlCommand cmd = new SqlCommand(deleteStudent, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("删除学生成功"); string deleteTeacher = "delete from 教师表 where teachername = '教师'";
cmd = new SqlCommand(deleteTeacher, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("删除教师成功");
}
}
}
}
添加教师授课信息
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); string teachername = "教师1", subjectname = "英语";
string insert = @"declare @teacherid int,@subjectid int
set @teacherid = (select teacherid from 教师表 where teachername = '" + teachername + "')"
+ "set @subjectid = (select subjectid from 课程表 where subjectname = '" + subjectname + "')"
+ "insert into 教师课程表(teacherid, subjectid)"
+ "values(@teacherid, @subjectid)";
SqlCommand cmd = new SqlCommand(insert, conn);
cmd.ExecuteNonQuery();
Console.WriteLine("添加教师课程成功");
}
}
} public enum Gender
{
Female, Male
}
}
可以看到,代码中应用了嵌入T-SQL的方式,实现了给教师1添加英语教课的信息。
如果想查看教师教哪些课程,可以使用如下代码:
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); string query = @"select b.teachername,c.subjectname from 教师课程表 a
inner join 教师表 b on a.teacherid = b.teacherid
inner join 课程表 c on a.subjectid = c.subjectid";
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds); if (ds != null && ds.Tables.Count > )
{
foreach (DataRow dr in ds.Tables[].Rows)
{
Console.WriteLine("{0}授课课程名:{1}",dr["teachername"],dr["subjectname"]);
}
}
}
}
}
}
添加学生选课信息
原理与添加教师授课信息一样,代码不再重复。不过这里稍微讲述一下原理。
ADO.NET执行的就是SQL,这个SQL可以是T-SQL,也可以是普通的SQL语句。添加教师授课信息执行的就是T-SQL。实际上,我们在实际开发当中,一般都会先在SQL Server
Management Studio开发工具中执行一下T-SQL,执行通过后再复制到ADO.NET程序中。
declare @studentid int,@subjectid int
set @studentid = (select studentid from 学生表 where studentname = '张三')
set @subjectid = (select subjectid from 课程表 where subjectname = '数学')
insert into 学生课程表(subjectid, studentid) values(@subjectid,@studentid)
存储过程
存储过程的优点至少有下面两点:
1、 安全性高
相比C#后台代码被反编译,甚至浏览器端完全暴露的JS代码来说,数据库存储过程代码在数据库中,不容易被SQL注入(除非本身存储过程代码写的有问题),安全性高。
2、 执行效率高
首先节约了网络传输的时间(传输的是存储过程名,而不是长长的SQL语句)。其次存储过程代码都是经过数据库预编译的,节约了数据库编译SQL代码的时间,直接执行存储过程。
示例:通过存储过程来添加课程信息
if exists (select * from sysobjects where name = 'add_subjects')
drop procedure add_subjects
go
create procedure add_subjects
@subjectname varchar(20),--输入参数
@flag int output --输出参数
as
begin
insert into 课程表(subjectname) values(@subjectname);
select @flag=@@ROWCOUNT --输出参数的值
return @flag--存储过程返回值
end
需要说明的是,这个存储过程add_subjects有两个参数,分别为输入参数subjectname、输出参数flag。最后存储过程还有一个return @flag,也就是存储过程本身有一个返回值。
然后在C#代码中调用这个存储过程:
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); SqlCommand cmd = new SqlCommand("add_subjects", conn); SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter() { ParameterName="@subjectname", Value="历史", Size=, Direction = ParameterDirection.Input },
new SqlParameter() { ParameterName="@flag", Size = , Direction = ParameterDirection.Output }
};
cmd.Parameters.AddRange(parameters);
cmd.CommandType = CommandType.StoredProcedure;
int effectRows = cmd.ExecuteNonQuery();
if (effectRows > )
Console.WriteLine("课程添加成功,输出参数结果:" + parameters[].Value);
}
}
}
}
Parameters[1].Value对应存储过程输出参数@flag的值,effectRows对应存储过程的返回值。
事务
如果在执行数据库SQL操作时,不能保证多条SQL语句要么一起执行,要么不一起执行,就会造成数据不一致的情况。典型的例子就是银行转账,A转账给B,如果A少了100元钱,但这时程序发生了错误,导致B并没有收到100元钱,显然这时候就需要一种机制保证这个转账的操作是一个整体。数据库提出了事务这一概念来解决这一问题。
示例:一次性添加多门课程以及教师的信息
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=school;uid=sa;pwd=123456;";
conn.Open(); using (SqlCommand cmd = new SqlCommand() { Connection = conn })
{
using (SqlTransaction trans = conn.BeginTransaction())
{
cmd.Transaction = trans;
try
{
string[] strs = new string[]
{
"insert into 课程表(subjectname) values('C#')",
"insert into 课程表(subjectname) values('.NET')",
"insert into 课程表(subjectname) values('ADO.NET')",
"insert into 教师表(teachername,gender,birthday) values('教师2','"+(int)Gender.Male+"','"+DateTime.Parse("1978-4-12")+"')",
};
foreach (string str in strs)
{
cmd.CommandText = str;
cmd.ExecuteNonQuery();
}
trans.Commit();
Console.WriteLine("事务执行成功");
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine("事务执行失败,错误信息:" + ex.Message);
}
}
}
}
}
}
public enum Gender { Female, Male }
}
ADO.NET基本操作(CRUD、Procedure、Transaction)的更多相关文章
- 【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD
[转载]ADO.NET与ROM的比较(1):ADO.NET实现CRUD 转自周公 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hiberna ...
- ASP.NET Web API 基本操作(CRUD)
上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创 ...
- ADO.NET 基本操作
概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库,类似于PHP中的PDO 使用 连接数据库 (Connection对象) 1. 连接字符串 基本语法:数据源(Data ...
- 数据库 DB MySQL 基本操作 CRUD 多表 MD
操作数据库 创建数据库:create 创建一个名称为mydb1的数据库 create database mydb1; 创建一个使用gbk字符集的mydb2数据库 create database myd ...
- WebApi初探之基本操作(CRUD)
public class ProductsController : ApiController { static List<Product> products = new List< ...
- ADO.NET与ORM的比较:NHibernate实现CRUD(转)
原文地址 http://blog.csdn.net/zhoufoxcn/article/details/5402511 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spr ...
- 【转载】ADO.NET与ORM的比较(2):NHibernate实现CRUD
[转载]ADO.NET与ORM的比较(2):NHibernate实现CRUD 转自周公 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibe ...
- Elasticsearch CRUD基本操作
前言 本次我们聊一聊Elasticsearch的基本操作CRUD,他跟我们常用的关系型数据库的操作又有什么不一样的地方呢?今天我们就来好好讲解一番. 说明 本次演示用的版本是7.11. 工具可以使用K ...
- ado.net与各种orm操作数据方式的比较
ADO.NET与ORM的比较(1):ADO.NET实现CRUD http://zhoufoxcn.blog.51cto.com/792419/283952 ADO.NET与ORM的比较(2):NHib ...
随机推荐
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode
0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...
- .NET 托管堆和垃圾回收
托管堆基础 简述:每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.....事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表 ...
- 【如何快速的开发一个完整的 iOS 直播 app】(美颜篇)
来源:袁峥Seemygo 链接:http://www.jianshu.com/p/4646894245ba 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播 ...
- ApplePay高调入华,教你在app里上线ApplePay
ApplePay在中国上线后,就有许多线上app前后脚加入了对其的接入支持,个人比较喜欢的ENJOY也抢在首批接入了ApplePay应用内支付.本文将分享作者的接入经验. ApplePay是苹果公 ...
- postgres数据库中的数据转换
postgres8.3以后,字段数据之间的默认转换取消了.如果需要进行数据变换的话,在postgres数据库中,我们可以用"::"来进行字段数据的类型转换.实际上"::& ...
- 工作流_JBPM之Helloword
环境:Eclipse 3.5 + java 6 + MySQL 5.5 + jBPM 4.4 1.建立 Java Project: 2.拷贝 XML配置文件放进工程目录: 3. 建立 JPDL ...
- 【Android 界面效果39】android:inputType问题
1. 在XML代码中实现比较简单, 直接设置android:inputType="textMultiLine": [mw_shl_code=java,true]<EditT ...
- 【Android 界面效果37】ViewStub的应用
在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...
- 重构23-Introduce Parameter Object(参数对象)
有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , ...
- log4net保存到数据库系列三、代码中xml配置log4net
园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...