sqlparameters
1.数据访问层
using的用法:
01.可以using System;导命名控空间
02.using 的语法结构
using(变量类型 变量名 =new 变量类型())
{
}
案例:
03.using的原理
为什么出了using所在的{},会自动回收对象。
原因是当我们将要出{},系统自动调用了Dispose()方法。
而在DISpose方法中是这么实现的
2.哪些对象才可以使用Using回收!如:SqlConnection Font 和File 也都可以使用using 因为他们实现了IDisposable接口
必须实现了IDisposable 接口的类型才可以使用using回收!
3.using回收的是托管还是非托管资源?
解析:什么是托管:所有的C#代码都是被CLR监管,
结论是using回收的是 非托管资源!
2.会实现参数化SQL
解析:username: ' or 1=1 -- pwd:sb
1.使用using释放资源
Using释放的是托管资源还是非托管资源?
解析:非托管,C#应用托管到.NET Framework.但是他可以释放非托管资源。
1.using用法:
01.有人问,什么样的的语句可以使用using管理??
官方人士解析:稀缺的资源,才需要using管理。接着有人问:what is less resource ?例如:Connection对象,IO流。
02.Dispose方法会自动调用Close()
要想让一个类型可以通过using管理,该类型或者父类必须实现了IDisposable接口。
using(SqlConnection con=new SqlConnection)
{
//本质上自动调用了Dispose方法
}
2.close()和dispose()区别?
解析:close()只是关闭连接,但是通道没有销毁,dispose()不仅把连接给关闭了,而且把通道也给销毁了。
2.会使用SqlParameter给SQL传递参数
1.又有人问,菜鸟写的程序,被SQL注入怎么办??
官方人士解析:
01.要想避免,就通过参数的方式,来书写SQL语句
02.通过存储过程,存储过程中使用参数
2.哪些年,童鞋们用过的@
解析:01.数据库中@@error:全局变量
@num:局部变量,程序员自己定义的变量
02.路径转义:@"D:\"
03.在SQL语句中进行参数化查询时,可以避免SQL注入
SqlParameter对象
在C#中获取存储过程的返回值
SqlParameter para=new SqlParameter("@myresult",SqlDBType.Int);
para.Dirction=ParameterDirction.Output;
para.Value;
3.会使用ADO.NET调用存储过程,包括SqlHelper类的使用
无参的存储过程
带输入参数的存储过程
带输入和输出参数的存储过程
4.con.CrateCommand()的用法
5.SQL语句中参数化模糊查询写法
解析:like '%'+@name+'%'

private void btnOK_Click(object sender, EventArgs e)
{
string str = "Data Source=.;initial catalog=MySchool;uid=sa;pwd=6375196"; SqlConnection con = new SqlConnection(str);
string sql = "select * from student where studentname like '%'+@name+'%'";
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.Add(new SqlParameter("@name", txtName.Text));
SqlDataAdapter da=new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds, "Info");
dataGridView1.DataSource = ds.Tables[0]; }

SQL注入

//登录按钮 用户名和密码不对也可以成功登录
//1.1获取到用户名和密码
string uname = txtName.Text;
string pwd = txtPwd.Text;
//1.2发送SQL指令,拼接SQL方式
string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";
string sql = "select count(1) from student where studentName='" + uname + "' and Loginpwd='" + pwd + "'";
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
int count = Convert.ToInt32(cmd.ExecuteScalar());
if (count > 0)
{
MessageBox.Show("成功登录!");
}
else
{
MessageBox.Show("失败!");
} //用户名输入 ' or 1=1 -- 密码输入 :随便输
//SQL Server 查询的语句是 select count(1) from student where studentName='' or 1=1 --' and Loginpwd='sb

为防止SQL注入

//1.1获取到用户名和密码
string uname = txtName.Text;
string pwd = txtPwd.Text;
//1.2发送SQL指令,拼接SQL方式
string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";
string sql = "select count(1) from student where studentName=@name and loginpwd=@pwd";
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = new SqlCommand(sql, con); con.Open();
SqlParameter p1 = new SqlParameter("@name", uname);
SqlParameter p2 = new SqlParameter("@pwd", pwd);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
try
{
int count = Convert.ToInt32(cmd.ExecuteScalar());
if (count > 0)
{
MessageBox.Show("成功登录!");
}
else
{
MessageBox.Show("失败!");
} }
catch (Exception)
{ // throw;
}

