【ASP.NET开发】菜鸟时期的ADO.NET使用笔记

   2023-02-09 学习力0
核心提示:在这个系列的上一篇文章里,我写了一丁点有关服务器控件的使用笔记。其实当菜鸟们用.net开发久了就会发现,微软提供的服务器控件几乎是没有人使用的,因为大家都想深度定制自己需要的控件,这样在性能和需求上都能够得到满足,说白了也就是自己写控件。也有大

在这个系列的上一篇文章里,我写了一丁点有关服务器控件的使用笔记。

其实当菜鸟们用.net开发久了就会发现,微软提供的服务器控件几乎是没有人使用的,因为大家都想深度定制自己需要的控件,这样在性能和需求上都能够得到满足,说白了也就是自己写控件。

也有大牛对带有“控件”字眼的知识一律表示强烈的鄙视和不屑,他们提倡使用ASP.NET MVC,觉着这个才是王道。

我对.net了解只是皮毛,所以我说不出有关.net的“正确”的开发模式,呵呵,哥只是菜鸟。

转回正题,今天把自己使用ADO.NET的过程中积累的笔记分享给大家。

轻度科普:ADO.NET是用于在.NET中与数据库进行交互的一个模块,当你编写的.NET程序需要和数据库进行数据交换的时候,就需要用到ADO.NET。

ADO.NET的基本使用流程:

(1)建立指向数据库的连接。

(2)建立需要执行的SQL语句。

(3)打开连接执行SQL语句。

(4)关闭连接返回提示信息。

 

一、使用ADO.NET技术所需命名空间

System.Data

System.Data.SqlClient

 

二、使用SqlConnection对象连接数据库时所需的连接字符串

  身份验证模式:

  @"Server=服务器名;Database=数据库名;User ID=数据库用户名;Password=数据库密码;"

  信任模式:

  @"Server=服务器名;database=数据库名;Trusted_Connection=True;"

 

三、拼接连接字符串的方法

  (1)string.Format("Server={0};Database={1};User ID={2}....",Textbox1.Text....)

  [非常不安全,不能防止SQL注入攻击]

  解决方案:使用参数化SQL与存储过程提高安全性

  对于不同的数据供应器都有对应的Parameter来表示SQL语句或者存储过程中的各种参数。参数和数据库字段的真实类型一一对应,所有参数的值会仅仅被认为是一个参数,因此,在参数中写任何SQL语句都是没有意义的。

  eg:

SqlCommand cmd=new Sqlcommand("Select count(*) from tbClass where ClassName=@ClassName",conn)
cmd.Parameters.Add("@ClassName",SqlDbType.VarChar,50)
cmd.Parameters["@ClassName"].Value=tb_ClassName.Text;

  

SqlCommand cmd=new Sqlcommand("Select count(*) from tbClass where ClassName=@ClassName",conn)
cmd.Parameters.Add("@ClassName",SqlDbType.VarChar,50)
cmd.Parameters["@ClassName"].Value=tb_ClassName.Text;

 

 

 

  注意:

    SQL语句或者存储过程中指定的所有参数必须和Parameters属性中所有参数对应

    另外还有一个AddWithValue()方法可以同时为参数赋值:

    cmd.Parameters.AddWithValue("@ClassName",tb_ClassName.Text);

    这句话可以代替上面的两句话了,它会自动检测参数的类型和长度。

    SqlParameter对象有一个Direction方法,它用来指定存储过程参数的方向,它的值由ParameterDirection枚举来定义,共有4个:Input,InputOutput,Output,ReturnValue。   

  

  (2)使用ConnectionStringBuilder类。

  eg:

  SqlConnectionStringBuilder me=new SqlConnectionStringBuilder();

  me.DataSource=XX.Text;

  me.InitialCatalog=XX.Text;

  me.UserID=XX.Text;

 

SqlConnectionStringBuilder me=new SqlConnectionStringBuilder();
me.DataSource=XX.Text;
me.InitialCatalog=XX.Text;
me.UserID=XX.Text;

 

  SqlConnectionStringBuilder me=new SqlConnectionStringBuilder();

  me.DataSource=XX.Text;

  me.InitialCatalog=XX.Text;

  me.UserID=XX.Text;

 

  然后实例化SqlConnection时作为构造函数的参数传递进去:

  SqlConnection conn=new SqlConnection(me.ConnectionString);

 

