(一)基础知识
  1. ADO.NET: .NET中用来向数据库提交执行SQL语句的一堆类
  2. 本机访问直接"Windows验证",但是一般项目中都是单独的数据库服务器,程序在另外一台电脑上连接SQLServer在项目中,一般不会启用sa账户,这个是最高权限账户,应该设置一个受限制的账户
(二)理解SqlDataReader
  • SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于一个指针(游标), 只能读取当前游标指向的行,一旦连接断开再不能读取.这样做的好处是无论查询结果有多少条,对程序占用的内存几乎没有影响.
  • SqlDataReader对于小数据量的数据来说带来的只有麻烦. ADO.NET中提供了数据集的机制,将数据结果填充到本地内存中,这样连接断开,服务器断开都不影响数据的读取.数据集的好处是降低数据库服务器压力,编程也简单(其实原理大致还是用reader读取所有数据,储存在list中)
(三)编写SqlHelper文件
  • SqlHelper的作用,主要作用: 读取配置文件的连接数据库字符串,实现一些和数据库的参数查询函数,传入参数一般是sql命令和parameter[]参数数组
  • SqlHelper的一些问题,对于0参数 DataTable datatable = SqlHelper .ExecuteDataTable(sql, new SqlParameter[0]);
  • 注意NULL和DBNULL的区别

一、连接字符串的写法

l  Data Source=; 指定服务器IP(计算机名)  服务器\实例名

l  Initial Catalog=;初始化分类,要连哪个数据库名

l  UserId=sa;Password=sa;用户名密码

l  Integrated Security=true; 使用Windows验证方法

l  另外一种写法(旧):"server=.;database=”数据库名字“;uid=sa;pwd=sa"

二、Ado.Net连接池

l  当第一次创建一个连接对象并调用Open()操作的时候,该连接对象会向数据库发出一个连接请求,并且进行连接。

l  当调用该对象的Close()方法时,并没有直下关闭连接对象,而是放入了“连接池”中,

l  当下次再创建一个连接对象的时候,如果该对象所使用的连接字符串与池中现有的连接对象使用的字符串一模一样(大小写空格等都必须一样),这时,并不会直下的再创建一个连接,而是使用池中现有的对象。

l  如果再次创建的连接对象所使用的连接字符串不一样,此时,则会创建一个新的连接。

l  只有当调用了连接对象的Close()方法后,当前连接才会放入到池中。

l  如果创建时和上一个连接对象一模一样,但上一个连接并没有Close()即:并没有放入池中,这时,也会创建一个连接。

三、ADO.Net中常用的几个对象

l  SqlConnection:数据库连接对象

l  Command:执行SQL语句命令

l  DataReader:只读、只进结果集

l  DataAdapter:适配器

l  DataSet:相当于内存中的临时数据库

SqlDataReader对象:

n  reader.HasRow=true表明有数据

n  reader.Read() 指向下一条     //读取前要先Read()

n  reader[0] 获取列的数据

n  reader[]有重载,有列索引也有列名,费钱要求使用列索引

n  reader.GetValue(索引);

n  reader.GetOrdinal(列名);根据列名获取列的索引

n  reader.GetInt32(索引); 直接获取强类型 (有一个Null的问题)

n  int? age =reader.IsDBNull(2)?null : (int?) reader.GetInt32(2);

使用时必需保证SqlConnection是打开的,不能中途关闭!

reader.GetInt32(索引)  索引和查询的顺序有关!

不要忘记使用using()释放,DataReader独享一个Connection

四、使用存储过程

  1. cmd.CommandType=CommandType.Procedure  //指定为存储过程
  2. pms[2].Direction = ParameterDirection.Output;   //参数的输出方向:输入参数、输出参数

(*)封装SqlHelper类

SqlHelper.cs是多年前微软出品的一个使用ADO.Net方法对SQL Server数据库进行操作的封装类。而我们自己手写的SqlHelper类同样是对数据库访问方法的一个封装类库,让我们在访问数据库的时候可以很方便地调用其中封装的方法,省略了很多重复劳动。在声明SqlHelper的时候,我们一般会声明为一个静态类,不使用静态类的话有可能产生一些未知的错误(苏老师说微软说的)。

