ADO.NET 总结

ADO.NET 技术 ADO.NET 技术 前言:    作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角 色。本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET 的主要组成部分。 一、ADO.NET是什么?   简单的说,ADO.NET是一组允许.NET开发人员使用 阅读详情

ADO.NET 总结

一、使用DbConnection要记得手工关闭

上次不小心使用DbConnection后忘记手工关闭了,原以为它会合Stream一样,在生命周期结束之后就会自己关闭掉, 但事实证明,不是这样的,看MSDN是这样说的:

See also

Close 方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。 应用程序可以多次调用 Close。不会生成任何异常。 如果 DbConnection 超出范围,则不会将其关闭。因此,必须通过调用功能上等效的 Close 或 Dispose 显式关闭该连接。 如果将连接池值 Pooling 设置为 true 或 yes,则也会释放物理连接。

二、使用DbProviderFactories并扩充兼容mysql

ADO.NET2.0 为各种ADO.NET类引入了一个提供程序工厂的模型以及通用基类。

ADO.NET通用接口的限制:

  • 接口不易扩展 ADO.NET1.1无法创建某些类的实例
  • ADO.NET1.1无法判断可用的.NET数据提供程序。

提供工厂模型如何解决上述限制

  • 通过抽象积累来扩展ADO,NET模型
  • 使用DbProviderFactory类来创建对象

提供程序工厂模型的限制

  • 许多查询结构都是数据库特有的
  • 为参数化查询设置CommandText时,可能需要提供程序特有的代码
  • 指定参数数据类型可能需要提供程序特有的代码

为了使开发的代码通用,不局限于特定的数据库,本次开发中决定使用DbProviderFactory+标准SQL, 以开发一个适用于mysql和sqlserver的封装,但DbProviderFactories 并没有提供对mysql的DbProviderFactory的支持, 所以需要扩充DbProviderFactories类兼容mysql, 而且在ADO.net 2.0中mysql和sqlserver的ParameterMarkerFormat都有bug,所以扩展类顺带解决这个bug

public static class DbProviderFactoryEx
{
        public static DbProviderFactory GetFactory(string providerName)
        {
                if (providerName == null)
                        throw new ArgumentNullException("providerName");

                switch (providerName)
                {
                        case "MySql.Data.MySqlClient":
                                return new MySqlClientFactory();

                        default:
                                return DbProviderFactories.GetFactory(providerName);
                }
        }

        public static string GetParameterMarkerFormat(DbConnection connect)
        {
                if (connect == null)
                        throw new ArgumentNullException("connect");

                Type type = connect.GetType();
                if (type == typeof(MySql.Data.MySqlClient.MySqlConnection))
                        return MySqlParameterMarkerFormat;//mysql bug
                else
                if (type == typeof(System.Data.SqlClient.SqlConnection))
                        return SqlServerParameterMarkerFormat;//ms bug

                connect.Open();
                string result =
                        connect.GetSchema("DataSourceInformation").Rows[0]["ParameterMarkerFormat"].ToString();
                connect.Close();
                return result;
        }

        public static readonly string SqlServerParameterMarkerFormat = "@{0}";
        public static readonly string MySqlParameterMarkerFormat = "?{0}";
}

三、开启sql2005远程连接功能

连接到SQL Server 2005时,在默认的设置下SQL Server不允许进行远程连接,需要自己手工开启,详细步骤如下: 开始 –> 所有程序 –> Microsoft SQL Server 2005 –> Configuration Tools –> SQL Server Surface Area Configuration –> Surface Area Configuration for Services and Connections –> MSSQLSERVER节点下的Database Engine 节点 –> Remote Connections –> Local and remote connections –> 选择Using Tcp/Ip only 或 Using both Tcp/Ip and named pipes

开始 –> 所有程序 –> Microsoft SQL Server 2005 –> Configuration Tools –> SQL Server configuration Manager –> 重启数据库服务.

四、使用MySql中文乱码问题

1、修改my.ini

[mysqld]
default-character-set=utf8