四、越晚打开SqlConnection越好,越早关闭SqlConnection越好

  对于SqlConnection,我们可以使用using{}语句块来自动释放活动连接:

  using (SqlConnection conn=new SqlConnection(sConnectionString))

  {

    conn.Open();

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

    {

      cmd.ExecuteNonQuery();

    }

  }

 

  使用了using以后,Connection对象不再需要Close(),using语句会在代码块结束的时候自动调用相应对象的Dispose()方法来释放对象资源,对于涉及到系统资源的对象,微软建议用using

 

五、使用Sqlcommand对象执行存储过程

  简要例子如下:

  //建立Command对象,输入存储过程名

  SqlCommand cmd=new SqlCommand("存储过程名",conn);

  //修改Command对象的CommandType属性为执行存储过程,默认为CommandType.Text,用于执行SQL语句

  cmd.CommandType=CommandType.StoredProcedure;

  //添加参数及赋值

  cmd.Parameters.Add("@ClassName",SqlDbType.VarChar,50);

  cmd.Parameters["@ClassName"].Value=xx.Text;

  //指定参数方向

  cmd.Parameters["@ClassName"].Direction=ParameterDirection.Input;

 

 

六、关于DataReader的说明

  (1)DataReader对象不能直接使用new关键词实例化,可通过Command对象的ExecuteReader()方法获得一个DataReader对象

  (2)DataReader是只读只进的读取方式,且是一行一行向前读取记录的,因此常使用while(DataReader.Read())来遍历所有行。

  (3)在真正读取某行某列值以前应该使用DataReader的IsDBNull(列索引号)方法来判断某列是否有值,以免因为不能进行类型转换导致异常。

  (4)读取多表时可以只用一个DataReader,方法是用DataReader的NextResult()方法

 

七、关于如何创建DataSet的简要例子

//建立数据库

DataSet Forum = new DataSet ("Forum");

//建立一张数据表

DataTable tbClass = new DataTable("tbClass");

//把数据表加入数据库

Forum.Tables.Add(tbClass);

//建立tbClass的一列

DataColumn ClassID=new DataColumn("ClassID",typeof(System.String));

//设定ClassID列不允许空

ClassID.AllowDBNull=false;

//把列加入tbClass表

tbClass.Columns.Add(ClassID);

//设定tbClass表的主键

tbClass.PrimaryKey = new DataColumn[] { ClassID };

//添加行记录

for(int i=1;i<=5;i++)

{

  //实例化tbClass表的行

  DataRow tbClassRow = tbClass.NewRow();

  //为行中每一列赋值

  tbClassRow["ClassID"]=Guid.NewGuid();

  //把行加入tbClass表

  tbClass.Rows.Add(tbClassRow);

}

 

注意:

  DataTable不加入DataSet是没有实用意义的,它无法单独使用,同理,DataColumn要加入到DataTable

  对于DataTable的primaryKey属性,它需要赋值一个DataColumn数组,因为主键可由几列共同组成。

  DataRow是不能直接实例化的,因为数据行是属于数据表的,只能通过NewRow()方法获取一个行

 

八、SqlDataAdapter & SqlConnection

  对于SqlDataAdapter,无需打开Connection对象,也无需关闭。它会自己管理相关的连接。

 

九、HTML页面绑定数据写法

  '<%# DataBinder.Eval(Container.DataItem,"你的数据变量") %>'

 

十、数据库连接时间设置

  默认情况下连接数据库的超时时间是15秒,我们可以通过调整连接字符串的方法来改变只读的ConnectionTimeout属性。只需在初始化SqlConnection类的变量时加上一句: Connection Timeout= 2;即可将超时时间调为2秒。

 

十一、枚举所有可用数据源的方法

可以使用SqlDataSourceEnumerator类(System.Data.Sql命名空间)来实现枚举。例子如下:

注:ddl_Server为下拉列表框控件ID,另外,这个操作非常的慢,要谨慎使用。

SqlDataSourceEnumerator instance =SqlDataSourceEnumerator.Instance;

ddl_Server.DataSource=instance.GetDataSources();

ddl_Server.DataTextField="ServerName";

ddl_Server.DataBind();

 

 

