search
HomeDatabaseMysql Tutorialc#连接sqlserver数据库
c#连接sqlserver数据库Jun 07, 2016 pm 03:51 PM
sqlserverintroducehowdatabasedetailedconnect

本文将详细介绍如何使用Connection对象连接数据库。对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库。这些Connection对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。 Connection类有四种:SqlConnection,OleDbConnecti

 本文将详细介绍如何使用Connection对象连接数据库。对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库。这些Connection对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。

Connection类有四种:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection。

SqlConnection类的对象连接SQL Server数据库;OracleConnection 类的对象连接Oracle数据库;

OleDbConnection类的对象连接支持OLE DB的数据库,如Access;而OdbcConnection类的对象连接任何支持ODBC的数据库。与数据库的所有通讯最终都是通过Connection对象来完成的。

SqlConnection类

Connection 用于与数据库“对话”,并由特定提供程序的类(如 SqlConnection)表示。尽管SqlConnection类是针对Sql Server的,但是这个类的许多属性、方法与事件和OleDbConnection及OdbcConnection等类相似。本章将重点讲解SqlConnection特定的属性与方法,其他的Connection类你可以参考相应的帮助文档。

注意:使用不同的Connection对象需要导入不同的命名空间。OleDbConnection的命名空间为System.Data.OleDb。SqlConnection的命名空间为System.Data.SqlClient。OdbcConnection的命名空间为System.Data.Odbc。OracleConnection的命名空间为System.Data.OracleClinet。

SqlConnection属性:

属性 说明

ConnectionString 其返回类型为string,获取或设置用于打开 SQL Server 数据库的字符串。

ConnectionTimeOut 其返回类型为int,获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。

Database 其返回类型为string,获取当前数据库或连接打开后要使用的数据库的名称。

DataSource 其返回类型为string,获取要连接的 SQL Server 实例的名称。

State 其返回类型为ConnectionState,取得当前的连接状态:Broken、Closed、Connecting、Fetching或Open。

ServerVersion 其返回类型为string,获取包含客户端连接的 SQL Server 实例的版本的字符串。

PacketSize 获取用来与 SQL Server 的实例通信的网络数据包的大小(以字节为单位)。这个属性只适用于SqlConnection类型

SqlConnection方法:

方法 说明

Close() 其返回类型为void,关闭与数据库的连接。

CreateCommand() 其返回类型为SqlCommand,创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。

Open() 其返回类型为void,用连接字符串属性指定的属性打开数据库连接

SqlConnection事件:

事件 说明

StateChange 当事件状态更改时发生。 (从 DbConnection 继承。)

InfoMessage 当 SQL Server 返回一个警告或信息性消息时发生。

提示:可以用事件让一个对象以某种方式通知另一对象产生某些事情。例如我们在Windows系统中选择“开始”菜单,一旦单击鼠标时,就发生了一个事件,通知操作系统将“开始”菜单显示出来。

使用SqlConnection对象连接SQL Server数据库

我们可以用SqlConnection()构造函数生成一个新的SqlConnection对象。这个函数是重载的,即我们可以调用构造函数的不同版本。SqlConnection()的构造函数如下表所示:

构造函数 说明

SqlConnection () 初始化 SqlConnection 类的新实例。

SqlConnection (String) 如果给定包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。

假设我们导入了System.Data.SqlClient命名空间,则可以用下列语句生成新的SqlConnection对象:

SqlConnection mySqlConnection = new SqlConnection();

程序代码说明:在上述语法范例的程序代码中,我们通过使用“new“关键字生成了一个新的SqlConnection对象,并且将其命名为mySqlConnection。

现在我们就可以使用如下两种方式连接数据库,即采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录。

集成的Windows身份验证语法范例

string connectionString="server=localhost;database=Northwind;

integrated security=SSPI";

程序代码说明:在上述语法范例的程序代码中,我们设置了一个针对Sql Server数据库的连接字符串。其中server表示运行Sql Server的计算机名,由于在本书中,ASP.NET程序和数据库系统是位于同一台计算机的,所以我们可以用localhost取代当前的计算机名。database表示所使用的数据库名,这里设置为Sql Server自带的一个示例数据库--Northwind。由于我们希望采用集成的Windows验证方式,所以设置 integrated security为SSPI即可。

Sql Server 2005中的Windows身份验证模式如下:

注意:在使用集成的Windows验证方式时,并不需要我们输入用户名和口令,而是把登录Windows时输入的用户名和口令传递到Sql Server。然后Sql Server检查用户清单,检查其是否具有访问数据库的权限。而且数据库连接字符串是不区分大小写的。

