ADO.NET是一组类库,让我们通过程序的方式访问数据库。SYSTEM.DATA这个类提供了统一的接口访问Oracle MSSQL Access。像SYSTEM.IO类操作文件一样。

**connection  连接准备环境。

获取连接字符串

连接的属性(字符串)=实现准备一个连接字符串(服务器\实例;数据库;用户名;密码)4个东西     数据源 数据库 用户名 密码

      可以con.ConnectionString,也可以直接将次字符串放在在构造函数里。因为构造函数就是为字段赋值的

      从配置文件中:

      获取连接字符串,1,建一个txt,2改后缀名udl3双击配置测试4改回来 打开txt就有了

      http://blog.csdn.net/chaoyuan899/article/details/8272021

        

连接打开 con.open   只能打开一次

连接关闭 con.close  可以关闭多次,关闭数据库,而不是关闭连接哦。

释放资源 con.dipose 数据库不在本机内存,是这种连接一种非托管资源,需要手动释放 用using把 connection括起来,非常占用数据资源。

数据库的关闭con.close为数据库的关闭,还以open再close,但是连接没有关闭。如果dispose一下,要重新连接才能操作。

 using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace condb
{
class Program
{
static void Main(string[] args)
{
string str = @"server=.\LK;database=master;uid=sa;pwd=123";
//也可以conn.ConnectionString = str;
SqlConnection conn=new SqlConnection(str);
conn.Open();
Console.WriteLine("打开master数据库了");
conn.Close();
conn.Dispose();
Console.ReadKey();
}
}
}

Connection_01

 using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace condb
{
class Program
{
static void Main(string[] args)
{
//也可以conn.ConnectionString = str;
//@转义字符
// windows身份验证字符串1,server没有实例名2,用户名密码换成 intergrated security=true;
//连接字符串的获取1,建一个txt,2改后缀名udl3双击配置测试4改回来 打开txt就有了
string str = @"server=.\LK;database=master;uid=sa;pwd=123";
//using (){}代替了close和dispose 把连接放()内,{}内放其他操作
using(SqlConnection conn = new SqlConnection(str))
{
//判断打开关闭状态
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
Console.WriteLine("打开master数据库了");
}
//conn.Close();
//conn.Dispose();
Console.ReadKey();
}
}
}

Connection_02

**Command  执行 sql 增删改

增加删除修改ExecuteNonquery

读取单个 Executescalar

读取一行 ExecuteRead

string sql_txt=""

using( SqlCommand cmd=newSqlComand(sql_txt,con)){int res=cmd.excuteNonQuery()} 参数为sql语句和连接环境con。

ExecuteNonQuery()

返回受影响行数,和信息一样。增删改   select返回-1

ExecuteScalar()

  1,查

一行一列的值或者数据条目数

返回查询到的数据  不知道数据类型,可以用Object 接收。注意:只能显示查询到的结果的第一行第一列一个数据,而不是一行数据。常常用来查询select count(*) 检测行数,或者该字段是否已经存在。

 using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace condb
{
class Program
{
static void Main(string[] args)
{
//也可以conn.ConnectionString = str;
//@转义字符
// windows身份验证字符串1,server没有实例名2,用户名密码换成 intergrated security=true;
//连接字符串的获取1,建一个txt,2改后缀名udl3双击配置测试4改回来 打开txt就有了
string str = @"server=.\LK;database=lianxi;uid=sa;pwd=123";
//using (){}代替了close和dispose 把连接放()内,{}内放其他操作
using(SqlConnection conn = new SqlConnection(str))
{
//判断打开关闭状态
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
// string sq_txt = "insert into t_score values(3,'第三次')";
string sq_txt = "select scoreName from t_score ";
using( SqlCommand cmd=new SqlCommand(sq_txt,conn))
{
// int res=cmd.ExecuteNonQuery();
object res = cmd.ExecuteScalar();
Console.WriteLine(res);
} }
//conn.Close();
//conn.Dispose();
Console.ReadKey();
}
}
}

