原生的ado.net(访问sql server数据库)

本文介绍原生的ado.net(访问sql server数据库)

写在前面

  1. 数据库连接字符串

    过时的写法 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 表示数据库
  2. 连接池技术
    ado.net默认采用连接池技术,当close了一个连接,会将连接对象放进程序池中,下次open,如果对象没有占用,会直接拿来用,当有其他并发用户同时操作时,会创建多个连接对象,这时拼的就是连接池容量了
    你可以在连接字符串中添加 Pooling=false 禁用连接池技术

联接模型(不缓存数据,每次查询都要重新访问数据库)

  1. 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 连接处于打开状态
  2. 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控件使用比较好)

  1. 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);
        }
    }
  2. 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代码封装

  1. 配置连接字符串

    将连接字符串提取出来方便以后修改
    在App.config配置文件中的configuration节点下添加如下代码
        <connectionStrings>
            <add name="mssqlserver" connectionString="Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"/>
        </connectionStrings>
    在程序中要获取这段xml配置,需要添加 System.Configuration 引用
  2. 封装代码
    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;
        }
    }

原文地址:https://www.cnblogs.com/ye-hcj/p/8191284.html

时间: 2024-10-13 04:06:40

原生的ado.net(访问sql server数据库)的相关文章

C# ADO.NET访问SQL Server数据库&lt;转&gt;

ADO.NET的对象主要包括Connection.Command.DataReader.DataAdapter.DataSet,ADO.NET访问数据库主要包括两个步骤:建立数据库连接.读取或更新数据. 一.建立数据库连接 Connection对象负责建立和控制用户应用程序和数据库之间的连接.所有的数据库连接都要用到连接字符串,该字符串是使用分号隔开的多项信息,其内容随着数据库类型和访问内容的变化而变化. 连接字符串的格式:"Server=服务器名或服务器IP地址;DataBase=数据库名称;

使用ADO.NET对SQL Server数据库进行访问

在上一篇博客中我们给大家简单介绍了一下VB.NET语言的一些情况,至于理论知识的学习我们可以利用VB的知识体系为基础,再将面向对象程序设计语言的知识进行融合便可进行编程实战. 如果我们需要访问一个企业关系数据库(比如SQL Server或者Oracle),并且需要包含由复杂关系构成的表中的数据,如何去实现?我们可以利用ADO.NET内置功能提取并操作数据,就想插入.更新和删除SQL Server里的数据一样. 首先简单介绍一下ADO.NET.所谓的ADO就是ActiveXData Objects

.NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库

今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将运行在Linux上的示例站点(http://about.cnblogs.com)升级到了ASP.NET 5 RC1,并且增加了数据库访问功能——基于Entity Framework 7 RC1访问SQL Server数据库. 示例站点页面左侧的导航是从数据库读取数据动态加载的,数据库服务器用的是阿里

c#.net 是如何访问 SQL Server 数据库

1.导入命名空间 using System.Data.SqlClient; //连接SQLServer 数据库专用 2.创建连接 SqlConnection lo_conn = New SqlConnection("Server=服务器名字或IP;Database=数据库名字;uid=用户名;pwd=密码"); 3.打开连接,第2步并没有真正连接数据库 lo_conn.Open(); //真正与数据库连接 4.向数据库发送SQL命令要使用SqlCommand: SqlCommand l

java 访问sql server数据库

控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是java代码: public static void main(String args[]){ Connection con;//链接 java.sql.Statement sql;//语句 ResultSet rs;//查询结果 try { Class.forName("sun.jdbc.odbc.J

第一个ADO.NET连接SQl server数据库

ado.net连接sql server2008本机数据库 1.只连接数据库,然后做简单查询 1 using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1; Initial Catalog=MyTest;User ID=sa;Password=123456")) 2 { 3 conn.Open(); 4 using (SqlCommand cmd = conn.CreateCommand()) 5 { 6 l

[转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法

问题描述: 假设在数据库中存在以下两张数据表: User表,存放用户的基本信息,基本结构如下所示:   类型 说明 ID_User int 自动增长字段,用作该表的主键 UserName varchar   UserDepart表,存放用户所拥有的部门(我们假设一个用户拥有多个部门,虽然听起来有点别扭,此处仅作示例,可以理解为一个用户拥有多个职位等等),该表的基本结构如下所示:   类型 说明 ID_UserDepart int 自动增长字段,用作该表的主键 ID_User int 用户编号 I

vb.net访问sql server数据库(SqlDataReader和DataSet两种方式)

.net访问数据库的三个基本步骤: 一.连接数据库: 要使用sqlclient命名空间中的sqlconnection类: 定义一个sqlconnection对象: Dim sqlCon As New SqlConnection 要进行的设置有: 1.sqlCon .ConnectionString="server=服务器ip;database=数据库名称;integrated security=ture/false(是否有登录账号密码);uid=用户名 (默认:sa);pwd:登录密码"

ADO.NET 获取SQL SERVER数据库架构信息

1.确定可用字段数目 sqlDataReader类提供了FieldCount属性,可确定查询反悔了多少个字段. 2.确定返回行的数目 sqlDataReader中没有指示可用行的属性. 3.确定字段的名称 使用sqlDataReader的GetName方法,该方法接受一个Int整数,指定字段的序号,并在一个字段中返回其名称. 4.确定字段在.NET中的数据类型 要确定用于存储在一特定字段的内容的.NET数据类型,请使用SqlDataReader的GetFieldType方法,与GetName方法