采用Sql Server身份验证的语法范例

string connectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";

程序代码说明:在上述语法范例的程序代码中,采用了使用已知的用户名和密码验证进行数据库的登录。uid为指定的数据库用户名,pwd为指定的用户口令。为了安全起见,一般不要在代码中包括用户名和口令,你可以采用前面的集成的Windows验证方式或者对Web.Config文件中的连接字符串加密的方式提高程序的安全性。

Sql Server 2005中的Sql Server身份验证模式如下:

如果你使用其他的数据提供者的话,所产生的连接字符串也具有相类似的形式。例如我们希望以OLE DB的方式连接到一个Oracle数据库,其连接字符串如下:

string connectionString = "data source=localhost;initial catalog=Sales;

use id=sa;password=;provider=MSDAORA";

程序代码说明:在上述语法范例的程序代码中,通过专门针对Oracle数据库的OLE DB提供程序,实现数据库的连接。data source 表示运行Oracle数据库的计算机名,initial catalog表示所使用的数据库名。provider表示使用的OLE DB提供程序为MSDAORA。

Access数据库的连接字符串的形式如下:

string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;

@”data source=c:\DataSource\Northwind.mdb”;

程序代码说明:在上述语法范例的程序代码中,通过专门针对Access数据库的OLE DB提供程序,实现数据库的连接。这使用的的OLE DB提供程序为Microsoft.Jet.OLEDB.4.0,并且数据库存放在c:\DataSource目录下,其数据库文件为Northwind.mdb。

现在我们就可以将数据库连接字符串传人SqlConnection()构造函数,例如:

string connectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";

SqlConnection mySqlConnection = new SqlConnection(connectionString);

或者写成

SqlConnection mySqlConnection =new SqlConnection(

"server=localhost;database=Northwind;uid=sa;pwd=sa");

在前面的范例中,通过使用“new“关键字生成了一个新的SqlConnection对象。因此我们也可以设置该对象的ConnectionString属性,为其指定一个数据库连接字符串。这和将数据库连接字符串传人SqlConnection()构造函数的功能是一样的。

SqlConnection mySqlConnection = new SqlConnection();

mySqlConnection.ConnectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";

注意:只能在关闭Connection对象时设置ConnectionString属性。

打开和关闭数据库连接

生成Connection对象并将其设置ConnectionString属性设置为数据库连接的相应细节之后,就可以打开数据库连接。为此可以调用Connection对象的Open()方法。其方法如下:

mySqlConnection.Open();

完成数据库的连接之后,我们可以调用Connection对象的Close()方法关闭数据库连接。例如:

mySqlConnection.Close();

下面是一个显示如何用SqlConnection对象连接Sql Server Northwind数据库的实例程序,并且显示该SqlConnection对象的一些属性。

范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page

02 {

03 protected void Page_Load(object sender, EventArgs e)

04 {

05 //建立数据库连接字符串

06 string connectionString = "server=localhost;database=Northwind;

07 integrated security=SSPI";

08 //将连接字符串传入SqlConnection对象的构造函数中

09 SqlConnection mySqlConnection = new SqlConnection(connectionString);

10 try

11 {

12 //打开连接

13 mySqlConnection.Open();

14 //利用label控件显示mySqlConnection对象的ConnectionString属性

15 lblInfo.Text = "<b>mySqlConnection对象的ConnectionString属性为:<b>" +

16 mySqlConnection.ConnectionString + "<br>";

17 lblInfo.Text += "<b>mySqlConnection对象的ConnectionTimeout属性为<b>" +

18 mySqlConnection.ConnectionTimeout + "<br>";

19 lblInfo.Text += "<b>mySqlConnection对象的Database属性为<b>" +

20 mySqlConnection.Database + "<br>";

21 lblInfo.Text += "<b>mySqlConnection对象的DataSource属性为<b>" +

22 mySqlConnection.DataSource + "<br>";

23 lblInfo.Text += "<b>mySqlConnection对象的PacketSize属性为<b>" +

24 mySqlConnection.PacketSize + "<br>";

25 lblInfo.Text += "<b>mySqlConnection对象的ServerVersion属性为<b>" +

26 mySqlConnection.ServerVersion + "<br>";

27 lblInfo.Text += "<b>mySqlConnection对象的当前状态为<b>" +

28 mySqlConnection.State + "<br>";

29 }

30 catch (Exception err)

31 {

32 lblInfo.Text = "读取数据库出错";

33 lblInfo.Text += err.Message;

34 }

35 finally

36 {

37 //关闭与数据库的连接

38 mySqlConnection.Close();

39 lblInfo.Text += "<br><b>关闭连接后的mySqlConnection对象的状态为:</b>";

40 lblInfo.Text += mySqlConnection.State.ToString();

41 }

42 }

43 }