十二、使用DataAdapter填充DataSet

  利用DataAdapter填充DataSet后,DataSet中的表的命名默认为Table、Table1、Table2,依此类推。可以用DataTableMapping类对DataTable和DataColumn进行一个友好名称的映射,在使用Fill方法前,用如下代码:

  例子:

  DataTableMapping dtmClass = adapter.TableMappings.Add("Table","新名字1");

  dtmClass.ColumnMappings.Add("ClassID","新名字");

 

  注意:DataTableMapping类属于System.Data.Common命名空间。

 

十三、SQL常用类型

uniqueidentifier  用于GUID主键列。把该列的数据类型设为这个,然后把默认值设置为(newid())来实现GUID。如果主键列是GUID,则不需要再对其赋值。

varchar/char    长度均在1~8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。

int          4个字节

bit          1或0的整数数据。用于存储布尔类型的数据。

datetime      1753年1月1日~9999年12月31日之间的日期和时间数据,精确到30毫秒。

text        text存储可变长度的非Unicode数据,最大长度为2的31次方-1个字符.

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 使用WebClient自动填写并提交ASP.NET页面表单的源代码
    使用WebClient自动填写并提交ASP.NET页面表单的
    转自:http://www.cnblogs.com/anjou/archive/2007/03/07/667253.html 在.NET中通过程序填写和提交表单还是比较简单。比如,要提交一个如下图所示的登录表单:           填写和提交以上表单的代码如下:       // 要提交表单的URI字符串
    02-09
  • asp.net mvc多条件+分页查询解决方案
    


            
asp.net mvc多条件+分页查询解决方案
    asp.net mvc多条件+分页查询解决方案
    http://www.cnblogs.com/nickppa/p/3232535.html开发环境vs2010css:bootstrapjs:jquery    bootstrap paginator原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了MVC多条件+分页查询因为美工不是很好,所以用的是
    02-09
  • ASP.NET操作Cookies的问题(Bug or Not)
    以下存和取都是在不同的页面中,如果是在同一个页面也没必要用cookies了。 Test1: 给Cookies赋值: const string AAA="aaa"; Response.Cookies[AAA].Value = "111;222;333"; 取值: string value = Request.Cookies[AAA].Value; // value为111 Test2: 给Cooki
    02-09
  • Asp.Net Core 自定义验证属性
      很多时候,在模型上的验证需要自己定义一些特定于我们需求的验证属性。所以这一篇我们就来介绍一下怎么自定义验证属性。  我们来实现一个验证邮箱域名的自定义验证属性,当然,最重要的是需要定义一个继承自ValidationAttribute的类,然后在实现其IsVal
    02-09
  • Asp.Net 之 枚举类型的下拉列表绑定
    有这样一个学科枚举类型:/// 学科 /// /summary public enum Subject {None = 0,[Description("语文")]Chinese = 1,[Description("数学")]Mathematics = 2,[Description("英语")]English = 3,[Description("政治")]Politics = 4,[Description("物理&qu
    02-09
  • [ASP.NET笔记] 1.Web基础知识
         1:http协议:     2:web服务器:     3:静态网页的概念     4:动态网页的概念       http协议:http(hypertext transfer protocol) 即超文本传输协议,这个协议是在internet上进行信息传送的协议任何网页之间要相互沟通,必须要尊循
    02-09
  • ASP.NET邮件发送 .net 发送邮件
      今天做了个ASP.NET做发送邮件功能,发现QQ邮箱好奇怪,当你用QQ邮箱做服务器的时候什么邮件都发送不出去(QQ邮箱除外)。而且爆出这样的错误:"邮箱不可用。 服务器响应为: Error: content rejected.http://mail.qq.com/zh_CN/help/content/rejectedmail.ht
    02-09
  • 由ASP.NET Core根据路径下载文件异常引发的探究
    前言    最近在开发新的项目,使用的是ASP.NET Core6.0版本的框架。由于项目中存在文件下载功能,没有使用类似MinIO或OSS之类的分布式文件系统,而是下载本地文件,也就是根据本地文件路径进行下载。这其中遇到了一个问题,是关于如何提供文件路径的,通
    02-09
  • ASP.NET的运行原理与运行机制 ASP.NET的开发模式包括
    ASP.NET的运行原理与运行机制 ASP.NET的开发模
    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用WebForms这种模仿Windows Form编程方式有了很大不同,不再有大量控件和控件生成的大量不够灵活的代码
    02-09
  • ASP.NET 后台接收前台POST过来的json数据方法
     ASP.NET前后台交互之JSON数据 https://www.cnblogs.com/ensleep/p/3319756.html
    02-09
点击排行