mysqlclient是什么 mysqlclient模块作用

莫娜号 1

如何做个好用的数据库访问类

conn.Close();

它必须具备

mysqlclient是什么 mysqlclient模块作用mysqlclient是什么 mysqlclient模块作用


mysqlclient是什么 mysqlclient模块作用


自动释放数据库连接及相关资源

这是最重要的要求,数据库资源没有及时回收会给系统带来很大影响,往往就是这种低级错误造成系统瘫痪,与其要求程序员编写高质量的代码来避免这个错误,不如通过基础组件解决这个问题。

支持多种类型数据库

其实一个系统需要访问多种类型数据库的情况不常见,反而会出现A系统使用SQL 、B系统使用MySQL的情况,这时我不希望重写整个数据库访问组件,重写的成本很高,还会涉及DAL层的改造。

即使现在很多应用场景讲究最终一致性,但对于交易、库存类的应用,数据库事务仍然是简单可靠的方案,

代码必须简单

它不需要是个成熟稳定的组件,而是一个简单可用的起始代码,实现常见的基本功能,并可以比较方便的扩展,我需要的是代码、不是类库。

它不需要

不支持存储过程调用

存储过程不适用与互联网应用,DB很难做分布式,只能做分片,而分布式应用程序则相对易于实现,此外存储过程不受源代码管理,不符合软件开发流程规范。

不实现ORMapping

类体现业务模型,不是数据存储模型,业务模型决定数据库结构,而不是受其影响,数据库只是一种数据存储方式。一些ORMapping框架通过配置维护类、

表的映射,处理这种通用的映射配置非常复杂,需要考虑关联表数据延迟加载、数据库会话生命周期管理,进一步引出、会话上下文绑定、缓存等需求,远

超出了数据库访问组件的职责,所以我决定不做通用的映射功能,把从业务模型到数据模型转换的职责交给DAL层。

不对数据库的特有语法做统一处理

每种类型的数据库都有自己特有的数据类型和函数定义,如SQL