Command_01,

        

  2,增(插入)能插入会报错

当,为插入的时候,显示的只是受影响行数,此时用ExecuteScalar()并没有,为null。

         但是还是会插入到数据库。

inserted临时表

常用:若想插入的时候同时显示并返回(在数据库结果中)这条插入的的某个字段,常常用到这行的自动增长的id。

数据库有一个语句在vlaues前面output inserted.返回的字段。inserted临时表中output。

INSERT into t_score output inserted.scoreName values(6,'第六次')

        

set nocount on  插入查看等语句消息中显示多少行 给去掉,同时执行。就不会显示多少行受影响。解决了好多行“1行受影响”消息。。。

读取数据:1,查询一行数据或者整个数据库的数据

ExecuteReader()

返回一个SqlDataReader对象,这个对象并没有返回所有的数据,而是提供了访问所有数据的属性HasRows,Read

Reader.FieldCount。一行数据的字段数

读取数据excuteScalar()返回的是某个数据,大部分是返回一张行数据 =  sqldatareader对象[列名1 别名]    对象[列名2]

当然这个索引可以用列名,也可以用[0]  [1] [2]对一些没有列名的列也能查得到。

Reader.GetInt32(列序号)直接获取第几列的元素.。和Reader[]功能一样。循环一下,也可以实现全部读取。

SqlDataReader数据连接方式: 数据库游标/查询结果放在数据库服务器而非本机上 一旦连接断开将无法再读取/这样做的好处是无论读取多少条数据 对程序所占用内存几乎没有影响

这类方法类型一致必须:数据库为bit GetBoolen    为int  GetInt32 为varchar  GetString 必须一致 先判断null reader.IsDbNull

数据库的类型和c#中的类型 System.Data.DbType(枚举)像对应转化。string--nchar varchar 

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace condb
{
class Program
{
static void Main(string[] args)
{
string str = @"server=.\LK;database=lianxi;uid=sa;pwd=123";
string sq_txt = "select * from t_score ";
using(SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using( SqlCommand cmd=new SqlCommand(sq_txt,conn))
{
//SqlDataReader cmd对摸个数据库进行执ExecuteReader行命令的时候,返回一个sqldataReader对象。
//此对象对数据库进行判断bool(有HasRows和read()在数据库添加每行数据的指针),包含了一些非托管资源,需要dispose
//这个对象还有和[] 来读取每个列对应的列值。reader 就是仿佛是一个一行数据的集合,索引为read数据库的时候创建的。
SqlDataReader reader=cmd.ExecuteReader();
if (reader.HasRows)
{
//当这个对象进行读Read的时候,会在数据库缓存表加上一个指针,每Read一次,指针就会往下移动一个。
//前提已经确定了数据库和表,不需要担心Read的哪个个表哪个个数据库
if (reader.Read()) //若为循环全部显示 取代if判断,换为while循环,因为不知多少数据,不能用for
{
//返回object 类型。索引为数据库中的列名
Console.WriteLine( reader["scoreid"].ToString()+ " " +reader["scoreName"].ToString());
}
}
}
}
Console.ReadKey();
}
}
}

cmd.ExecuteReader

        结果

数据库 读取 备份 导出

 using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