这个类中我们常用的方法如下:

  1. ExecuteNonQuery(): 执行简单的无返回值的查询。
  2. ExecuteReader(): 使用DataReader读取数据。(注:少量数据的情况下使用 SqlDataReader的效率高于使用Dataset)
  3. ExecuteScalar(): 返回结果集中的第一行第一列,相当于返回单个值。
  4. ExcuteDataSet (): 返回Dataset的查询,相当于返回一个数组。

除此之外,我们根据需要以及兴趣也可以再增加一些其他的方法,对其进行修改以及扩展。

第一步、连接字符串

首先需要定义一个只读的连接字符串,连接字符串可以直接写死为一个固定的字符串,也可以从项目的配置文件中取得,一般使用后者:

private static readonly string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

这样的话windows应用程序的配置文件Web.config中可以配置连接字符串如下:

<configuration>

<connectionStrings>

<add name="connStr" connectionString="server=.;database=Exam;integrated security=true;"/>

</connectionStrings>

</configuration>

第二步、封装ExcuteNonQuery

首先先写一个完整的带CommandType参数的方法:

public static int ExcuteNonQuery(string sql, CommandType cmdType, params SqlParameter[] sps)

{

using (SqlConnection conn = new SqlConnection(connStr))

{

using (SqlCommand cmd = conn.CreateCommand())

{

if (sps != null)

{

cmd.Parameters.AddRange(sps);

}

cmd.CommandType = cmdType;

cmd.CommandText = sql;

try

{

conn.Open();

return cmd.ExecuteNonQuery();

}

catch (Exception ex)

{

conn.Close();

throw new Exception(ex.Message);

}

}

}

}

在这里,SqlConnection表示Sql Server数据库的一个打开的连接,SqlCommand表示Sql Server数据库执行的一个sql语句或者存储过程。然后再判断参数数组是否为空,不为空时,将参数数组加入到数据库执行命令中。最后打开连接,运行ExecuteNonQuery方法。当然,最好把最后2步try起来,捕获异常并抛出。

有了完整的ExecuteNonQuery方法,我们就可以调用它,通过指定CommandType为CommandType.Text,再封装一个执行Sql语句的重载:

public static int ExcuteNonQuery(string sql, params SqlParameter[] sps)

{

return ExcuteNonQuery(sql, CommandType.Text, sps);

}

第三步、封装ExecuteScalar

ExecuteScalar与ExcuteNonQuery的使用一模一样,只是返回值得类型为object而已,这里就不赘述了。

public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)

{

SqlConnection conn = new SqlConnection(connStr);

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

if (sps != null)

{

cmd.Parameters.AddRange(sps);

}

cmd.CommandType = cmdType;

try

{

conn.Open();

return cmd.ExecuteReader(CommandBehavior.CloseConnection);

}

catch (Exception ex)

{

conn.Close();

throw new Exception(ex.Message);

}

}

}

重载方法:

public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)

{

return ExceuteReader(sql, CommandType.Text, sps);

}

第四步、ExceuteReader

ExceuteReader方法中返回的是一个SqlDataReader类型的对象reader,使用者拿到这个reader,再通过

while(reader.read())

{

……

}

reader.close();

的方式从数据库中一条一条地读取数据,读完之后调用reader的close方法,在这之前,ExceuteReader中的数据库连接不能中断,否则数据库连接中断,用户就无法从数据库中拿到数据了,所以ExceuteReader方法中,数据库连接的创建不能用using包起来,并且执行命令的方法该这样写cmd.ExecuteReader(CommandBehavior.CloseConnection),CommandBehavior.CloseConnection表示在执行该命令时,如果关联的DataReader对象被关闭,那么关联的Connection对象也会被关闭,这样,当调用端调用reader.close()时,数据库连接将被关闭。

public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)

{

SqlConnection conn = new SqlConnection(connStr);

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

if (sps != null)

{

cmd.Parameters.AddRange(sps);

}

cmd.CommandType = cmdType;

try

{

conn.Open();

return cmd.ExecuteReader(CommandBehavior.CloseConnection);

}

catch (Exception ex)

{

conn.Close();

throw new Exception(ex.Message);

}

}

}

重载方法:

public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)

{

return ExceuteReader(sql, CommandType.Text, sps);

}

第五步、ExcuteDataSet