C#调用带输入参数的存储过程
数据库--->可编程性--->存储过程--->

//开始把Alter改成如下的create
create procedure usp_selectInfoOutput
@sex nvarchar(32),
@count int output
as
select * from Student where gender=@sex
select @count=count(1) from student
where gender=@sex
return 100

按性别加载数据
在Main窗体中写

//1.1 连接字符串
string str = "data source=.;initial catalog=MySchool;uid=sa;";
//1.2 创建连接对象 呵呵
SqlConnection con = new SqlConnection(str);
//创建SqlCommand 对象的第二种方式
//从Con出发
//1.3 从连接对象构建命令对象
SqlCommand cmd = con.CreateCommand();
//1.4 给命令对象需要执行的SQL语句赋值
cmd.CommandText = "usp_selectInfo";
//告诉SQL引擎我传递过来的是 存储过程的名称
//1.5 我们告诉SQL引擎 我通过网线送过去的字符串是 一个存储过程的名字啊
cmd.CommandType = CommandType.StoredProcedure;
//1.6 构建存储过程的输入参数,并且给参数赋值,
//参数的名称必须和定义存储过程的输入参数名称完成相同
SqlParameter para = new SqlParameter("@sex", "1");
//1.7 将参数和命令对象的参数集合绑定
cmd.Parameters.Add(para);
//1.8 打开数据库连接通道真正建立
con.Open();
//1.9 构建一个适配器 )卡车( 对象
SqlDataAdapter da = new SqlDataAdapter();
//1.10 将已经初始化好的cmd对象和da绑定
da.SelectCommand = cmd;
//1.11 构建内存中的数据集对象
DataSet ds = new DataSet();
//1.12 从DB 拎 数据到DataSet 中的一张表
da.Fill(ds, "StuInfo");
//1.13 将dgv的数据源指向表
dgvList.DataSource = ds.Tables["StuInfo"];
//1.14 连接关闭
con.Close();

同上

string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "usp_selectInfo";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter pare = new SqlParameter("@sex", "1");
cmd.Parameters.Add(pare);
con.Open();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "Info");
dgvList.DataSource = ds.Tables["Info"];
con.Close();

三: C#调用带输出和返回值的存储过程
在boy's number 的输出:5 在返回值:100 在 学生框中支持模糊查询 在dgvList控件输出查询的结果
数据库--->可编程性--->存储过程--->

create procedure usp_selectInfoOutput
@sex nvarchar(32),
@count int output
as
select * from Student where gender=@sex
select @count=count(1) from student
where gender=@sex
return 100

在<调用带输出和返回值的存储过程>窗体里写

//1.1 连接字符串
string str = "data source=.;initial catalog=MySchool;uid=sa;";
//1.2 创建连接对象 呵呵
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = con.CreateCommand(); cmd.CommandText = "usp_selectInfoOutput";
cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] paras =
{
new SqlParameter("@sex","1"),
//凭什么 C# @count 输出参数
new SqlParameter("@count",SqlDbType.Int),
new SqlParameter("@myreturn",SqlDbType.Int)
//返回值
}; //为参数指定方向
paras[1].Direction = ParameterDirection.Output;
paras[2].Direction = ParameterDirection.ReturnValue;
cmd.Parameters.AddRange(paras);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "StuInfo"); dataGridView1.DataSource = ds.Tables["StuInfo"];
//填充总人数
txtNum.Text = paras[1].Value.ToString();
txtReturn.Text = paras[2].Value.ToString();

四:模糊查询 在Select控件中写

