文章目录

  • ADO.NET
    • 数据库连接示例
    • 构造连接字符串的其他方法 SqlConnectionStringBuilder/读取配置文件
    • Try...catch/Using
    • 连接池
    • 执行命令,增删改查
    • SqlParameter
    • DataReader 数据读取流
    • DataTable 临时表
    • DataSet
      • 应用
    • Relation
    • SqlDataAdapter 适配器
    • 数据库事务

ADO.NET

一种数据访问技术,应用程序可以连接到数据库,并以各种方式来操作其中的数据。

组成:

  1. DataSet 非连接的核心组件。独立于任何数据源的数据访问,多种不同的数据源。
  2. Data Provider(数据提供程序):用于连接数据库、执行命令、检索结果。
数据库连接示例
using System.Data.SqlClient;namespace AdoNetCourse
{ class Program{static void Main(){SqlConnection conn = new SqlConnection();//conn.ConnectionString = "server=.;database=TestBase;uid=sa;pwd='123456'";//初始化目录//conn.ConnectionString = "server=.;Initial Catalog=TestBase;uid=sa;pwd='123456'";//windows 身份验证                                              综合安全   SSPI/TRUE//conn.ConnectionString = "Data Source=.;Initial Catalog=TestBase;Integrated Security=SSPI";conn.ConnectionString = "Data Source=.;Initial Catalog=TestBase;Trusted_Connection=SSPI";//conn.Database;//要连接的数据库名称//conn.DataSource //数据源//conn.State//连接状态//conn.ConnectionTimeout//超时时间conn.Open();conn.Close();conn.Open();   //这里仍可重新执行打开conn.Dispose();//释放连接conn.Open();  //由于conStr被释放所以报错//Close关闭后还可以再打开//Dispose后,连接字符串也被清空,要重新设置连接字符串}}
}
构造连接字符串的其他方法 SqlConnectionStringBuilder/读取配置文件
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){SqlConnection conn = new SqlConnection();#region 方法1:SqlConnectionStringBuilder//SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();//builder.DataSource = ".";//builder.InitialCatalog = "DataBase";//builder.UserID = "sa";//builder.Password = "123456";//builder.Pooling = false;//禁用连接池//conn.ConnectionString = builder.ConnectionString;#endregion#region 方法2:读取配置文件//引用:System.Configuration//conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//conn.ConnectionString = ConfigurationManager.AppSettings["connStr"].ToString();#endregionconn.Open();conn.Close();}}
}
Try…catch/Using
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp3
{internal class Program{static void Main(string[] args){SqlConnection conn = null;//使用try catch 不终止程序try{string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;conn = new SqlConnection(connStr);conn.Open();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{conn.Close();}//using 对象自动释放//避免忘记对象被释放//using 使用的对象必须是继承IDisposable(提供一种用于释放非托管资源的机制)//string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//using (SqlConnection conn1 = new SqlConnection(connStr))//{//    conn1.Open();//}}}
}
连接池

原理:
为数据库连接建立一个“缓冲池”,预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避免了频繁的向数据库申请资源,释放资源带来的性能损耗。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 线程池
{internal class Program{static void Main(string[] args){#region 线程池默认打开 所以只打开了5个Stopwatch sw = new Stopwatch();sw.Start();string connStr = "server=.;database=TestBase;uid=ou;password=123456;Max Pool Size=5;";for (int i = 0; i < 100; i++){SqlConnection conn = new SqlConnection(connStr);conn.Open();//Console.WriteLine($"第{i + 1}个连接已打开");conn.Close();}sw.Stop();Console.WriteLine(sw.ElapsedMilliseconds);#endregion#region 不使用连接池耗时测试Stopwatch sw1 = new Stopwatch();sw1.Start();string connStr1 = "server=.;database=TestBase;uid=ou;password=123456;Max Pool Size=5;Pooling=false";for (int i = 0; i < 100; i++){SqlConnection conn1 = new SqlConnection(connStr1);conn1.Open();conn1.Close();}sw1.Stop();Console.WriteLine(sw1.ElapsedMilliseconds);#endregion#region 连接池类别区分测试string connStr2 = "server=.;database=TestBase;uid=ou;password=123456;Max Pool Size=5;";string connStr3 = "server=.;database=TestBase;uid=ou;password=123456; Max Pool Size=5;";string connStr4 = "server=.;database=TestBase;uid=ou;password=123456;Max Pool Size=5;";//下面会报错,2,4共用资源,3多了个空格for (int i = 0; i < 100; i++){SqlConnection conn2 = new SqlConnection(connStr2);conn2.Open();Console.WriteLine($"conn2第{i + 1}个连接已打开");SqlConnection conn3 = new SqlConnection(connStr3);conn3.Open();Console.WriteLine($"conn3第{i + 1}个连接已打开");SqlConnection conn4 = new SqlConnection(connStr4);conn4.Open();Console.WriteLine($"conn4第{i + 1}个连接已打开");}//可得,连接字符串区分不同的连接池Console.ReadKey();#endregion}}
}
执行命令,增删改查
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace SQL命令
{internal class Program{static void Main(string[] args){try{using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)){conn.Open();#region 创建命令的多种方法,一般用第四种//创建命令,执行命令的对象 执行命令//SqlCommand 对SQL数据库执行的一个T-SQL语句或存储过程//string cmdStr = "select* from UserInfo";//SqlCommand cmd = conn.CreateCommand();//cmd.Connection = conn;//cmd.CommandText = cmdStr;可忽略//cmd.CommandType = CommandType.Text;//#region 如果是存储过程  则必须设置cmd.CommandType = CommandType.StoredProcedure;//#endregion//SqlCommand cmd1 = new SqlCommand(cmdStr);//cmd1.Connection = conn;//SqlCommand cmd2 = new SqlCommand(cmdStr, conn);//SqlCommand cmd3 = conn.CreateCommand();//cmd3.CommandText = cmdStr;//SqlCommand cmd4 = new SqlCommand(cmdStr, conn, null);#endregion#region ----------------增删改-----------string uName = "jason";string uPwd = "1234";int age = 25;int deptId = 3;string cmdStr1 = "select* from UserInfos";//insert UserInfos(UserName,UserPwd,CreateTime,DeptId,Age) values('4444', '4444', GETDATE(), 4, 4)string cmdStr2 = "insert UserInfos(UserName,UserPwd,CreateTime,DeptId,Age) values(" + "'" + uName + "'" + ", " + "'" + uPwd + "'" + ", GETDATE()," + "'" + age + "'" + "," + "'" + deptId + "'" + ")";SqlCommand cmd5 = new SqlCommand(cmdStr2, conn, null);//执行SQL命令,并返回受影响的行数//Console.WriteLine(cmd5.ExecuteNonQuery());#endregion#region ----------------查询-------------object o = null;string cmdStr3 = "select * from UserInfos ";//返回一个表的数据行数string cmdStr4 = "select count(1) from UserInfos where age>10";//@@获得刚刚生成的标识列的值string cmdStr5 = "insert into DepInfos(DepName)values('快乐部');select @@identity";SqlCommand cmd6 = new SqlCommand(cmdStr5, conn, null);//执行SQL语句或存储过程,并返回查询结果中的第一格(第一行第一列)的值,忽略其他行列//适用于执行查询返回一个值// o = cmd6.ExecuteScalar();if(o != null){Console.WriteLine(o.ToString());}#endregion#region MyRegionstring cmdStr6 = "select UserId,UserName,Age from UserInfos";SqlCommand cmd7 = new SqlCommand(cmdStr6, conn, null);SqlDataReader dr = null;dr = cmd7.ExecuteReader();//数据要及时保存,读一条丢一条while(dr.Read()){int userId = int.Parse(dr["UserId"].ToString());string userName = dr["UserName"].ToString();int _age = int.Parse(dr["Age"].ToString());Console.WriteLine($"UserId:{ userId} UserName:{userName} Age:{_age}");}#endregionConsole.ReadKey();}}catch (Exception ex){Console.WriteLine(ex.Message);Console.ReadKey();}}}
}
SqlParameter

存储过程

--创建一个无参数的存储过程
create proc SearchUserInfo
as
beginselect UserId,UserName,Age From UserInfos
endexec SearchUserInfo--修改
alter proc SearchUserInfo
as
beginselect UserId,UserName,Age From UserInfosselect * From UserInfos
endexec SearchUserInfo--带参存储过程
alter proc AddUserInfo
@UserName nvarchar(50),
@userPwd varchar(50),
@Age int,
@DepId int
as
begin
--定义变量declare @time datetimeset @time = getdate()insert into UserInfos(UserName,UserPwd,CreateTime,Age,DeptId)values(@UserName,@userPwd,@time,@Age,@DepId)delete from UserInfos where UserId=1003select * from UserInfos
endexec AddUserInfo '2022' , '123' , 99 , 4
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace SQLparameter
{internal class Program{static void Main(string[] args){#region 参数的构造方法,不看也行//1.SqlParameter par1 = new SqlParameter();par1.ParameterName = "@userName";//参数名par1.SqlDbType = System.Data.SqlDbType.VarChar;//数据类型par1.Value = "admin";//参数值par1.Size = 20;//大小//2.参数名,值SqlParameter par2 = new SqlParameter("@Age", 24);//3.SqlParameter par3 = new SqlParameter("@DepId", System.Data.SqlDbType.Int);par3.Size = 4;par3.Value = 3;//4.参数名称 类型 大小 SqlParameter par4 = new SqlParameter("@UserPwd", System.Data.SqlDbType.VarChar, 50);par4.Value = "123456";//5.参数名称 类型 大小 源列名SqlParameter par5 = new SqlParameter("@UserName", System.Data.SqlDbType.VarChar, 20, "UName");par4.Value = "123456";SqlCommand command = new SqlCommand();#endregionusing (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)){conn.Open();#region 默认输入值 使用SqlParameter进行参数设置//string sql = "select Age from UserInfos where UserName = @userName";//SqlCommand cmd = new SqlCommand(sql, conn);cmd.Parameters.Add(new SqlParameter("@userName", "jason"));传入一个数组//SqlParameter[] paras =//{//    new SqlParameter("@userName", "jason")//};//cmd.Parameters.AddRange(paras);//object o = cmd.ExecuteScalar();//conn.Close();//Console.WriteLine(o.ToString());#endregion#region 输出值 使用SqlParameter进行参数接收,接收存储过程返回的值//创建存储过程                   存储过程名//SqlCommand cmd = new SqlCommand("GetDeptName", conn);//cmd.CommandType = System.Data.CommandType.StoredProcedure;//SqlParameter parId = new SqlParameter("@DepId", 3);//cmd.Parameters.Add(parId);//SqlParameter parName = new SqlParameter("@DepName", System.Data.SqlDbType.NVarChar, 50);//parName.Direction = System.Data.ParameterDirection.Output;//cmd.Parameters.Add(parName);//cmd.ExecuteScalar();执行后,接收到存储过程output 的值//Console.WriteLine(parName.Value.ToString());#endregion#region 既输入值也输出值//SqlCommand cmd = new SqlCommand("GetDeptNameNew", conn);//cmd.CommandType = System.Data.CommandType.StoredProcedure;//SqlParameter parName = new SqlParameter("@DepName", System.Data.SqlDbType.NVarChar, 50);1.传入值//parName.Value = "牌";//parName.Direction = System.Data.ParameterDirection.InputOutput;//cmd.Parameters.Add(parName);//cmd.ExecuteScalar();2.接收值,执行后,接收到存储过程output 的值//Console.WriteLine(parName.Value.ToString());#endregion#region 返回值 只可以返回int类型SqlCommand cmd = new SqlCommand("GetUserAge", conn);cmd.CommandType = System.Data.CommandType.StoredProcedure;//1.传入值SqlParameter[] paras ={new SqlParameter("@UserId", "3001"),//新定义一个变量接收返回值new SqlParameter("@reValue", System.Data.SqlDbType.Int,4),};paras[1].Direction = System.Data.ParameterDirection.ReturnValue;cmd.Parameters.AddRange(paras);cmd.ExecuteScalar();//2.接收值,执行后,接收到存储过程output 的值Console.WriteLine(paras[1].Value.ToString());#endregionConsole.ReadKey();}}}
}
DataReader 数据读取流

提供一种从数据库中读取行的方式。

单方向,单行读取,不能向后读取,不能修改数据。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _08_SqlDataReader_
{internal class Program{static void Main(string[] args){using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)){conn.Open();string sql = "select UserId,UserName,Age from UserInfos";SqlCommand cmd = new SqlCommand(sql, conn);//不能直接构造,只能通过cmd.---来创建   ↓关闭reader对象,自动关闭连接SqlDataReader dr =  cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);//DataTable dt = new DataTable();//dt.Load(dr);List<UserInfosModel> list = new List<UserInfosModel>();if (dr.HasRows){int indexId = dr.GetOrdinal("UserId");//获取指定列序号int indexName = dr.GetOrdinal("UserName");int indexAge = dr.GetOrdinal("Age");string idName = dr.GetName(0); //获取指定列名//检测是否有数据while (dr.Read()){//dr[0] 第一列 列序号读取//int userId = (int)dr[0];//string userName = dr["UserName"].ToString();//int userId = dr.GetInt32(indexId);//string userName = dr.GetString(indexName);//int age = dr.GetInt32(indexAge);UserInfosModel model = new UserInfosModel();model.UserId = dr.GetInt32(indexId);model.UserName = dr.GetString(indexName);model.Age = dr.GetByte(indexAge);list.Add(model);    }}dr.Close();}}}
}
DataTable 临时表

内存中的表

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _09_DataTable_
{internal class Program{static void Main(string[] args){//定义临时表存放数据//                           表名DataTable dt = new DataTable("UserInfo");//定义列List<DataColumn> listDc = new List<DataColumn>{new DataColumn("UserId",typeof(int)),new DataColumn("UserName",typeof(string)),new DataColumn("Age",typeof(byte)),};dt.Columns.AddRange(listDc.ToArray());//设置主键dt.PrimaryKey = new DataColumn[]{ dt.Columns[0]};//唯一约束dt.Constraints.Add(new UniqueConstraint(dt.Columns[1]));//行数据DataRow dataRow = dt.NewRow();dataRow[0] = 1;dataRow["UserName"] = "admin";dataRow["Age"] = 24;dt.Rows.Add(dataRow);//DataRowStatedt.AcceptChanges();//提交修改 UnChangeddataRow["Age"] = 27;//已修改 Modified dt.AcceptChanges();//提交修改 UnChanged//dataRow.Delete();//dt.AcceptChanges();//dt.RejectChanges();//回滚//dt.Clear();//清除数据//dt.Copy();//复制表//DataTable t2 = dt.Copy();//复制所有//DataTable t3 = dt.Clone();//复制列等结构,不复制数据//t3.Merge(t2);//合并并自动去重DataRow[] rows = dt.Select();DataRow[] rows1 = dt.Select("UserId>1","UserId desc");//RowState :Detached Added UnChanged Modified Deleted Detached}}
}
DataSet

数据在内存中的缓存,内存中的数据库
DataTable内存数据库中的表
DataSet由一组DataTabe 组成

应用
  1. DataAdapter 将数据填充到DataSet中
  2. DataAdapter 将DataSet中的更改提交到数据库
  3. XML文档或文本加载到DataSet中

不依赖于不同类型数据库,存在内存中

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _10_DataSet
{internal class Program{static void Main(string[] args){//默认名称 NewDataSet//创建数据库DataSet ds = new DataSet("ds1");//创建表DataTable dt = new DataTable();//向数据库添加表ds.Tables.Add(dt);//获取刚刚添加的表DataTable dt2 = ds.Tables[0];//ds.Relations.Add();//添加关系//ds.AcceptChanges();//提交//ds.RejectChanges();//回滚//ds.Clear();//ds.Copy();//ds.Clone();//不复制数据//ds.Merge();//合并//ds.Reset();//重置//ds.Load();//将数据源的值填充到DataSet里面Console.ReadKey();}}
}
Relation
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _11_Relation
{internal class Program{static void Main(string[] args){//关系://1. 一对一,一个表列数太多,拆分成两张表,以主键来联系//2. 一对多//3. 多对多 使用中间表来维护,权限分配DataSet ds = new DataSet("ds");DataTable[] dts ={new DataTable("User"),new DataTable("Dept")};ds.Tables.AddRange(dts);DataColumn[] dc ={new DataColumn("UserId",typeof(int)),new DataColumn("UserName",typeof(string)),new DataColumn("Age",typeof(int)),new DataColumn("DepId",typeof(int)),};DataColumn[] dc2 ={new DataColumn("DepId",typeof(int)),new DataColumn("DepName",typeof(string)),};ds.Tables[0].Columns.AddRange(dc);ds.Tables[1].Columns.AddRange(dc2);                  列数据数组类型 //dts[0].PrimaryKey = new DataColumn[] { dc[0] };//主键//dts[0].Constraints.Add(new UniqueConstraint("uc", dc2[1]));//唯一性约束//dts[0].Constraints.Add(new ForeignKeyConstraint("fk",dc2[0], dc[3]));//外键约束//自动为父表中的列建立唯一约束,子表中外键列建立外键约束DataRelation relation = new DataRelation("relation", ds.Tables[1].Columns[0], ds.Tables[0].Columns[3], true);//添加到ds.Relation中ds.Relations.Add(relation);InitData(ds.Tables[0], ds.Tables[1]);//通过父表读取子表数据foreach (DataRow dr in ds.Tables[1].Rows){DataRow[] rows = dr.GetChildRows(relation);foreach (DataRow row in rows){Console.WriteLine(row[0].ToString()+" "+row[1].ToString() + " "+row[2].ToString() + " "+row[3].ToString() + " ");}}foreach (DataRow dr in ds.Tables[0].Rows){DataRow[] rows = dr.GetParentRows(relation);foreach (DataRow row in rows){Console.WriteLine(row[0].ToString() + " " + row[1].ToString());}}Console.ReadKey();}static void InitData(DataTable dt1,DataTable dt2){DataRow dr2 = dt2.NewRow();dr2["DepId"] = 1;dr2["DepName"] = "人事部";dt2.Rows.Add(dr2);dr2 = dt2.NewRow();dr2["DepId"] = 2;dr2["DepName"] = "管理部";dt2.Rows.Add(dr2);dr2 = dt2.NewRow();dr2["DepId"] = 3;dr2["DepName"] = "销售部";dt2.Rows.Add(dr2);DataRow dr1 = dt1.NewRow();dr1["UserId"] = 1;dr1["UserName"] = "李明";dr1["Age"] = 22;dr1["DepId"] = 3;dt1.Rows.Add(dr1);dr1 = dt1.NewRow();dr1["UserId"] = 2;dr1["UserName"] = "刘丽";dr1["Age"] = 23;dr1["DepId"] = 1;dt1.Rows.Add(dr1);dr1 = dt1.NewRow();dr1["UserId"] = 2;dr1["UserName"] = "王力";dr1["Age"] = 23;dr1["DepId"] = 3;dt1.Rows.Add(dr1);}}
}
SqlDataAdapter 适配器

DataSet和SQLServer之间的桥接器

通过fill把数据从SQL里取出来加载到DataSet里面,然后通过update将修改后的数据提交到数据库

填充DataSet以及更新数据源的一组数据库命令和数据库连接。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _11_DataAdapter
{internal class Program{static void Main(string[] args){SqlConnection conn =  new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);string sql = "select * from UserInfos;select * from DepInfos";#region 创建方式#region 1.SqlDataAdapter adapter = new SqlDataAdapter();adapter.SelectCommand = new SqlCommand(sql, conn);#endregion#region 2.参数 查询语句和连接对象SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql, conn);#endregion#region 3.参数 查询语句和连接字符串SqlDataAdapter sqlDataAdapter2 = new SqlDataAdapter(sql, ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);#endregion#endregionDataSet ds = new DataSet();//映射,重命名表显示在查看器中sqlDataAdapter2.TableMappings.Add("Table","Users");sqlDataAdapter2.TableMappings.Add("Table1","Dept");//得到多个结果集,表名 Table Table1......sqlDataAdapter2.Fill(ds);// ds.Tables[0].Rows[2]["UserName"] = "oo123";//新增行DataRow dr = ds.Tables[0].NewRow();dr["UserName"] = "bb";dr["UserPwd"] = "44123";dr["Age"] = 23;dr["DeptId"] = 3;ds.Tables[0].Rows.Add(dr);//自动生成对应SQL命令//SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter2);//手动配置builderSqlCommand insertCmd = new SqlCommand("insert into UserInfos (UserName,UserPwd,Age,DeptId)values (@UserName,@UserPwd,@Age,@DeptId)",conn);SqlParameter[] parameters = {//                                                源列名 DataTable对应列的列名 new SqlParameter("@UserName",SqlDbType.NVarChar,50,"UserName"),new SqlParameter("@UserPwd",SqlDbType.VarChar,20,"UserPwd"),new SqlParameter("@Age",SqlDbType.TinyInt,4,"Age"),new SqlParameter("@DeptId",SqlDbType.Int,4,"DeptId"),};insertCmd.Parameters.Clear();insertCmd.Parameters.AddRange(parameters);sqlDataAdapter2.InsertCommand = insertCmd;//sqlDataAdapter2.Update(ds.Tables[0]);//增删改查命令配置同理sqlDataAdapter2.Update(ds);}}
}

不要求随意读取,不修改,数据量小–Reader

数据库事务

一致性提交,中途失败则会回滚

--事务,一致性提交 回滚create proc AddUserByTran
@UserName varchar(50),
@UserPwd varchar(50),
@Age int,
@DepName nvarchar(50)
as
begin
begin tran
begin try--插入部门信息insert into DepInfos(DepName)values(@DepName);declare @depId int select @depId=@@IDENTITY--插入用户信息insert into UserInfos(UserName,UserPwd,Age,DeptId)values(@UserName,@UserPwd,@Age,@depId)
commit tran--提交return 1
end trybegin catchrollback tran--回滚return 0
end catch
end
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _13_Transaction
{internal class Program{static void Main(string[] args){using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)){conn.Open();SqlCommand cmd =new SqlCommand("AddUserByTran",conn);cmd.CommandType = System.Data.CommandType.StoredProcedure;SqlParameter[] sp ={new SqlParameter("@UserName","Lily"),new SqlParameter("@UserPwd","12345"),new SqlParameter("@Age",32),new SqlParameter("@DepName","欧欧部"),new SqlParameter ("@reValue",System.Data.SqlDbType.Int,4)};sp[4].Direction = System.Data.ParameterDirection.ReturnValue;cmd.Parameters.AddRange(sp);cmd.ExecuteNonQuery();Console.WriteLine(sp[4].Value.ToString());Console.ReadKey(true);}}}
}

SQL 数据库学习04 ADB.NET相关推荐

  1. SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?

    什么是数据库? 为什么需要数据库? 是不是所有的软件都是用Sql Server? 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Exp ...

  2. 下面为初学者分享一下SQL 数据库学习资料

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  3. SQL数据库学习-简单查询

    SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来 ...

  4. SQL 数据库 学习 011 关系、一对一、一对多、多对多

    我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express 什么是关系 定义: 表和表之间的联系. 实现方式: 通过设置不同形式的外键 ...

  5. SQL 数据库 学习 017 查询-00 介绍 scott 例子库

    我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express 我们要查数据,总先得有数据要查吧,所以我们需要先找一个例子库.Orale软 ...

  6. SQL数据库学习之路(九)

    目录 数据库创建补充: 为数据库用户赋予权限 在数据库表中使用视图进行添加修改 数据库创建补充: 以文本格式显示自己创建的数据库表                                    ...

  7. SQL数据库学习之路(五)

    一.查询 1.为表起别名as. select *from ClassId as id  --选择ClassId 表,起别名为id(一般因为原来名字太长所以起短一点的别名) 2.查询全部列,指定列.为列 ...

  8. 【SQL数据库基础08】变量--系统变量:全局、会话、自定义变量

    文章目录 一.系统变量 1.查看所有系统变量 2.查看满足条件的部分系统变量 3.查看指定的系统变量的值 4.为某个系统变量赋值 1.1 全局变量 ①查看所有全局变量 ②查看满足条件的部分系统变量 ③ ...

  9. 【SQL数据库基础01】数据库和SQL概述

    文章目录 01 引入 1.1 数据库存储数据的特点 1.2 三个重要概念 1.2.1 DBMS 1.3 SQL的优点: 图例说明: 1.4 SQL语言四大类 1.4.1 数据查询语言DQL 1.4.1 ...

最新文章

  1. php中的mysql模块
  2. VMware Workstation安装64位操作系统遇到的小问题
  3. ESP8266擦除flash
  4. c盘扩展卷是灰色的_技术丨电脑C盘装太满?这几招轻松释放空间
  5. Angular4学习笔记(六)- Input和Output
  6. 文档安全管理系统服务器地址是什么,一种文档安全管理系统登录方法及装置
  7. 特朗普回应“蒂姆·苹果”事件:就是为节省时间
  8. CSS 实现行内和上下自适应的几种方法
  9. PhotoKit在线图片编辑器
  10. 网易邮箱出现 FA_INVALID_SESSION
  11. PROFINET实时以太网协议
  12. html meter做个C盘,HTML基础教程:meter标签详细讲解
  13. 用Swift搭建API Server,Vapor + PostgreSQL + Docker + ECS + OSS
  14. ASP.NET Web API入门介绍(一)
  15. java修复工具_jar包修复工具箱
  16. 【C#上位机(简单实现串口发送)】
  17. android实现屏幕截图,Android-屏幕截图功能实现
  18. Python 课课练 (七):字典与集合课后题
  19. 三菱FX1N 或2N 与台达VFD M变频器modbus RTU通讯程序 进行频率设定,频率读取,正反转启停,点动控制。
  20. ae批量修改字体_|AE多文字样式修改脚本(Dojo Text Updater)下载v1.0 官方版 - 欧普软件下载...

热门文章

  1. java判断一个字符串中有几个字母和数字
  2. 帆软填报-解决Error:很抱歉,导入EXCEL格子数超过限制
  3. 创始人醉心长生不老,电报群被骗子占有,币圈“蒂凡尼”Dfinity千疮百孔
  4. 内置函数LPAD和RPAD函数
  5. 2022电工(初级)考试题模拟考试题库及在线模拟考试
  6. 继红杉、诺亚撤资后,还呗解散线下业务
  7. 点赞、收藏必读文章--数据分析的多变量分析
  8. 这些图片都是AI画画画出来的,太强了
  9. 服务器硬盘故障原因,常见的服务器硬盘故障及维修
  10. 2 nagios 客户端软件安装及配置