ExcuteDataSet用于返回一个DataSet(也可以返回DataTable, 两者区别不大)。先通过SqlDataAdapter的构造函数声明一个SqlDataAdapter对象da,再调用da的Fill方法,把查询到的表放到DataSet中,最后返回这个DataSet。

public static DataSet ExcuteDataSet(string sql, CommandType cmdType, params SqlParameter[] sps)

{

using (SqlConnection conn = new SqlConnection(connStr))

{

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

if (sps != null)

{

cmd.Parameters.AddRange(sps);

}

cmd.CommandType = cmdType;

using (SqlDataAdapter da = new SqlDataAdapter(cmd))

{

DataSet ds = new DataSet();

try

{

conn.Open();

da.Fill(ds);

return ds;

}

catch (Exception ex)

{

conn.Close();

throw new Exception(ex.Message);

}

}

}

}

}

上面定义da的这一大串

using (SqlConnection conn = new SqlConnection(connStr))

{

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

if (sps != null)

{

cmd.Parameters.AddRange(sps);

}

cmd.CommandType = cmdType;

using (SqlDataAdapter da = new SqlDataAdapter(cmd))

也可以通过SqlDataAdapter的构造方法

public SqlDataAdapter(string selectCommandText, string selectConnectionString) : this()来实现:

SqlDataAdapter da = new SqlDataAdapter(sql, connStr);

da.SelectCommand.CommandType = cmdType;

重载方法:

public static DataSet ExcuteDataSet(string sql, params SqlParameter[] sps)

{

return ExcuteDataSet(sql, CommandType.Text, sps);

}

      相关的WPF基础
  1. 定义类,定义属性
  2. new一个实例, 给要绑定的控件设定DataContext, txtName.Context = p1;txtAge.Context = p1;
  3. Xaml中要进行数据绑定的属性Text="{Binding Name}" , 几乎所有的控件属性都这样数据绑定的
  4. Text="{Binding Name}" ,把控件的Text属性当顶到DataContext指向的p1对象的Name属性上来
  5. 由于普通对象没有"通知我的属性变了"这么一种机制,所以改变对象的属性界面不会变. 但是界面改变是有TextChanged之类的事件的,所以界面可以同步到修改对象.
  6. 如果要求后台对象的值发生改变界面跟着变,则需要类实现INotifyPropertyChanged接口,并且在属性值变化后触发事件;(一般不需要)
  7. 父类控件的数据绑定后,子类控件数据绑定都绑定响应的数据对象
  8. class Person : INotifyPropertyChanged
        {
            private int age;
            public int Age
            {
                get
                {
                    return age;
                }
                set
                {
                    this.age = value ;
                    if (PropertyChanged != null )
                    {
                        PropertyChanged( this, new PropertyChangedEventArgs( "Age"));
                    }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
二、相关的数据绑定基础(ListBox和DataGrid)
(一)ListBox使用
     ListBox的使用
     绑定时候使用ItemSource
     显示用DisplayMemberPath="具体属性名字"
     SelectedValuePath  选出来的值对应的属性
     默认是吧每一项的对象的ToString(), DisplayMemberPath显示具体属性
一些代码展示:
List<Person > list = new List<Person >();
            Person p1 = new Person();
            p1.Name = "辉辉" ;
            p1.Age = 18;
            list.Add(p1);
           
            list.Add( new Person () { Name = "苏坤", Age = 16 });
            list.Add( new Person () { Name = "黎明", Age = 16 });
 
            //LsitBox绑定的是ItemSource属性
            lbPersons.ItemsSource = list;
 
private void btnShowLbItem_Click(object sender, RoutedEventArgs e)
        {
            //SelectedItem获得的是选中行对应的对象
            object selectedItem = lbPersons.SelectedItem;
 
            //SelectedValue获得是选中行对应对象的"SelectedValuePath"标志的属性值
            object selectedValue = lbPersons.SelectedValue;
 
            if (selectedValue != null )
            {
                MessageBox.Show(selectedValue.ToString());
            }
        }
 
(二)DataGrid使用
     默认Grid会自动生成列, 还会自动添加功能
     我们需要取消自动功能,使用的属性是AutoGenerateColumn="false"  CanUserAddRows="false"
     重要的是使用<DataGrid.Columns>  里面用专用的列属性 Header对应名字
     注意默认是非只读属性, IsReadOnly="true"  阻止用户修改数据
     DataGridTextBoxColumn  文本绑定
     DataGridCheckBoxColumn Header="列的名字" 直接绑定性别
     DataGridComberBoxColumn  x:Name="" (不能取名字的时候这样做)  这里使用选定项绑定
 
三、相关的SQL基础
下面是一些小摘要:
  1. *like一定要慎用,会导致全部检索,效率太低,如果需要,可以借鉴'全文检索'技术
  2. 有空可以去看看Lucene.Net
  3. 数据库中的NULL表示不知道  唯一比较  select * from T_Table where name is NULL   (name=NULL是不可以的)
  4. 数据库连接池:  ado.net会尽可能地服用连接池中的链接, 不断关闭和打开不太会影响时间

ADO.Net知识总结的更多相关文章

  1. ADO.NET知识的运用一(Day 26)

    哈哈,又到了总结的时间了,来回顾一下今天主要学了关于ADO.NET的哪些知识吧.(这次学的ADO访问数据库主要以访问SQL数据库为主) 理论:  首先我们要知道为什么要学习ADO.NET? 因为我们之 ...

  2. ADO.NET知识学习总结

      1. 概述 使用的命名空间: System.Data.SqlClient 连接字符串    服务器/数据库实例+数据库名称+安全信息+用户名+密码  可参考http://www.connectio ...

  3. ado.net知识整理

    对ado.net总是半知半解,五大对象也总是混淆,近期自己做小项目练手,整理了一些知识点 ado.net的无要素(摘自其他博文) Connection 物件    Connection 对象主要是开启 ...

  4. ADO.NET知识汇总

    这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...

  5. SQL数据库知识二(Day 25)

    又到了总结知识的时候了,今天主要把SQL数据库给简单的学完了,明天开始就要开始学ADO.NET的知识了.好了,话不多说,还是看一下今天都学了哪些内容. 1  字符串类型的知识点 --类型的使用 --截 ...

  6. SQL[连载3]sql的一些高级用法

    SQL[连载3]sql的一些高级用法 SQL 高级教程 SQL SELECT TOP SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP ...

  7. 手把手教你使用FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统(附源码)之开篇

    一 本系列随笔概览及产生的背景 近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座, ...

  8. SQL-W3School-总结:SQL 总结

    ylbtech-SQL-W3School-总结:SQL 总结 1.返回顶部 1. SQL 概要 本教程已经向您讲解了用来访问和处理数据库系统的标准计算机语言. 我们已经学习了如何使用 SQL 在数据库 ...

  9. 服务器端-W3Chool:服务器脚本教程

    ylbtech-服务器端-W3Chool:服务器脚本教程 1.返回顶部 1. 服务器脚本教程 从左侧的菜单选择你需要的教程! SQL SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您 ...

随机推荐

  1. Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例

    Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例 自动化测试和手工测试一样,是要有测试用例,有检查点和测试结果的,接下来我们通过RSp ...

  2. CentOS6.x安装配置nginx [转]

    博文来源:http://leyewen.blog.163.com/   nginx安装 nginx的官网:http://nginx.org/   相应下载页面:http://nginx.org/en/ ...

  3. 【CSS】Intermediate6:Display

    1display :inline/block/none 2.inline value Cause all list items in a list to appear next to each oth ...

  4. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  5. HIbernate学习笔记(一) 了解hibernate并搭建环境建立第一个hello world程序

    Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,Java程序员可以使用面向对象的编程思维来操纵数据库,它通过对象属性和数据库表字段之间的映射关系,将对象 ...

  6. HW4.37

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  7. HDOJ(~1004)

    T1000 #include <stdio.h> int main() { int a, b; while (scanf("%d %d", &a, &b ...

  8. Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library

    XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservic ...

  9. win7 下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化” -摘自网络

    1.自动放大窗口 鼠标把窗口拖到屏幕边缘时,win7会自做聪明的把窗口放大,有时候这个很烦人. 解决办法: 运行“REGEDIT”打开注册表,找到 “HKEY_CURRENT_USER\Control ...

  10. 学习微信小程序之css13关于盒子外边距的合并