string name = '%' + "hhe" + '%';
//1.1 连接字符串
string str = "data source=.;initial catalog=MySchool;uid=sa;";
//1.2 创建连接对象 呵呵
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = con.CreateCommand();
//1.3 SQL脚本 like后直接跟@name
//cmd.CommandText = "select * from student where studentname like @name";
//cmd.CommandType = CommandType.Text;
//SqlParameter para = new SqlParameter("@name", '%' + txtName.Text + '%');
//同下三行代码效果一样
cmd.CommandText = "select * from student where studentname like '%'+@name+'%'";
cmd.CommandType = CommandType.Text;
SqlParameter para = new SqlParameter("@name", txtName.Text); cmd.Parameters.Add(para); SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "StuInfo");
dataGridView1.DataSource = ds.Tables["StuInfo"];
sqlparameters的更多相关文章
- [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数
水平有限,欢迎指正.原文:http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlqu ...
- .NET 程序集单元测试工具 SmokeTest 应用指南
Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke Test的自动化,可借用虚拟机的snapshot机 ...
- LinqToDB 源码分析——生成与执行SQL语句
生成SQL语句的功能可以算是LinqToDB框架的最后一步.从上一章中我们可以知道处理完表达式树之后,相关生成SQL信息会被保存在一个叫SelectQuery类的实例.有了这个实例我们就可以生成对应的 ...
- LinqToDB 源码分析——处理表达式树
处理表达式树可以说是所有要实现Linq To SQL的重点,同时他也是难点.笔者看完作者在LinqToDB框架里面对于这一部分的设计之后,心里有一点不知所然.由于很多代码没有文字注解.所以笔者只能接合 ...
- 便于开发的Helper类
一.将config封装实体层: 例子config: <?xml version="1.0" encoding="utf-8" ?> <Sett ...
- 干货!表达式树解析"框架"(3)
最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 这应该是年前最后一篇了,接下来的时间就要陪陪老婆孩子了 关于表达 ...
- ORM小练习代码
DOG类 namespace RupengORM { public class Dog { public Dog() { } /// <summary> /// 显示提供无参构造函数 // ...
- 微软版的SqlHelper.cs类
一,微软SQLHelper.cs类 中文版: using System; using System.Data; using System.Xml; using System.Data.SqlClien ...
- SqlHelper类
using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...
随机推荐
- Vue 组件&组件之间的通信 父子组件的通信
在Vue的组件内也可以定义组件,这种关系成为父子组件的关系: 如果在一个Vue实例中定义了component-a,然后在component-a中定义了component-b,那他们的关系就是: Vue ...
- spring-mvc(基础)
一.MVC框架的概述 1.作用 ①支持直接一个方法对一请求 ② 支持数据的自动封装 ③ 自动支持上传组件 ④ 自动支持JSON的转成 2.配置流程图 3.基于xml的配置 ...
- Linux命令-cut篇
Cut 命令是常用的 Linux 命令,在这里总结一下平时常用的参数和用法,方便查证. 常用参数: -b:以字节为单位进行分割: -c:以字符为单位进行分割: -d:自定义分割符进行分割,默认为制表符 ...
- 算法(第四版)C# 习题题解——2.3
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...
- vue 父组件调用子组件内置方法
背景介绍:外派到泰康做项目.这个项目中有个选择组织的功能,是一个树桩结构的懒加载,于是我就element-ui的tree组件封装了一个公共的组件. 但是后来发现他们的公司组织结构不是都请求的同一个接口 ...
- 【HNOI 2018】转盘
Problem Description 一次小 \(G\) 和小 \(H\) 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1\) 至 \(n ...
- 2018.11.30开始学习shader
学习资料: 乐乐女神的<unity Shader入门精要>
- 微信小程序点击列表添加 去除属性
首先说一下场景:我所循环的数据是对象数组,设置了一个属性当作标记,通过这个标记的值判断是否给改元素添加样式 wxml: <view> <view wx:for="{{lis ...
- git命令合并分支代码
对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢? 合并步骤:1.进入要合并的分支(如开发分支合并到master,则进入master目录)git checkout maste ...
- jenkins构建成功,但war包没有发布到tomcat下
如题,jenkins构建成功,在jenkins的workspace中有生成的war包,但没有发布到tomcat的webapps目录. 构建日志 找了很多原因发现应该还是项目相对路径不对导致的,我的wa ...