namespace condb
{
class Program
{
static void Main(string[] args)
{
string str = @"server=.\LK;database=student;uid=sa;pwd=123";
string sq_txt = "select * from stu_infor ";
//考虑写进去的格式
using (FileStream file = new FileStream("wenjian.dat", FileMode.Create, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(file, Encoding.UTF8))
{
//List<string> list=new List<string>();
//开始读取
writer.WriteLine("{0}点开始读取 ", DateTime.Now);
using (SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sq_txt, conn))
{
//SqlDataReader cmd对摸个数据库进行执ExecuteReader行命令的时候,返回一个sqldataReader对象。
//此对象对数据库进行判断bool(有HasRows和read()在数据库添加每行数据的指针),包含了一些非托管资源,需要dispose
//这个对象还有和[] 来读取每个列对应的列值。reader 就是仿佛是一个一行数据的集合,索引为read数据库的时候创建的。
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
//当这个对象进行读Read的时候,会在数据库缓存表加上一个指针,每Read一次,指针就会往下移动一个。
//前提已经确定了数据库和表,不需要担心Read的哪个个表哪个个数据库
while (reader.Read())
{//返回object 类型。索引为数据库中的列名,也可以[0] [1] [2]
//对一行数据进行遍历,添加
//此时不适合用静态类File.Append方法,开一次关一次资源损坏大。需要准备一个流写在开始。
for (int i = ; i < reader.FieldCount - ; i++)
{
writer.Write("{0}|", reader[i]);
// list.Add(reader[i].ToString());
}
writer.WriteLine(reader[reader.FieldCount - ]);
}
}
}
}
}
}
Console.ReadKey();
}
}
}

数据库读取

用到list集合。

 using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
namespace DB_Read_Write_XML
{
class Program
{
static void Main(string[] args)
{
string str = @"server=.\LK;database=student;uid=sa;pwd=123";
string sq_txt = "select * from stu_infor ";
using (FileStream file = new FileStream("wenjian.dat", FileMode.Create, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(file, Encoding.UTF8))
{
writer.WriteLine("{0}点开始读取 ", DateTime.Now);
using (SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sq_txt, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
List<string> list = new List<string>();
for (int i = ; i < reader.FieldCount; i++)
{
list.Add(reader[i].ToString());
}
writer.WriteLine(string.Join("|", list.ToArray()));
}
}
}
}
}
}
Console.ReadKey();
}
}
}

数据库添加集合读取

读取为XML格式,我用序列化,出错,尚未解决。

 namespace DB_Read_Write_XML
{
[Serializable]
public class row
{
public int stu_id { get; set; }
public string name{ get; set; }
public int age { get; set; }
public string gender { get; set; }
public DateTime time { get; set; }
public int p_order { get; set; }
public int p_delete { get; set; }
}
class Program
{
static void Main(string[] args)
{
string str = @"server=.\LK;database=student;uid=sa;pwd=123";
string sq_txt = "select * from stu_infor ";
XmlSerializer serializer=new XmlSerializer(typeof(List<string>));
using (FileStream file = new FileStream("wenjian.xml", FileMode.Create, FileAccess.Write))
{
//using (StreamWriter writer =new StreamWriter(file,Encoding.Default))
//{
// writer.WriteLine("<ROOT>"); using (SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sq_txt, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
List<row> list = new List<row>(); while (reader.Read())
{
int i1= reader.GetInt32();
string st = reader.GetString();
int i2= reader.GetInt32();
string c1= reader.GetString();
DateTime d1= reader.GetDateTime();
int i3= reader.GetInt32();
int i4= reader.GetInt32();
row r = new row()
{
stu_id = i1,
name=st ,
age =i2,
gender =c1,
time =d1 ,
p_order=i3,
p_delete = i4
};
list.Add(r);
}
serializer.Serialize(file, list);
}
}
}
//}
}
Console.ReadKey();
}
}
}

错误代码,待解决

用Xdoc,Xele来解决.此时我犯了错误,已经标示出来

        

