原生的ado.net(访问sql server数据库)
本文介绍原生的ado.net(访问sql server数据库)
写在前面
数据库连接字符串
过时的写法 string str = "server=localhost;database=my_db;uid=sa;pwd=123";
主流的写法
sql验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123";
windows验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;integrated Security=true";
Data Source 表示数据源
Initial Catalog 表示数据库
连接池技术
ado.net默认采用连接池技术,当close了一个连接,会将连接对象放进程序池中,下次open,如果对象没有占用,会直接拿来用,当有其他并发用户同时操作时,会创建多个连接对象,这时拼的就是连接池容量了
你可以在连接字符串中添加 Pooling=false 禁用连接池技术
联接模型(不缓存数据,每次查询都要重新访问数据库)
Connection对象
此对象用来连接数据库
string str = "server=localhost;database=my_db;uid=sa;pwd=123";
using(SqlConnection con = new SqlConnection(str))
{
con.Open();
if(con.State == ConnectionState.Open)
{
Console.WriteLine("连接成功");
}
//con.Close(); 关闭实例,可以使用Open再次打开
//con.Dispose(); 销毁实例
}
ConnectionState还有如下几个属性
Broken 与数据源中断
Closed 连接处于关闭状态
Connecting 连接正在进行
Executing 表示sql命令正在运行
Fetching 正在检索数据
Open 连接处于打开状态
Command对象
使用流程
string str = "server=localhost;database=my_db;uid=sa;pwd=123";
using(SqlConnection con = new SqlConnection(str))
{
SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
cmd.Connection = con; // 设置连接对象
cmd.CommandText = "select count(*) from [dbo].[Product]";
cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型
// 执行sql
con.Open();
if(con.State == ConnectionState.Open)
{
var i = cmd.ExecuteScalar();
Console.WriteLine(i);
}
}
带参数sql语句的使用(防止sql注入攻击)
string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123";
using (SqlConnection con = new SqlConnection(str))
{
using(SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con; // 设置连接对象
cmd.CommandText = "select count(*) from [dbo].[ProductAddress] where productAdressID > @id";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Value = 3 }); // 添加参数
// 简写形式,不推荐,因为可以传递任意值 cmd.Parameters.AddWithValue("@id", 3);
// SqlParameter parmId = new SqlParameter("@id", 0); 这样写报错,不推荐
con.Open();
if (con.State == ConnectionState.Open)
{
var i = cmd.ExecuteScalar();
Console.WriteLine(i);
}
}
}
执行sql语句的方法
ExecuteScalar 执行的结果只有一行一列数据,如果执行的新增sql语句带有output参数,那么返回值是新增的id
insert into mytable output ...
ExecuteNonQuery 不需要返回结果,也就是完成增删改
ExecuteReader 执行的结果多行多列,完成查询操作
用法和上面有点区别,如下
using(var items = cmd.ExecuteReader())
{
if(items.HasRows)
{
while (items.Read())
{
// 每一行数据
for(var i = 0; i < items.FieldCount; i ++)
{
// 每一列数据
Console.Write(items[i]);
}
Console.WriteLine("");
}
}
}
执行存储过程
string str = "server=localhost;database=my_db;uid=sa;pwd=123";
using(SqlConnection con = new SqlConnection(str))
{
SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
cmd.Connection = con; // 设置连接对象
cmd.CommandText = "[dbo].[myTest]";
cmd.CommandType = CommandType.StoredProcedure; // 设置sql命令为存储过程
cmd.Parameters.Add("@p1", SqlDbType.Int); // 添加参数
cmd.Parameters["@p1"].Value = 3; // 设置参数值
// 执行sql
con.Open();
if(con.State == ConnectionState.Open)
{
var items = cmd.ExecuteReader();
while (items.Read())
{
// 每一行数据
for (var i = 0; i < items.FieldCount; i++)
{
// 每一列数据
Console.Write(items[i]);
}
Console.WriteLine("");
}
}
}
非联接模型(将数据缓存在DataSet中,这种方式针对于windows控件使用比较好)
DataAdapter对象
string str = "server=localhost;database=my_db;uid=sa;pwd=123";
using(SqlConnection con = new SqlConnection(str))
{
SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
cmd.Connection = con; // 设置连接对象
cmd.CommandText = "select * from [dbo].[Product]";
cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型
// 执行sql
con.Open();
if(con.State == ConnectionState.Open)
{
SqlDataAdapter sda = new SqlDataAdapter(); // 创建SqlDataAdapter对象
sda.SelectCommand = cmd; // 设置sql命令对象
/*
SelectCommand 发送查询语句,在调用Fill方法时触发
DeleteCommand 发送删除语句,在调用Updata方法时触发
InsertCommand 发送插入语句,在调用Updata方法时触发
UpdateCommand 发送更新语句,在调用Updata方法时触发
*/
DataSet ds = new DataSet(); // 创建一个DataSet对象,内存数据库
sda.Fill(ds, "myTable"); // 调用此法会自动执行SelectCommand,将查询的数据放到ds中,第二个参数是内存表名
var table = ds.Tables["myTable"]; // 获取表
sda.FillSchema(table, SchemaType.Mapped); // 将数据库表结构加载到内存表中
var t = ds.Tables["myTable"].Rows.Find(3); // 找出主键为3的行
t["ProductName"] = "护眼台灯"; // 修改数据
// 创建SqlCommandBuilder方便执行数据库更新操作,相当于在执行Insert,Update,Delete操作时,自动生成了sql脚本,
// 从而在调用Update方法是可以直接更新数据,方便快捷
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(table);
}
}
DataSet和DataTable的使用
创建一个DataSet数据库 DataSet ds = new DataSet("myDb");
创建一张表 DataTable dt = new DataTable("mytb");
创建列 DataColumn mydc1 = new DataColumn("id", typeof(int)); DataColumn mydc2 = new DataColumn("Name", typeof(string));
设置列的自动编号 mydc1.AutoIncrement = true; mydc1.AutoIncrementSeed = 1; mydc1.AutoIncrementStep = 1;
设置列非空 mydc2.AllowDBNull = false;
将列添加到表中 dt.Columns.Add(mydc1);
创建行 DataRow mydr = dt.NewRow(); mydr["Name"] = "叶家伟";
将行添加到表中 dt.Rows.Add(mydr);
将表添加到数据库中 ds.Tables.Add(dt);
ado.net代码封装
配置连接字符串
将连接字符串提取出来方便以后修改
在App.config配置文件中的configuration节点下添加如下代码
<connectionStrings>
<add name="mssqlserver" connectionString="Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"/>
</connectionStrings>
在程序中要获取这段xml配置,需要添加 System.Configuration 引用
封装代码
public static class HandleAdoNet
{
private static readonly string constr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;
public static int HandleExecuteNonQuery(string sqlstr, params SqlParameter[] param)
{
using(SqlConnection con = new SqlConnection(constr))
{
using(SqlCommand cmd = new SqlCommand(sqlstr, con))
{
if(param != null)
{
cmd.Parameters.AddRange(param);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
public static object HandleExcuteScalar(string sqlstr, params SqlParameter[] param)
{
using(SqlConnection con = new SqlConnection(constr))
{
using(SqlCommand cmd = new SqlCommand(sqlstr, con))
{
if(param != null)
{
cmd.Parameters.AddRange(param);
}
con.Open();
return cmd.ExecuteScalar();
}
}
}
public static SqlDataReader HandleExcuteReader(string sqlstr, params SqlParameter[] param)
{
SqlConnection con = new SqlConnection(constr); // 此链接对象需要在外界关闭
using(SqlCommand cmd = new SqlCommand(sqlstr, con))
{
if(param != null)
{
cmd.Parameters.AddRange(param);
}
con.Open();
try
{
return cmd.ExecuteReader(CommandBehavior.CloseConnection); // 表示此方法调用成功,自动关闭连接对象
}
catch
{
con.Close();
con.Dispose();
throw;
}
}
}
public static DataTable HandleSqlDataAdapter(string sqlstr, params SqlParameter[] param)
{
DataTable dt = new DataTable();
using (SqlDataAdapter sda = new SqlDataAdapter(sqlstr, constr))
{
if(param != null)
{
sda.SelectCommand.Parameters.AddRange(param);
}
sda.Fill(dt);
}
return dt;
}
}
原生的ado.net(访问sql server数据库)的更多相关文章
- .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...
- ADO.NET访问SQL Server调用存储过程带回参
1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...
- 使用ADO.NET对SQL Server数据库进行訪问
在上一篇博客中我们给大家简介了一下VB.NET语言的一些情况,至于理论知识的学习我们能够利用VB的知识体系为基础.再将面向对象程序设计语言的知识进行融合便可进行编程实战. 假设我们须要訪问一个企业关系 ...
- Python3.7.1学习(八) Python访问SQL Server数据库
一.pip install pymssql即可安装pymssql库 二.Python连接SQL Server数据库 实例代码如下: # -*- coding:utf-8 -*-"&q ...
- java 访问sql server数据库
控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是ja ...
- 多实例设置本地IP访问sql server 数据库
我们本地有时候有多个数据库版本(^_^..别说了都是泪),都是为了兼容不同版本的数据而安装的! 最近我们需要用IP来访问,就有了这一段折腾的历程. 上图片为我安装的三个不同的版本,一个为sql ser ...
- python 访问sql server数据库
访问数据库 cnxn = pyodbc.connect("Driver={SQL Server};Server=localhost;Database=用户名;uid=sa;pwd=密码&qu ...
- [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法
问题描述: 假设在数据库中存在以下两张数据表: User表,存放用户的基本信息,基本结构如下所示: 类型 说明 ID_User int 自动增长字段,用作该表的主键 UserName varcha ...
- 使用Dapper访问SQL Server数据库
对应Demo程序名:DapperDemo 准备工作:为项目安装Dapper类库 方法一:项目中添加:项目名右键:Manage NuGet Packages:搜索Dappe:点击安装 方法二:在NuGe ...
随机推荐
- HDFS数据流-剖析文件读取及写入
HDFS数据流-剖析文件读取及写入 文件读取 1. 客户端通过调用FileSystem对象的open方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例.2. Distrib ...
- tensorflow笔记:流程,概念和简单代码注释
tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...
- Spring Cloud Ribbon实现客户端负载均衡
1.构建microservice-consumer-movie-ribbon项目,在pom.xml中引入ribbon依赖 在引入Eureka依赖的时候,默认里面含有ribbon依赖 2.添加@Load ...
- 智课雅思词汇---十八、前缀peri是什么意思
智课雅思词汇---十八.前缀peri是什么意思 一.总结 一句话总结:前缀:peri- 表示“周围, 靠近” 词根:-peri- [词根含义]:试验,尝试 [词根来源]:英语experience, e ...
- WPF利用通过父控件属性来获得绑定数据源RelativeSource
WPF利用通过父控件属性来获得绑定数据源RelativeSource 有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系,如下是一段XAML代码,说明多层布局控件中 ...
- App Store下载Mac应用失败的解决办法
1. 更换DNS服务器 国内可以用alidns: 223.5.5.5 223.6.6.6 也可以用电信的: 114.114.114.114 国外的可以考虑Google 8.8.8.8 8.8.4.4 ...
- Django-03
知识预览 分页器(paginator) COOKIE 与 SESSION Django的用户认证 FORM 回到顶部 分页器(paginator) 分页器的使用 1 2 3 4 5 6 7 8 9 1 ...
- uva10910 背包
https://vjudge.net/problem/UVA-10910 给出N,T,P,表示N门考试考了T分,问有多少种不同的得分方案,已知每门课的得分不低于P. 令f[i][j]表示考了i门得了j ...
- 三张图较为好理解JavaScript的原型对象与原型链
最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...
- Github-jcjohnson/torch-rnn代码详解
Github-jcjohnson/torch-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2016-3- ...