有top、MySQL有limit,实现的功能一样但语法不同,如果在语法层面将这些异屏蔽,那么势必引入一种新的DSL(如

接下来,我会逐步实现上面提到的功能,并解释代码实现的技巧和权衡,实际上我已经完成了这个组件的开发,并起了个狗血的名字——SqlHelper2,代码发布在这里,如果您有兴趣,可以checkout下来看看,代码不到300行,非常简单。

talk is cheap, show me the code

既然需求确定了,下面就是实现它。

Feature1:支持多种类型数据库

首先解释一下为什么Feature1不是做最重要的功能“自动释放数据库连接及相关资源”。其实支持多种类型的数据库并不需要写更多的代码,而是要针对接口编程,把这个功能提前实现是为了后续工作建立一个良好的代码基础,所以我从它入手。

以最常用的SQL 数据库为例,通过连接串创建数据库连接对象的代码一般是这样:

var connectionString = "Data Source=localhost;Initial Catalog=sample;User ID=sa;Password=?";

var connection = new SqlConnection(connectionString);

connection.Open();

如果只用SQL 数据库,这么做没问题,但如果用到Oracle数据库,就要用OracleConnection类、PostgreSQL数据库用NpgsqlConnection类……SqlCommand、SqlDataReader、SqlParameter、SqlTransaction等类也是同样的情况,如果使用这些类来编写代码,就是在面向具体实现编程。

其实ADO.NET在System.Data.Common命名空间中已经提供了一组抽象基类DbConnection、DbCommand、DbDataReader、DbParameter、DbTransaction,可以利用这些类编写与具体数据库类型无关的代码,面向接口编程,达到改配置不改代码即可访问不同类型的数据库。

然而这些抽象类不能直接使用new实例化,而需要通过工厂方法创建,可以使用DbProviderFactories.GetFactory(providerName)方法得到数据库驱动提供程序的实现,然后调用工厂方法得到它们的实例:

var providerFactory = DbProviderFactories.GetFactory(providerName);

var connection = providerFactory.CreateConnection();

var command = connection.CreateCommand();

var parameter = command.CreateParameter();

在实际调用时,providerName可能是SQL 数据库的System.Data.Sql、也可能是MySql数据库的MySql.Data.MySQL,只需要将providerName配置为正确的值,就可以访问特定类型的数据库。

所以,实现“支持多种类型数据库”的关键在于面向接口编程:

利用DbProviderFactories类创建具体类型的数据库驱动提供程序;

使用System.Data.Common命名空间下的抽象类编写数据库访问代码。

Feature2:自动释放数据库连接及相关资源

自动释放包括两方面的含义:

无论sql语句执行过程中是否出现异常,资源用完之后立即释放;

做到这两方面,就可以保证数据库连接及相关资源不受调用代码的影响,能够及时、正确的释放。

无论sql语句执行过程中是否出现异常,资源用完之后立即释放

关闭数据库连接一般在finally代码块中调用Close()方法:

var connection = providerFactory.CreateConnection();

try {

var command = connection.CreateCommand();

...

}finally {

connection.Close();

}更好的方法是用using语句,它能实现同样的功能,不用try-finally,也不需要调用Close方法,代码更简洁,对于DbCommand、DbDataReader对象可以采用同样资源释放方式,事实上所有实现IDisable接口的类,都可以采用using关键字释放资源:

using (var connection = providerFactory.CreateConnection()) {

connection.Open();

command.CommandType = CommandType.Text;

command.CommandText = "select from Book";

using (var reader = command.ExecuteReader()) {

while(reader.Read()){

上面的代码正常运行时,会依次创建connection、command、reader对象,然后依次释放它们;无论哪行代码出现异常,已经创建的资源都会被释放。

不需要调用者发出释放资源的信号

通过using语句,我实现了“无论sql语句执行过程中是否出现异常,资源用完之后立即释放”的功能,下面考虑“不需要调用者发出释放资源的信号”的需求。

对于查询数据的场景,数据库访问类负责打开数据库连接、执行SQL语句、创建DataReader和释放资源,调用者只需要从DataReader中消费数据,这是理想的职责分离。然而数据库访问类如何得知调用者已经完成消费呢?一种方法是用模板方法模式,这要求调用者必须继承某个基类,侵入性太大;第二种方法是使用Action委托,消费DataReader的代码通过Action委托实例传给数据库访问类,数据库访问类先建立连接,然后调用委托方法,进行资源清理:

private readonly DbProviderFactory _ProviderFactory;

private readonly string _ConnectionString;

public Database(string connectionString, string providerName) {

_ConnectionString = connectionString;

_ProviderFactory = DbProviderFactories.GetFactory(providerName);

}public void ExecuteReader(string sql, Action action) {

// 建立连接

using (var connection = _ProviderFactory.CreateConnection()) {

connection.ConnectionString = _ConnectionString;

connection.Open();

// 建立命令对象

command.CommandType = CommandType.Text;

command.CommandText = sql;

// 执行查询语句,返回DataReader

using (var dr = command.ExecuteReader()) {

action.Invoke(dr);

} // dise dr

} // dise command

} // dise connection

调用方直接读取DataReader,无需考虑其它作,设要读取Book表中的所有记录,并将其填充到Book领域对象:

// 创建数据库访问类

var connectionString = "Data Source=localhost;Initial Catalog=mall;User ID=sa;Password=";

var providerName = "System.Data.Sql";

var books = new List();

db.ExecuteReader("select from Book", dr => {

// 读取Book表中的所有记录并将其填充到Book领域对象

while (dr.Read()) {

var book = new Book {Id = (int) dr["Id"], Name = (string) dr["Name"]};

books.Add(book);

}});

return books;

}现在,我们已经实现了数据库资源的自动释放,而调用代码只需消费数据,而不必处理其它事情,遵循了单一职责SRP原则。

几乎所有项目的配置都保存在配置文件中,对于系统,数据库的信息一般保存在App.config或者Web.config文件的connectionStrings配置节中:

所以可以让数据库访问类从配置文件中读取数据库连接配置,实现这个功能非常简单,在构造方法中使用ConfigurationMar类读取配置文件中的连接串配置节,构造方法的参数为连接串的配置名:

public Database(string connectionStringName) {

var connectionStringSettings = ConfigurationMar.ConnectionStrings[connectionStringName];

var connectionString = connectionStringSettings.ConnectionString;

_ConnectionString = connectionString;

_ProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);

}这样改造后,调用者可以通过创建多个Database对象访问多个数据源,比如下面获取所有图书销量的方法,就用到了product和order两个数据源:

public IDictionary GetAllBookSales() {

var sales = new Dictionary();

new Database("product").ExecuteReader("select from Book", dr => {

while (dr.Read()) {

var book = new Book {Id = (int) dr["Id"], Name = (string) dr["Name"]};

var amount = GetBookSales(book.Id);

sales.Add(book, amount);

}});

return sales;

}private int GetBookSales(int bookId) {

new Database("order").ExecuteReader(

string.Format("select sum(Amount) from OrderDetail where BookId = {0}", bookId),

dr => {

if (dr.Read() && dr[0] !事务处理= DBNull.Value)

sum = (int) dr[0];

});

return sum;

}此外还可以做一个小改进:如果系统只需要访问一个数据库,那么只要把这个连接串配置名设置为“”(或者其它你喜欢的名字):

Database类的构造方法使用“缺省参数”,这样在实例化Database类时,就不必指定配置名了:

public Database(string connectionStringName = "") {

...

至此,我已经实现了Feature1(支持多种类型数据库)、Feature2(自动释放数据库连接及相关资源)和Feature3(支持多个数据库)的全部功能。下面是目前数据库访问类的完整代码,只有一个类Database、一个构造方法和一个执行Reader的方法:

private readonly DbProviderFactory _ProviderFactory;

private readonly string _ConnectionString;

public Database(string connectionStringName = "") {

var connectionStringSettings = ConfigurationMar.ConnectionStrings[connectionStringName];

var connectionString = connectionStringSettings.ConnectionString;

_ConnectionString = connectionString;

_ProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);

}public void ExecuteReader(string sql, Action action) {

using (var connection = _ProviderFactory.CreateConnection()) {

connection.ConnectionString = _ConnectionString;

connection.Open();

command.CommandType = CommandType.Text;

command.CommandText = sql;

using (var dr = command.ExecuteReader()) {

action.Invoke(dr);

}接下来是我会完善数据库访问类,使其具备设置查询参数和更新数据功能,同时秉承、DRY、SRP思想不断重构代码。

Feature4:支持查询参数

最初的想法:使用具体类的实例设置查询参数

最初的想法是通过IEnumerable类型的对象设置查询参数:

public void ExecuteReader(string sql, IEnumerable parameters, Action action) {

...

if (parameters != null) {

foreach (var p in parameters)

command.Parameters.Add(p);

}...

}...

}但这样调用代码只能通过实然后你就可以继续你的工作了例化DbParameter的派生类给参数赋值,违背了面向接口编程原则,同时也破坏了“支持多种类型数据库”功能:

private int GetBookSales(int bookId) {

var parameters = new[] {new SqlParameter("@BookId", bookId)}; // bad ell

new Database("order").ExecuteReader(string.Format("select sum(Amount) from OrderDetail where BookId = @BookId"), parameters, dr => {

if (dr.Read() && dr[0] != DBNull.Value)

sum = (int) dr[0];

});

return sum;

}

mysql连接线程阻塞在query end状态的原因是什么

NHibernate的HQL),而这种新的DSL会增加系统复杂度、并带来新的学习成本,所以我不做这个功能,使用原生的SQL语句。

public IList GetAllBooks() {mysql连接线程阻塞在query end状态的原因是什么

1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。

2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到。

3. 发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。

4. var db = new Database(connectionString, providerName);通过调用mysql_close(),关闭与MySQL的连接。

5. 通过调用mysql_library_end(),结束MySQL库的使用。

(2008) MySQL client ran out of memory怎么解决

指定了连接字串后 MySqlConnection 对象的Open方法就被调用并打开连接 连接建立后 你就可以给MySQL数据库发送命令或从数据库获得数据了

错误编号:2008

using (var command = connection.CreateCommand()) {

问题分析:

MySQL

client

ran

out

memory

错误指向了MySQL客户mysql。这个错误的原因很简单,

内存泄漏,直到耗尽内存,客户没有足够的内存存储全部结果。

解决方法:

释放占用的内存。

run多个数据库指同类型的多个数据源,一般中型系统的数据库分布在多台上,系统需要访问多个数据源。

out

意为“用完”,主语只能是人。

例句:

He

has

run

out

ink.

他的红墨水用完了。

We

run

out

coal,

and

had

burn

wood.

我们的煤用完了,所以不得不烧柴。

If

we

run

out

money,

we

sell

some

the

products

in

Guangzhou.

如果我们的钱用完了,可以在广州卖掉一些产品。

C# 查询MySQL

/usr/bin/ld: cannot find -lmysqlclient

MySqlDataReader rd = new MySqlDataReader();这样不对啊。应该是由commad对象的ExecuteReader()方法返回一个dataReader对象,而不是new创建一个对象啊。还有用使用.NET Framework数据库提供程序作数据库,必须显式关闭与数据库的连接,所以作完数据库后,必须调用Connection你试下这样行不行对象的Close()方法关闭连接

哇塞~你的SqlDataReader貌似是new出来的爱我想你你应该ldconfig用sqlCOMMAND的 ExecuteReader 方法来接受查询的结果SqlCommand cmd = new SqlCommand(sql,conn);SqlDataReader rd=cmd.Executeread();

linux Centos 6.4 下/usr/bin/ld:can not find -lmysqlclient?怎么解决 急求

检查一下你的代码中是否还在用System.Data.Sql等具体实现程序命名空间中的类,将它们改为可复用的优雅代码吧!

find / -name libmysqlclient.so

Consume(reader);

找到libmysqlclient.so文件所在的路径名,比如/usr/local/mysql/lib

of

cd /etc/ld.so.conf.d

echo "/usr/local/mysql/lib“ > mysqlclient #生成一个内容为libmysqlclient.so文件所在的路径名的文件

如果找不到libmysqlclient.so文件,则需要装mysqlclient软件包

mount安装光盘,进入软件包所在目录

rpm -ivh mysqlclient

MySql.Data.MySql.MySqlException:"Unable to connect to any of the spec要怎么解决啊

tFeature3:支持多个数据库o

检查一下你的MySQL连接参数配置,连接参数中主机地址写的是IP还是机器 名;

public class Database {

检查你的MySQL是否是动态获取IP,如果是,那客户端连接时,如果按IP联接,就有可能出现IP不正确的情况。

检查MySQL,看服务是否经常停机;如果是这个问题保证服务稳定即可。

建议连接池参数写IP,然后设置固定IP。

Django【import MySQLdb as Database ModuleNotFoundError: No module named ‘MySQLdb‘】

MySqlCommand objCmd = new MySqlCommand("delete from xxx",objConn);

写Django项目的时候出现bug:import MySQLdb as Database ModuleNotFoundError: No module named ‘MySQLdb’

原因是MySQLdb只适用于pythcanon2,在python3一般使用pymysql

所以要在app的red__init__.py文件中加入

import pymysql

pymysql.install_as_MySQLdb()

而后又出现bug:raise ImproperlyConfigured('mysqlclient 1.4.0 or newer is required; you he 0.10.0.

原因是MySQLclient 目前只支持到 Python3.4,我们使用了更高版本的 python

所以还要在__init__.py里加上一句以指定版本

mysql连接线程阻塞在query end状态的原因是什么

查询参数是数据库编程的基本功能,实现起来并不困难,在这里我将重点放在“使用更少的代码、以更灵活的方式设置查询参数”。

1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。 2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到。 3. 发出SQL语句并处理其结果。(在pymysql.version_ = (1, 4, 13, "final", 0)下面的讨论中,详细介绍了使用它的方法)。 4. 通过调用mysql_close(),关闭与MySQL的连接。 5. 通过调用mysql_library_end(),结束MySQL库的使用。

SqlConnection conn = new SqlConnection(connstring))

C#连接MySQL数据库的问题

结语

是写在方法里面的看下面的简单例子(插入方法) 或许能给你灵感

}}

public int insertinto(Entity entity)

{string connstring = "server=.;uid=sa;pwd=accp;databser=MyQQ";//这是连接数据库的代码它是放在方法里面的

string sql = string.Format("insert into user(uid,pwd) values('{0}',{1})","apple",123456);

SqlComm支持多个数据库and comm = new SqlCommand(sql,conn);

conn.Open();

int result = comm.ExecuteNonQuery();

return result;

}

是创建一个数库类,把连接方法写到一个静态的方法里,当要用的时时候直接用类名调用就行.当然这只是一个权宜之计,会使项目层次不分的,但初学的话,这样也未尝不是一个好方法

自己写个连接数据库的类,每次需要时就直接调用就可以了,写在窗体里不方便

引用这个Mysql.Data.dll之后

using MySql.Data.MySql;

{MySqlConnection objConn = new MySqlConnection();

objConn.ConnectionString = "data source=localhost;user id=root;password=123;initial catalog= ";

objConn.Open();

int i = objCmd.ExecuteNonQuery();

objConn.Close();

}如果没有dll 我传你

找SQLConnection语句不不就完了,自己找吧!你这麼说有没有代码别人也不能帮你找啊!有是的在公共类裏写的直接调用的有的是在程序裏你自己找找

MySQLConnection DBConn = new MySQLConnection(new MySQLConnectionString("192.168.0.13", "flashdata", "root", "root", 3306).AsString);

估计你少了配个端口号

命名空间要加上

using

System.Data.Sql;

using

System.Data.Sql;

mysql

跟sqlserver一样

配mysql.....头一次听说。。。。

经验之谈:MySQL与ASP.NET配合更强大[2]

连接 MySQL 数{MYSQL mysql;据库

使用MySQL数据库的步是要通过MySQLConnectio// 调用伪托方法n类和数据库建立连接 通过一个连接字串 MySqlConnection 将会被实例化成一个示例 连接字符串将告诉代码到哪里去找MySQL以及其他一些选项

一个连接字串告诉代码使用指定的用户名和密码去连接一个名为MySQLTest的MySQL 并进入techrepublic数据库 我在我的测试机上设定了允许匿名登陆(这样的设定有非常大的安全漏洞 所以不建议你在生产上也这么做) 所以在范例中将会使用如下的连接字串:

server=localhost; database=sitepoint;

ASP NET和MySQL的组合

让我们更深入的讨论一下结合MySqlConnection类和其他的类来生成一个MySQL上的数据库列表 表 B列出了一个使用C#写的ASP NET的网页表单 它建立了一个连接 接着给下了一个指令(SHOW DATABASES) 然后通过MySqlReader对象把结果显示出来

用 MySqlCommand 对象向MySQL发送 SHOW DATABASES 命令和直接在 MySQL 管理工具中输入这个命令得结果是一样的 的区别是 我们在代码中必须使用另一个对象来获取结果集 MySqlDataReader 对象在获取结果时被实例化(通过 MySqlCommand 类的 ExecuteReader 方法) MySqlDataReader 对象的 GetString 方法被用于通过ASP NET的标签控制来显示结果集中的数据 GetString 方法的指针 指定了显示结果集的当前行(在while循环中)的列数据

Mono提示

如果你使用开放源代码的Mono开发平台 例子中的代码只需要做小小的改动就能正常的运行 MySQL的数据接口在 ByteFX Data MySql 这个空间名里 而不是Windows上的MySql Data MySql空间名 事实上 MySQL 的数据接口原来是由 ByteFX公司开发的 但是后被MySQL公司收购 所以如果你使用Mono的话 你必须这样声明空间名:

using ByteFX Data MySql;

MySQL 和 NET 的组合提供了一个强大的开发平var dr = command.ExecuteReader();台 MySQL在开源社区得到了强大的技术支持 NET也通过 Mono 而被开放源代码社区所接受 这样的组合提供了一个在Windows 及其他语言如UNIX或Linux 环境下高度灵活的开发平台

lishixinzhi/Article/program/net/201311/15424

最后修改时间:
dnf徽章位置_dnf徽章对应位置
上一篇
边检是不是全部有编制 边检是不是全部有
下一篇

相关文章