C#高级编程(32章)ADO.net
32.2高效地使用连接
sqlConnection类是针对sql的,而OleDbConnection 是针对其他比如access的,另外还有odbcConnection是针对odbc的,sql的访问优势就在于它可以调用高性能的sql控制访问语句!
32.2.3 事务
如使用Transactions类须引用下面文件(在不支持务事的数据库时,可以用以下操作)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Transactions.dll
string source = "server=(local);integrated security=SSPI;database=Northwind";//如果是SqlExpress则使用./sqlexpress,Northwind表示数据库名称
try
{
using (var scope = new TransactionScope(TransactionScopeOption.Required))//如果有环境事务,使用环境,不然新建事务,默认值,其它查看文档
{
using (SqlConnection conn = new SqlConnection(source))//托管释放所有资源
{
conn.Open();
conn.Close();//在后面有程序时,应尽早释放
scope.Complete();//如果没完成,因没有调用Complete方法!事务会回滚!
}
}
}
catch (SqlException e) //抛出SQL异常,是SqlException类
{
throw;//异常操作
}
32.3命令
以下代码中Conn为open后的connection类:操作方法有以下三种
string select = "SELECT ContactName FROM Customers";
SqlCommand cmd = new SqlCommand(select, conn); //执行select变量中的SQL命令
SqlCommand cmd = new SqlCommand("testpray", conn); //存储过程名称
cmd.CommandType = System.Data.CommandType.StoredProcedure;//指定解释命令字符串为存储过程
cmd.Parameters.AddWithValue("@prayname", "it");//参数@prayname为SQL存储过程的参数名,it为值
using (OleDbConnection conn = new OleDbConnection(source))//注意这里是OleDb
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("Categories", conn);
cmd.CommandType = System.Data.CommandType.TableDirect;//TableDirec命令只对OleDb有效
}
方法2中调用的SQL存储过程
create proc testpray
@prayname char(8)
as
declare @_id int
select @_id =COUNT(id)+1 from test
insert into test(id,name)values(@_id,@prayname)
return 1
--下面是测试显示
declare @str int
exec @str = testpray artre
select @str
32.3.1执行命令
方法 | 说明 |
ExecuteNonQuery() | 执行,不返回结果,返回影响的行数(int) |
ExecuteReader() | 执行,返回一个类型化的IDataReader (SqlDataReader) |
ExecuteScalar() | 执行,返回结果第一行的第一列的值 (object) |
ExecuteXmlReader() | 执行,返回一个XmlReader对象,可以遍历从数据库返回的XML片段(XmlReader) |
ExecuteXmlReader方法中适用于SQLClient
string select = "SELECT ContactName FROM Customers FOR XML AUTO";
//语句后面加入FOR XML AUTO 把FROM子句中的表构建一棵树,FOR XML RAW把结果集中的行映射到元素,其中的列映射到属性,FOR XML EXPLICIT指定要返回的XML树形状
SqlConnection conn =new SqlConnection(GetDatabaseConnection());
SqlCommand cmd = new SqlCommand(select, conn);
XmlReader xr = cmd.ExecuteXmlReader();//XML的操作方法
xr.Read();
string data;
do
{
data = xr.ReadOuterXml();
if (!string.IsNullOrEmpty(data))
Console.WriteLine(data);
} while (!string.IsNullOrEmpty(data));
conn.Close()
. 1调用存储过程(重复调用同一存储过程时)可以用以下方式
SqlCommand cmd = new SqlCommand("testpray", conn); //存储过程名称
cmd.CommandType = System.Data.CommandType.StoredProcedure;//指定解释命令字符串为存储过程
cmd.Parameters.Add(new SqlParameter("@prayname",System.Data.SqlDbType.Char,, "prayname"));//用参数名称、 SqlDbType、大小和源列名称初始化 SqlParameter 类的新实例。
cmd.UpdatedRowSource = System.Data.UpdateRowSource.None;//不返回参数(可以改为输出的转到一个表中)
cmd.Parameters["@prayname"].Value = "it2"; //修改
cmd.ExecuteNonQuery(); //执行
cmd.Parameters["@prayname"].Value = "open";
cmd.ExecuteNonQuery();
1,调过带参数输出的存储过程
cmd.Parameters.Add(new SqlParameter("@prayname", System.Data.SqlDbType.Char, , "prayname"));//用参数名称、 SqlDbType、大小和源列名称初始化 SqlParameter 类的新实例。
cmd.Parameters.Add(new SqlParameter("@outid", System.Data.SqlDbType.Int, , ParameterDirection.Output, false, , , "outid", DataRowVersion.Default, null));
cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;//输出参数到映射的行
cmd.Parameters["@prayname"].Value = "it2";
cmd.ExecuteNonQuery();
int newOutId =(int) cmd.Parameters["@outid"].Value; //取值
32.5异步数据访问(不懂呀!!放着先)
public async static Task<int> GetEmployeeCount()
{
using (SqlConnection conn = new SqlConnection(GetDatabaseConnection()))
{
SqlCommand cmd = new SqlCommand("WAITFOR DELAY '0:0:1';select count(*) from employees", conn);
conn.Open();
return await cmd.ExecuteScalarAsync().ContinueWith(t => Convert.ToInt32(t.Result)); //异步数据处理,先了解相关格式
}
}
32.6管理数据和关系:DataSet类
string select = "select ContactName,CompanyName from Customers";
using (SqlConnection conn = new SqlConnection(source))
{
SqlDataAdapter da = new SqlDataAdapter(select, conn);//注意这里不SqlDataAdapter,不须要conn.open()
DataSet ds = new DataSet(); //实例数据库
da.Fill(ds, "Customers1"); //适配数据库,适配的表名为Customers1
foreach (DataRow row in ds.Tables["Customers1"].Rows) //遍历
Console.WriteLine("'{0}' from {1}", row[], row[]);
}
2手工编织架构
/// <summary>
/// 在实例化DataSet后调用,以便格式化DataSet,这样就能对DataTable中的数据进行类型安全访问
/// </summary>
/// <param name="ds">实例</param>
public static void ManufactureProductDataTable(DataSet ds)
{
DataTable products = new DataTable("products");
products.Columns.Add(new DataColumn("productID", typeof(int)));
products.Columns.Add(new DataColumn("name", typeof(string)));
ds.Tables.Add(products);
}
32.6.3数据关系
设置主键
public static void manufactrireprimaryKey(DataTable dt)
{
DataColumn[] pk = new DataColumn[];
pk[] = dt.Columns["id"];
dt.PrimaryKey = pk;
}
42.1 ASP.NET MVC
路由机制 网络介绍链接
C#高级编程(32章)ADO.net的更多相关文章
- C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET
译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...
- C#高级编程9-第12章 动态语言扩展
C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...
- C#高级编程9-第8章 委托、lamdba表达式和事件
委托.lamdba表达式和事件 1.引用方法 函数指针是一个指向内存位置的指针,不是类型安全的.无法判断实际指向.参数和返回类型也无从知晓..NET委托是类型安全的.定义了返回类型和参数类型,不仅包含 ...
- C#高级编程9-第13章 异步编程
异步编程 1)异步编程的重要性 在C#5.0中提供了关键字:async和await 使用异步编程后台运行方法调用,程序的运行过程中就不会一直处于等待中.便于用户继续操作. 异步编程有3种模式:异步模式 ...
- C#高级编程9-第1章.NET体系结构
C#与NET的关系 C#编写的所有代码必须使用.NET FrameWork运行 C#是一种语言,但它本身不是.NET的一部分 C#一些特性,.NET不支持,.NET一些特性,C#不支持 公共语言运行库 ...
随机推荐
- Python_002(基础知识)
1.格式化输出 %s:字符串的占位符,可以放置任何内容(数字) 代码展示:%去除法 admin_input1 = input("请输入用户名:") pass_input = inp ...
- PHPExcel 之常用功能
PHPExcel基本操作: 定义EXCEL实体 即定义一个PHPEXCEL对象,并设置EXCEL对象内显示内容 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 字符串(一):char 数组
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...
- [CSP-S模拟测试]:天才绅士少女助手克里斯蒂娜(数学+树状数组)
题目描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响. 选取显像管的任意一个平面,一开始平面内有个$n$电子,初始速度分别为$v_i$,定义飘升系数为$$\sum \li ...
- [CSP-S模拟测试]:Dash Speed(线段树+并查集+LCA)
题目描述 比特山是比特镇的飙车圣地.在比特山上一共有$n$个广场,编号依次为$1$到$n$,这些广场之间通过$n−1$条双向车道直接或间接地连接在一起,形成了一棵树的结构. 因为每条车道的修建时间以及 ...
- 万能的gitignore文件模版
## .gitignore for Grails 1.2 and 1.3 # .gitignore for maven target/ *.releaseBackup # web applicatio ...
- centos7 安装gdal2.3.1
在直接源码安装gdal2.3时报错,大概意思是说没有安装SFCGAL. 1.centos更新cmake到3.5版本: wget https://cmake.org/files/v3.5/cmake-3 ...
- C#-概念-基础类库:基础类库
ylbtech-C#-概念-基础类库:基础类库 基础类库 (BCL) 是微软所提出的一组标准库可提供.NET Framework所有语言使用. 随着 Windows 以及 .NET Framework ...
- leetcode 148. 排序链表(c++)
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3->4示例 2: 输入: ...
- Python变量和字符串详解
Python变量和字符串详解 几个月前,我开始学习个人形象管理,从发型.妆容.服饰到仪表仪态,都开始做全新改造,在塑造个人风格时,最基础的是先了解自己属于哪种风格,然后找到参考对象去模仿,可以是自己欣 ...