2、没有权限修改my.ini

假设数据库采用了默认编码latin1,经研究发现:

  1. Select出的数据需要将其从拉丁文转化为GBK

  2. 传入的SQL语句需要将其从GBK转化为拉丁文
    public static class DBHelper
    {
            public static T Get<T>(DbDataRecord record, string field)
            {
                    int num = record.GetOrdinal(field);
                    if (record.IsDBNull(num))
                            return default(T);
    
                    return (T)record[num];
            }
    
            public static int? ToInt32(object value)
            {
                    if (value == null)
                            return null;
    
                    return ((IConvertible)value).ToInt32(null);
            }
    
            public static void AddParameter(string name, object value, DbCommand cmd)
            {
                    DbParameter para = cmd.CreateParameter();
                    para.ParameterName = string.Format(ParameterMarkerFormat, name);
                    if (value == null)
                            para.Value = DBNull.Value;
                    else
                    para.Value = value;
                    cmd.Parameters.Add(para);
            }
    
    
            public static String LatinToGBK(String str)
            {
                    try
                    {
                            byte[] bytesStr = Encoding.GetEncoding("latin1").GetBytes(str);
                            return Encoding.GetEncoding("GB2312").GetString(bytesStr);
                    }
                    catch
                    {
                            return str;
                    }
            }
    
            public static String GBKToLatin(String str)
            {
                    try
                    {
                            byte[] bytesStr = Encoding.GetEncoding("GB2312").GetBytes(str);
                            return Encoding.GetEncoding("latin1").GetString(bytesStr);
                    }
                    catch
                    {
                            return str;
                    }
            }
            public static string ParameterMarkerFormat =
                    DbProviderFactoryEx.SqlServerParameterMarkerFormat;
    }
    

应用

// 处理DbDataReader
using (DbDataReader reader = cmd.ExecuteReader())
{
        foreach (DbDataRecord record in reader)
        {
                role.ID = DBHelper.Get<uint>(record, "ID");
                role.Name = DBHelper.LatinToGBK(DBHelper.Get<string>(record, "RoleName"));
                role.Account = DBHelper.LatinToGBK(DBHelper.Get<string>(record, "Account"));
                return true;
        }
}

// 处理DataTable
foreach (DataRow row in table.Rows)
{
        row["OperationType"] = DBHelper.LatinToGBK(row["OperationType"].ToString());
        row["OperationReason"] = DBHelper.LatinToGBK(row["OperationReason"].ToString());
}