程序代码说明:在上述范例的程序代码中,我们利用try catch finally对数据库连接进行异常处理。当无法连接数据库时将抛出异常,并显示出错信息,见catch代码块所示。在此程序中,无论是否发生异常,都可以通过finally区块关闭数据库的连接,从而节省计算机资源,提高了程序的效率和可扩展性。

执行结果:

当然,我们还可以采用一种更加简便的方法来实现上述程序的功能。这就是将SqlConnection对象包含到using区块中,这样程序会自动调用Dispose()方法释放SqlConnection对象所占用的系统资源,无需再使用SqlConnection对象的Close()方法。

范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page

02 {

03 protected void Page_Load(object sender, EventArgs e)

04 {

05 string connectionString = "server=localhost;database=Northwind;

06 integrated security=SSPI";

07 SqlConnection mySqlConnection = new SqlConnection(connectionString);

08 using (mySqlConnection)

09 {

10 mySqlConnection.Open();

11 lblInfo.Text = "<b>mySqlConnection对象的ConnectionString属性为:<b>" +

12 mySqlConnection.ConnectionString + "<br>";

13 lblInfo.Text += "<b>mySqlConnection对象的ConnectionTimeout属性为<b>" +

14 mySqlConnection.ConnectionTimeout + "<br>";

15 lblInfo.Text += "<b>mySqlConnection对象的Database属性为<b>" +

16 mySqlConnection.Database + "<br>";

17 lblInfo.Text += "<b>mySqlConnection对象的DataSource属性为<b>" +

18 mySqlConnection.DataSource + "<br>";

19 lblInfo.Text += "<b>mySqlConnection对象的PacketSize属性为<b>" +

20 mySqlConnection.PacketSize + "<br>";

21 lblInfo.Text += "<b>mySqlConnection对象的ServerVersion属性为<b>" +

22 mySqlConnection.ServerVersion + "<br>";

23 lblInfo.Text += "<b>mySqlConnection对象的当前状态为<b>"+

24 mySqlConnection.State + "<br>";

25 }

26 lblInfo.Text += "<br><b>关闭连接后的mySqlConnection对象的状态为:</b>";

27 lblInfo.Text += mySqlConnection.State.ToString();

28 }

29 }

程序代码说明:在上述范例的程序代码中,采用using(mySqlConnection)的形式使得代码更加简洁,并且其最大的优点就是无需编写finally区块代码,可以自动关闭与数据库的连接。

连接池

打开与关闭数据库都是比较耗时的。为此,ADO.NET自动将数据库连接存放在连接池中。连接池可以大幅度提高程序的性能和效率,因为我们不必等待建立全新的数据库连接过程,而是直接利用现成的数据库连接。注意,利用Close()方法关闭连接时,并不是实际关闭连接,而是将连接标为未用,放在连接池中,准备下一次复用。

如果在连接字符串中提供相同的细节,即相同的数据库,用户名,密码等等,则可以直接取得并返回池中的连接。然后可以用这个连接访问数据库。

使用SqlConnection对象时,可以在连接字符串中指定max pool size,表示连接池允许的最大连接数(默认为100),也可以指定min pool size表示连接池允许的最小连接数(默认为0)。下面的代码指定了SqlConnection对象的max pool size为10,min pool size为5。

SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Northwind;

integrated security=SSPI;"+"max pool size=10;min pool size=5");

程序代码说明:在上述范例的程序代码中,程序最初在池中生成5个SqlConnection对象。池中可以存储最多10个SqlConnection对象。如果要打开新的SqlConnection对象时,池中的对象全部都在使用中,则请求要等待一个SqlConnection对象关闭,然后才可以使用新的SqlConnection对象。如果请求等待时间超过ConnectionTimeout属性指定的秒数,则会抛出异常。

下面通过一个程序来显示连接池的性能优势。在应用此程序过程我们要先引用System.Data.SqlClinet和System.Text命名空间。

范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page