对应程序

 namespace DB_Read_Write_XML
{
internal class Program
{
private static void Main(string[] args)
{
string str = @"server=.\LK;database=student;uid=sa;pwd=123";
string sq_txt = "select * from stu_infor ";
XDocument xDoc = new XDocument();
XElement xroot = new XElement("root");
xDoc.Add(xroot); //xrow.Value = 18;
//using (FileStream file = new FileStream("wenjian.xml", FileMode.Create, FileAccess.Write))//有了xdoc创建,就不用流创建了
//{
using (SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sq_txt, conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)//read.HasRows永远成立。此时不能用while,会造成死循环,只需要判断一下往下执行就好
{
while (reader.Read())
{
XElement xrow = new XElement("row");
// xrow.Value = 18;是错误的错误 1 无法将类型“int”隐式转换为“string”
//可用参数来解决这个麻烦,节点名和直接赋值,后面这个参数是object类型
int stuid = reader.GetInt32();
XElement x1 = new XElement("id", stuid);
string xingbie = reader.GetString();
XElement x2 = new XElement("ming", xingbie);
int nianling = reader.GetInt32();
XElement x3 = new XElement("nling", nianling);
string xb = reader.GetString();
XElement x4 = new XElement("xingbie",xb);
DateTime tm = reader.GetDateTime();
XElement x5 = new XElement("shijian", tm);
int order = reader.GetInt32();
XElement x6 = new XElement("paixu", order);
int delete = reader.GetInt32();
XElement x7 = new XElement("schu", delete); xrow.Add(x1, x2, x3, x4, x5, x6, x7);
xroot.Add(xrow); }
}
}
}
}
xDoc.Save("1.xml");
}
}
}

结果:

        

.....

        

reader.HasRows是只判断这个表是否有数据,不会再判断。

而reader.read()一行一行的读,能读到数据就会返回true,读不到就返回faulse

注入漏洞攻击与参数化查询

注入漏洞,就是读者输入账号密码时,1‘or ’1=’1。作为c#的变量接受到数据库条件中。

select count(*) from biao where name='mianzi' and pwd='mima'

若mimi=1‘or ’1=’1

select count(*) from biao where name='mianzi' and pwd='1‘or ’1=’1',这句sql永远成立, and or是同一级别,先执行and两旁再or。

如果pwd=@pwd让密码当做数据库的一个变量,先执行这个变量。就不会出现问题。

select count(*) from biao where name='@name' and pwd='@pwd'

也就是讲c#的变量为数据库的@变量赋值就能解决了。

将c#变量赋值给数据库变量做为参数,需要SqlParameter类。专门处理sql命令中的参数(赋值给数据库变量)。

这个sqlparameter是cmd的一个属性。因为cmd有了con和sql语句,确定了连接和执行命令,所以对这条执行命令内的参数操作。这样记忆。

cmd.Parameters.add。

就像cmd.ExecuteNonQuery,cmd.ExecuteScalar一样也是cmd的一个元素。

internal class Program
{
private static void Main(string[] args)
{
string name = Console.ReadLine();
string mima = Console.ReadLine();
string str = @"server=.\LK;database=student;uid=sa;pwd=123";
string sq_txt = "select count(*) from stu_infor where name=@uid and age=@pwd";//这里@uid和@pwd不带单引号,本身就是变量
int res;
using (SqlConnection conn = new SqlConnection(str))
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sq_txt, conn))
{
SqlParameter sqname=new SqlParameter("@uid",SqlDbType.NVarChar);
sqname.Value = name;
SqlParameter sqmima=new SqlParameter("@pwd",SqlDbType.Int);
sqmima.Value = mima;
cmd.Parameters.Add(sqname);
cmd.Parameters.Add(sqmima);
res= Convert.ToInt32(cmd.ExecuteScalar());
}
if (res > )
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("用户名或者密码不对");
}
Console.ReadKey(); } }
}

        

DataReader 只读只进 结果集,一条一条读取数据

DataAdapter  一个封装上面3个对象的一个对象

DataSet:临时数据库。断开数据库就操作这个DateSet

select * from sys.objects 查看系统视图

用命令行

  一,登录:sqlcmd -S .\实例

1> sql语句

2>sql语句

  二,开启关闭某个实例的服务,

net start/stop mssql$实例名

连接服务器\实例;数据库;用户名;密码四个东西,身份验证(sql验证,windows验证)

System.Data.Common.DbConnectin 是Data.SqlClient.Sqlconnection 和Data.OdbcConnection 和Data.OleConnection的父类,工厂模式,可以用这个父类变量接受不同的数据库,Oracle:08右键添加引用,10的时候需要装一个第三方的插件dll

