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的更多相关文章

  1. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET

    译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...

  2. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  3. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  4. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  5. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  6. C#高级编程9-第12章 动态语言扩展

    C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...

  7. C#高级编程9-第8章 委托、lamdba表达式和事件

    委托.lamdba表达式和事件 1.引用方法 函数指针是一个指向内存位置的指针,不是类型安全的.无法判断实际指向.参数和返回类型也无从知晓..NET委托是类型安全的.定义了返回类型和参数类型,不仅包含 ...

  8. C#高级编程9-第13章 异步编程

    异步编程 1)异步编程的重要性 在C#5.0中提供了关键字:async和await 使用异步编程后台运行方法调用,程序的运行过程中就不会一直处于等待中.便于用户继续操作. 异步编程有3种模式:异步模式 ...

  9. C#高级编程9-第1章.NET体系结构

    C#与NET的关系 C#编写的所有代码必须使用.NET FrameWork运行 C#是一种语言,但它本身不是.NET的一部分 C#一些特性,.NET不支持,.NET一些特性,C#不支持 公共语言运行库 ...

随机推荐

  1. string 、char* 、 char []的转换

    1.string->char* (1)data string s = "goodbye"; const char* p=str.data(); (2)c_str() stri ...

  2. linux ( CentOS 7)下Tengine(nginx)的安装与配置

    TengineTengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.它的目的是打造一个高效.安全的Web平台. 使用root用户安装 ...

  3. php面试专题---21、MVC框架基本工作原理考察点

    php面试专题---21.MVC框架基本工作原理考察点 一.总结 一句话总结: 会的东西快速过,不要浪费时间,生命有限,都是一些很简单的东西. 1.mvc框架单一入口的 优势 是什么? 可以进行统一的 ...

  4. VS2015发布web服务

    一.IIS中 ①添加网站 二.VS2015 ①右键解决方案→发布: ②自定义,设置配置文件名称: ③ ④发布     三.IIS中浏览(图片的ip地址是自己,上面的ip是截图别人的,所以不一样)

  5. 牛客提高D4t3 清新题

    分析 树上从下往上线性基合并即可 并不需要启发式/xyx 代码 #include<iostream> #include<cstdio> #include<cstring& ...

  6. ubuntu更换源

    1.备份源 cd  /etc/apt/ sudo cp sources.list sources.list.bak 2.更换阿里源 sudo vim /etc/apt/sources.list   中 ...

  7. day25—JavaScript实现文件拖拽上传案例实践

    转行学开发,代码100天——2018-04-10 今天记录一个利用JavaScript实现文件拖拽上传到浏览器,后天将文件打开的小案例. 基本功能:1点击添加文件 2 文件拖拽添加 html: < ...

  8. poj1258Agri-Net(最小生成树)

    题目链接:http://poj.org/problem?id=1258 Description Farmer John has been elected mayor of his town! One ...

  9. MapReduce(1): Prepare input for Mappers

    According to Wikipedia MapReduce, there are two ways to illustrate MapReduce. One contains three ste ...

  10. Using Tensorflow SavedModel Format to Save and Do Predictions

    We are now trying to deploy our Deep Learning model onto Google Cloud. It is required to use Google ...