02 {

03 protected void Page_Load(object sender, EventArgs e)

04 {

05 //设置连接池的最大连接数为5,最小为1

06 SqlConnection mySqlConnection =new SqlConnection(

07 "server=localhost;database=Northwind;integrated security=SSPI;"+

08 "max pool size=5;min pool size=1");

09 //新建一个StringBuilder对象

10 StringBuilder htmStr = new StringBuilder("");

11 for (int count = 1; count <= 5; count++)

12 {

13 //使用Append()方法追加字符串到StringBuilder对象的结尾处

14 htmStr.Append("连接对象 "+count);

15 htmStr.Append("<br>");

16 //设置一个连接的开始时间

17 DateTime start = DateTime.Now;

18 mySqlConnection.Open();

19 //连接所用的时间

20 TimeSpan timeTaken = DateTime.Now - start;

21 htmStr.Append("连接时间为 "+timeTaken.Milliseconds+"毫秒");

22 htmStr.Append("<br>");

23 htmStr.Append("mySqlConnection对象的状态为" + mySqlConnection.State);

24 htmStr.Append("<br>");

25 mySqlConnection.Close();

26 }

27 //将StringBuilder对象的包含的字符串在label控件中显示出来

28 lblInfo.Text = htmStr.ToString();

29 }

30 }

程序代码说明:在上述范例的程序代码中,我们将在连接池中重复5次打开一个SqlConnection对象,DateTime.Now表示当前的时间。timeTaken表示从连接开始到打开连接所用的时间间隔。可以看出,打开第一个连接的时间比打开后续连接的时间要长,因为第一个连接要实际连接数据库。被关闭之后,这个连接存放在连接池中。再次打开连接时,只要从池中直接读取即可,速度非常快。

提示:String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。

在ASP.NET 2.0中,使用了一种在运行时解析为连接字符串值的新的声明性表达式语法,按名称引用数据库连接字符串。连接字符串本身存储在 Web.config 文件中的 <connectionStrings>配置节下面,以便易于在单个位置为应用程序中的所有页进行维护。

范例程序代码如下:

<?xml version="1.0"?>

<configuration>

<connectionStrings>

<add name="Pubs" connectionString="Server=localhost;

Integrated Security=True;Database=pubs;Persist Security Info=True"

providerName="System.Data.SqlClient" />

<add name="Northwind" connectionString="Server=localhost;

Integrated Security=True;Database=Northwind;Persist Security Info=True"

providerName="System.Data.SqlClient" />

</connectionStrings>

<system.web>

<pages styleSheetTheme="Default"/>

</system.web>

</configuration>

程序代码说明:在上述范例的程序代码中,我们在Web.Config文件中的<connectionStrings>配置节点下面设置了两个数据库连接字符串,分别指向pubs和Northwind两个示例数据库。注意,在2.0中引进了数据源控件,例如SqlDataSource 控件,我们可以将SqlDataSource 控件的 ConnectionString 属性被设置为表达式 <%$ ConnectionStrings:Pubs %>,该表达式在运行时由 ASP.NET 分析器解析为连接字符串。还可以为SqlDataSource 的 ProviderName 属性指定一个表达式,例如 <%$ ConnectionStrings:Pubs.ProviderName %>。其具体的用法和新特征将在以后的章节进行详细的介绍。现在有个基础的了解即可。

当然,我们也可以用下面的方式从配置文件直接读取数据库连接字符串。首先我们需要引用using System.Web.Configuration命名空间,该命名空间包含用于设置 ASP.NET 配置的类。

string connectionString =ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

程序代码说明:在上述范例的程序代码中,我们可以利用ConnectionStrings["Northwind"]读取相应的Northwind字符串。同理以可以利用ConnectionStrings["Pubs"]读取相应的Pubs字符串。

———————————————————————————————————————————————

首先你应该区分Windows验证与Sql自身的验证的区别。 
  Windows验证就是SqlServer服务器使用Windows自带的验证系统,如果你指定SqlServer内Windows的一个组有访问的权限,那么加入此组的Windows用户都有访问数据库的权限。此验证有个缺点,就是如果不是在域模式下,无法加入远程计算机的用户,所以如果使用C/S方式写程序的话,使用Windows验证无法使本地计算机的Windows帐户访问远程数据库服务器。 
  
  Sql验证就简单多了,就是使用sqlserver的企业管理器中自己定义由Sql控制的用户,指定用户权限等。这个帐户信息是由SqlServer自己维护的,所以SqlServer更换计算机后信息不会丢失,不用重新设定。 
  
  所以如果你的项目使用在一个比较大的网络中,而且对安全要求比较高,那么应该建立域,使用Windows验证,而且要与系统管理员配合详细设定可以访问SqlServer的Windows帐户。如果使用一个小网络,而且此网络仅用来使用项目,对安全没有高要求,那么使用SqlServer验证,而且更新,升级等都方便。 
  
  Windows验证与SqlServer验证的数据库联接字符串是不同的。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
win11无法连接局域网打印机,应该如何解决?win11无法连接局域网打印机,应该如何解决?Jul 01, 2023 am 08:57 AM