// 传入的SQL语句
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from role where rolename=?rolename";
DBHelper.AddParameter("rolename", DBHelper.GBK2Latin(name), cmd);
Ado/Ado.net与Asp/Asp.net关系 前言 * Asp(Active Server Pages),动态服务页面; * Asp.Net (Active Server Pages基于.NET Framework),基于.net平台的动态服务页面,又称Asp+; * Ado (ActiveX Data Objects),ActiveX数据对象,用于表示用户数据库中的数据结构和所包含的数据 * Ado.Net(ActiveX Dat 阅读详情

相关推荐

DAO 、ADO和ADO.NET

1.什么是DAO(Data Access Objects) DAO数据访问对象是一种应用程序编程接口(API),存在于微软的Visual Basic中,它允许开发者通过ODBC(Open Database Connectivity,是微软提出数据库访问接口标准)连接到Access数据库,对其进行访问。 2.什么是ADO(ActiveX Data Objects) ADO是一项微软的技术,是A

shadowyelling的专栏 1654

ADO与ADO.NET 的区别

前面也分别对ADO和ADO.NET进行概述,从前面的两篇文章来看,我们都知道ADO与ADO.NET 都是一种数据库访问的方式,都是从最基本的Connection(连接)对象开始的,可以说ADO.NET是ADO的一种改进版,在ADO的基础之上ADO.NET 统一了数据容器类编程接口,无论你打算用哪种编写哪种应用程序,都可以通过同一组类来处理数据 。 在ADO的基础上,ADO.NET做了很多的改进,以...

极客神殿 3578

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1328

ADO.NET

ADO.NET是微软 . NET数据库的访问构建,主要提供一个面向对象的数据库访问构建,用来开发数据库应用程序。 ADO.NET主要包括; Connection:主要用来提供数据库的连接功能 Command 对象用于返回数据,修改数据,运行存储过程以及发送或检索参数信息的数据库命令。 DataReader对象通过 Command对象提供从数据库检索信息的功能,它以一种只读的,向前的,快速的,方...

weixin_42974146的博客 9928

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1191

Keystone变换(4)MATLAB仿真

关于Keystone变换三种方法(DFT-IFFT法、Sinc插值法和Chirp-Z法)的仿真

qq_45846079的博客 1569

ADO与ADO.net不同

引言      在我们进入.net平台以后,我们在做项目的时候就离不开ADO.net了,因为只要我们和数据库打交道,我们就必须利用它,然而我们在VB6.0的时代却一直和ADO做朋友,但是随者Web程序的兴起,我们的编程方式发生了重大的改变,然而传统的传统的数据库连线保存设计法无法适用于此类应用程序,这让ADO应用程序遇到了很大的瓶颈。所谓“时势造英雄”在此恰到的时机,ADO.net就应运而生了。

Jack 架构师之路 1326

保姆级教程:Synology NAS共享文件夹从创建到权限设置的完整流程

本文提供了一份详尽的Synology NAS共享文件夹创建与权限设置指南。重点讲解了如何将NAS接入企业AD域,并利用域管理员账户进行集中身份验证和权限管理。文章从基础概念、域环境配置、文件夹创建、精细化权限分配到客户端访问与维护,完整覆盖了构建安全高效企业级文件共享空间的全流程,旨在帮助管理员实现便捷的团队协作与数据安全管理。

u9v0w的博客 552

ADO和ADO.NET

 ADO对于用本机代码编写的应用程序,ADO 为 OLE db 数据提供程序提供基于 com 的应用程序级别接口。与 ADO.NET 相似,ADO 支持各种开发需要,包括使用与关系数据库和其他存储区中的数据的活连接来创建前端数据库客户端和中间层业务对象。而且,像 ADO.NET一样,ADO可构建客户端记录集、使用松耦合记录集、处理 OLE DB 的数据整形行集合。ADO还支持一些不通过 A

*OliverAi's Sky* 1084

手把手入门YOLO到改进优化教程 | 【P1基础篇】YOLOv8网络架构原理

本节先来学习基础知识,以YOLOv8进行讲解入门, 拿YOLOv8入手掌握YOLO的底层逻辑 ,也可以基于此来轻松学习后面更新的YOLO系列 (大部分YOLO版本的核心思想一致,更新是基于旧版本做结构升级、优化策略,学习成本会越来越低)。

嵌入式阿齐Archie 2万+

015、架构_配置文件_管理节点(proxymanager.ini)

该配置文件中的参数在后台配置,两种生效方式:*所有参数重启生效。*部分参数可以使用工具dbtool动态生效。动态生效命令为:dbtool-pm-load-config。配置文件“proxymanager.ini”用于设置元数据管理模块的信息。文件路径为“~/etc”。配置文件“proxymanager.ini”是普通的文本文件。默认值proxymanager-alarmconfutf8.txt。配置错误或不配置,PM无法连接MDS,无法服务。获取元数据失败超时处理时间。异常时请求启动对等回滚。

Oracle/MySQL 到 国产信创数据库|迁移 · 调优 · 信创替换 328

ADO与ADO.Net

在介绍ADO.Net之前先让我们回顾一下在红皮书中学习的ADO的内容。      ADO(ActiveX Data Objects),我们称它为一种用于数据访问的对象模型,《VB.Net》视频中称它为用于存取资料库的物件集合。资料库就是数据,物件即对象。这样看来两种说法完全一样。提起ADO,我们只要问自己两个问题: 它是什么?  ——对象的集合干什么用的?——访问数据     这

To Begin,Begin   1616

最新扣子智能体教程:手把手教你接入抖音评论区,实现自动回复

摘要:本文介绍如何利用扣子(Coze)平台搭建智能体实现抖音评论自动回复。从准备工作(账号注册、权限申请)到智能体创建(提示词优化、模型选择),再到抖音API接入和自动回复逻辑设置,详细说明了每个步骤的操作方法。文章还提供了回复模板示例和优化建议,帮助提升互动效率。通过这套方案,创作者可以显著减轻评论区管理压力,增强用户互动体验。(149字)

互联网架构师笔记 984

再看ADO.NET

最近做了简单三层机房收费系统,对三层有了更加深刻的理解,不过问题也多了,希望以后会可以很好的理解.这篇博客,写通过机房收费系统中的对数据库的访问处理,对ADO.NET有了更进一步的理解,简单总结一下.           一,概念理解: ADO.NET的名称起源于ADO(ActiveX DataObjects),它是一个广泛的类组,用于在Microsoft中访问数据。他提供了平台互用

学会改变自己——才能突破 7170

WIN10系统下VS2019编译CloudCompare2.12.4

CloudCompare2.12.4

点云侠的博客 3142

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ADO.NET知识总结1---ADO.NET介绍

Ado.Net是 一种数据访问技术,使应用程序可以连接到数据库,并以各种方式来操作其中的数据。一个COM组件库,用于在.Net中访问数据,优先选择的数据访问接口。odbc oledb

white_papers的博客 852

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ADO和ADO NET的区别

ADO和ADO NET的区别

qq_43747119的博客 602

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ADO与ADO.NET的区别

 1. ADO与ADO.NET简介ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。众所周知.NE

hdhai9451的专栏 1126

为 ADO 程序员设计的 ADO.NET !

为 ADO 程序员设计的 ADO.NET 摘要:本文讨论如何以 ADO.NET 方式实现基本数据库操作,以及何时使用 ADO.NET 代替 ADO。 目录.NET 中的数据访问读取数据DataSet、DataTable 和 Recordset转换现有代码更新数据XML 扩展支持总结自若干年前推出开放式数据库连接 (ODBC) 应用程序编程接口 (API) 以来,出现了各种各样的

wujp1976的专栏 1592

ado.net EF与ado.net区别比较

ado.net EF与ado.net区别比较、在EF中使用执行sql语句 (1).net: 最核心的基础平台(可以看做运行环境和巨多类库),仅次于操作系统 (2)asp.net: .net平台下进行网站开发的框架 (3)asp.net MVC:asp.net 框架下开发网页的一种框架 (4)ado.net: .net平台下访问数据库的框架,他提供了一些列的访问数据库的类库 (5)ado.net E...

h520521的博客 4504

ADO/ADO.NET

引用一、ADO 与ADO.NET两种数据访问方式区别? 1. ADO与ADO.NET简介    ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘 空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的AD

windofthesky的专栏 1167

你必须知道的ADO.NET(一) 初识ADO.NET

摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色。本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分。  目录 什么是ADO.NET?理清ADO.NET与ADO的关系认识ADO.NET最核心的组成部分ADO.NET扩展   1. 什么是ADO.NET?       简单的讲,

浮城大亨的专栏 986

ADO和ADO.NET的区别(转)

1. ADO与ADO.NET简介 ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。众所周知.NET...

weixin_30641999的博客 453

ADO和ADO.NET的区别

不同点: 1.接口和基础不同: ADO:     接口:OLEDB    基于:COM技术 ADO.NET:  接口:自己的ADO.NET接口    基于:.NET体系架构 2.断开时访问的方式不同: ADO:以Recordset在客户端存储,只能存单表,若存多表,要多表连接    ADO并未完全实现断开式访问数据库. ADO.NET:以DataSet在客

欣的专栏 1603
上一篇: 使用Detours进行API拦截
下一篇: 字节对齐
beingstudio
博客等级 码龄21年 442粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值