.net数据库连接防注入参数查询 命令执行 读取 备份 导出导入转化XML格式的更多相关文章

  1. 用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...

  2. 命令行,备份、导入数据库Oracle

    备份库:exp username/password@Database file="h:\datas.dmp" owner=username 导入语句 :imp username2/ ...

  3. WordPress <= 4.6 命令执行漏洞(PHPMailer)复现分析

    漏洞信息 WordPress 是一种使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站.也可以把 WordPress 当作一个内容管理系统(C ...

  4. php代码审计5审计命令执行漏洞

    命令执行漏洞:通过易受攻击的应用程序在主机操作系统上执行任意命令,用户提供的数据(表单,cookie,http头等)未过滤 挖掘思路:用户能够控制函数输入,存在可执行代码的危险函数 命令执行和代码执行 ...

  5. Imagetragick 命令执行漏洞(CVE-2016–3714)

    Imagetragick介绍: ImageMagick是一款使用量很广的图片处理程序,很多厂商都调用了这个程序进行图片处理,包括图片的伸缩.切割.水印.格式转换等等.但近来有研究者发现,当用户传入一个 ...

  6. 2020/1/28 PHP代码审计之命令执行漏洞

    0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...

  7. GreenPlum/postgres copy命令导出/导入数据

    一.COPY命令简单实用 1.copy在postgres与GreenPlum介绍 1.1 postgrespostgres的COPY命令可以快速的导出/导入数据到postgresql数据库中,支持常用 ...

  8. Oracle在dos命令下导出导入

    DOS下运行的命令,也可以加参数在SQL/PLUS环境下运行简单例子实现 单表备份(前提库的结构是一样的)导出:开始钮->运行->输入CMD->进入DOS界面EXP 用户名/密码@连 ...

  9. 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)

    3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...

随机推荐

  1. winform 子窗体刷新父窗体的数据

    建一个接口 比如 iMainForm接口内声明个方法 比如 Refresh()主窗体 实现这个接口 主窗体打开子窗体时这样写 子窗体.Owner = this;子窗体.ShowDialog(); -- ...

  2. opencart后台操作--第一节 多语言篇---中文语言包

    参考:http://www.cnblogs.com/404bozhu/p/5015108.html#3584448 OpenCart简体中文语言包 OpenCart V2.3.0.x 版权所有:www ...

  3. redux学习与使用

    Redux: 主要概念Action,reducer,store,state 原理:dispatch ({ type:action, preload: { val } } ) --->reduce ...

  4. C语言sscanf用法解析与正则表达式支持

    最近学习算法和输入输出用到的基本知识,首先是我自己写的一份代码参考和学习了很多资源 后面会给出参考资料,他们写得更加详细,正则表达式的支持确实是一大亮点所在 #include<iostream& ...

  5. sysbench 0.5 基准测试

    sysbench 介绍 SysBench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.它主要包括以下几种方式的测试: cpu性能 磁盘io性能 调度程 ...

  6. OpenFileDialog 打开快捷方式时,返回的是快捷方式引用的路径,而不是快捷方式(.lnk)自身的路径

    OpenFileDialog 打开 .lnk 文件. OpenFileDialog 有个DereferenceLinks 属性:获取或设置一个值,该值指示文件对话框是返回快捷方式引用的文件的位置,还是 ...

  7. 微信JS-SDK官方示例程序

    示例地址:http://203.195.235.76/jssdk/ /* * 注意: * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能 ...

  8. view的setTag() 和 getTag()应用 ViewHolder

    转自 http://www.cnblogs.com/qingblog/archive/2012/07/03/2575140.html View中的setTag(Onbect)表示给View添加一个格外 ...

  9. 1033 To Fill or Not to Fill (25 分)

    1033 To Fill or Not to Fill (25 分) With highways available, driving a car from Hangzhou to any other ...

  10. more 可翻页查看(一页一页翻动)

    命令解释 我们查看数据的时候,使用前面提到的nl与cat.tac等等,都是将文件内容一次性输出到屏幕上,看起来不是很方便,那我们就可以使用这个命令,一页一页查看,前面的数据不至于看不到. 命令说明 [ ...