win11无法连接局域网打印机怎么办?有不少用户的win11系统在使用局域网打印机功能的时候,无法正常连接到共享打印机,出现这个问题,可能是连接步骤或者是某项功能服务没打开。今天小编就给大家带来了多种解决方法,很多小伙伴不知道怎么详细操作,小编下面整理了win11电脑不能连共享打印机解决技巧,如果你感兴趣的话,跟着小编一起往下看看吧!win11电脑不能连共享打印机解决技巧1、首先,按键盘上的Win+X组合键,或右键点击任务栏上的Windows开始图标,在打开的隐藏菜单项中,选择运行;2、运行窗口

使用PHP连接MariaDB数据库使用PHP连接MariaDB数据库May 17, 2023 am 08:24 AM

MariaDB是一种开源的关系型数据库管理系统,它是MySQL的一个分支。PHP作为一种开源的服务器端脚本语言,被广泛应用于Web开发中。在很多Web开发项目中,需要使用PHP连接到MariaDB数据库,以便在Web应用程序中存储和检索数据。这篇文章将介绍如何使用PHP编写代码来连接MariaDB数据库。一、安装MariaDB服务器在使用PHP连接Maria

PHP8.0中的连接多个任务库PHP8.0中的连接多个任务库May 14, 2023 am 09:01 AM

随着现代程序开发的不断发展,软件项目往往需要同时使用多个任务库来处理不同的任务。PHP语言一直是Web开发的重要工具,其在7.0版本中引入了新的并发处理特性,使得PHP在处理任务库时更加高效、灵活。在8.0版本中,PHP又新增了对连接多个任务库的支持,这为我们在处理大量数据和并发请求时提供了极大的便利。在本文中,我们将探讨PHP8.0中连接多个任务库的方法和

如何解决MySQL连接错误1203?如何解决MySQL连接错误1203?Jun 30, 2023 am 11:33 AM

MySQL连接错误1203,如何解决?MySQL是一种广泛使用的关系型数据库管理系统,但是在使用MySQL时,一些连接错误可能会出现。其中一个常见的错误是错误代码1203,它表示数据库连接已中断。在遇到这个错误时,可以采取一些措施来解决问题。首先,我们需要确定错误1203的确切原因。这个错误通常是由于连接超时或连接过多引起的。连接超时可能是由于数据库服务器负

Python连接阿里云接口,实现邮件发送功能Python连接阿里云接口,实现邮件发送功能Jul 05, 2023 pm 04:33 PM

Python连接阿里云接口,实现邮件发送功能阿里云提供了一系列的服务接口,其中包括了邮件发送服务。通过Python脚本连接阿里云接口,我们可以实现邮件的快速发送。本篇文章将向您展示如何使用Python脚本连接阿里云接口,并实现邮件发送功能。首先,我们需要在阿里云上申请邮件发送服务,获取相应的接口信息。在阿里云管理控制台中,选择邮件推送服务,然后创建一个新的邮

Java优化MySQL连接:提升写入及并发性能Java优化MySQL连接:提升写入及并发性能Jun 29, 2023 pm 10:18 PM

如何在Java程序中优化MySQL连接的写入性能和并发性能?在开发Java程序时,我们经常需要使用到数据库,而MySQL作为一种常见的数据库管理系统,其连接的写入性能和并发性能是我们需要关注的重点。本文将介绍如何在Java程序中优化MySQL连接的写入性能和并发性能,以提升程序的效率。使用连接池管理连接:连接池可以管理数据库连接的创建、销毁和复用,避免频繁地

Java连接数据库的SQLException异常常见原因是什么?Java连接数据库的SQLException异常常见原因是什么?Jun 24, 2023 pm 11:21 PM

Java连接数据库的SQLException异常常见原因是什么?在Java开发中,Database操作是非常关键的一环。其中,对于常用的CRUD操作,特别是SELECT和INSERT操作,都需要使用到JDBC来实现。但是,在JDBC应用开发中,与数据库的连接操作、SQL语言的执行过程、以及结果集的处理等阶段,可能会发生SQLException异常。本文将分析

如何解决MySQL连接错误1062?如何解决MySQL连接错误1062?Jun 30, 2023 pm 05:00 PM

MySQL连接错误1062,如何解决?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种软件开发和数据存储场景中。在使用MySQL的过程中,我们有时会遇到各种错误,其中一个常见的错误是连接错误1062。本文将介绍这个错误的原因以及解决方法。首先,我们需要了解连接错误1062的含义。连接错误1062通常意味着在执行插入操作时,违反了表的唯一约束条件。在

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!