text:
Để thực hiện các lệnh đến cơ sở dữ liệu, chúng ta cần mở một kết nối và một đối tượng để thực hiện lệnh (command object). Phần 1 chúng ta đã tìm hiểu cách mở một kết nối, trong phần này chúng ta sẽ tìm hiểu cách tạo và dùng đối tượng lệnh và cũng lưu ý phần này chỉ đề cập đến provider là SQL Server.
Đối tượng DbCommand
Chúng ta dùng đối tượng DbCommand để gửi các lệnh truy vấn SQL đến data store. DbCommand có thể là một lệnh DML (Data Manipulation Language) để thêm, xoá, sửa dữ liệu; có thể là một lệnh DDL (Data Definition Language) cho phép tạo các bảng hay chỉnh sửa thông tin lược đồ (schema) của database.
DbCommand yêu cầu mở một kết nối với đối tượng DbConnection trước khi gửi lệnh đến data store. Đối tượng DbConnection có thể:
- Chuyển vào hàm constructor của đối tượng DbCommand (xem trong sides);
- Gán đến thuộc tính Connection của đối tượng DbCommand (xem trong slides);
- Dùng phương thức CreateCommand của đối tượng DbConnection.
DbCommand cũng yêu cầu giá trị hợp lệ cho các thuộc tính CommandText và CommandType tương ứng như sau:
Ví dụ 1: tạo một kết nối và một lệnh là một thủ tục lưu trú (stored procedure) tên ABC
Mã VB:
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "ABC" …………
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(nw.ConnectionString); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "ABC"; ……….
Ví dụ 2: tạo một kết nối và một lệnh là một chuỗi lệnh SQL
Mã VB:
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "Select * from Student" …………
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(nw.ConnectionString); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = " Select * from Student "; ……….
Đối tượng DbParameter
Thủ tục lưu trú hay chuỗi lệnh SQL thường yêu cầu chuyển các giá trị tham số đến chúng để thực thi, ví dụ thủ tục hay chuỗi lệnh yêu cầu ID của một sinh viên để lấy thông tin về sinh viên đó. Để thực hiện điều này, chúng ta sẽ tạo một đối tượng System.Data.Common.DbParameter bằng cách dùng phương thức Parameters.Add của đối tương DbCommand như minh hoạ yêu cầu một tham số tên Id và được gán giá trị là 004 sau:
Mã VB
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "ABC" Dim parm = cmd.CreateParameter() parm.ParameterName = "@Id" parm.Value = "004" cmd.Parameters.Add(parm) Dim id = cmd.Parameters("@Id").Value
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "ABC"; DbParameter parm = cmd.CreateParameter(); parm.ParameterName = "@Id"; parm.Value = "004"; cmd.Parameters.Add(parm); var id = (string)cmd.Parameters["@Id"].Value;
Phương thức ExecuteNonQuery
Chúng ta dùng phương thức ExecuteNonQuery chỉ khi không cần kết quả trả về là một hay nhiều hàng, ExecuteNonQuery chỉ trả về một số nguyên là số hàng bị ảnh hưởng bởi lệnh.
Phương thức ExecuteReader
Trả về một đối tượng DbDataReader (sẽ tìm hiểu phần sau).
Phương thức ExecuteScalar
Thực hiện truy vấn và trả về cột đầu tiên ở hàng đầu tiên trong tập kết quả được trả về bởi truy vấn. ExecuteScalar nhận một giá trị đơn từ cơ sở dữ liệu nên sử dụng ít tài nguyên và khả năng thực thi tốt hơn dùng phương thứ ExecuteReader.
Đối tượng DbDataReader
Đối tượng DbDataReader cung cấp một phương thức hiệu quả cao để nhận dữ liệu từ data store; là một lựa chọn tốt cho ListBox hay DropDownList. Đối tượng DbDataReader là tốt nếu chúng ta muốn nhận dữ liệu từ data store nhưng sẽ không hiệu quả nếu chúng ta muốn chỉnh sửa thông tin và cập nhật trở lại data store – lúc này nên dùng DbDataAdapter (tìm hiểu phần sau).
Đối tượng DbDataReader dùng phương thức Read để nhận dữ liệu từ data store và chứa trong vùng đệm (buffer) của nó. Chỉ một hàng được đọc tại một thời điểm, điều này có nghĩa rằng dữ liệu từ data store không cần phải được đọc toàn bộ vào trong ứng dụng trước khi nó được xử lý.
Dùng MARS (Mutiple Active Result Sets) để thực thi nhiều lệnh trong cùng một kết nối
Dùng đối tượng DbDataReader là phương pháp hiệu quả nhất để nhận dữ liệu từ data store nhưng khi thực hiện một lệnh nó sẽ duy trì trạng kết nối đến data store cho đến khi lệnh hoàn tất. Nếu lệnh thứ nhất chưa hoàn tất và chúng ta thực hiện lệnh thứ hai thì một ngoại lệ (InvalidOperatonException) sẽ phát sinh.
Một giải pháp là cho phép thực hiện nhiều lệnh với MARS bằng cách thiết lập giá trị true cho tuỳ chọn MultipleActiveResultSets trong chuỗi kết nối. Khai báo một chuỗi kết nối mới tên nwMars trong tập tin cấu hình như ví dụ sau:
<configuration> <connectionStrings> <clear/> <add Name="nw" providerName = " System.Data.SqlClient " connectionString = "Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Student.MDF; Integrated Security=True; User Instance=True; " /> <add Name="nwMars" providerName = " System.Data.SqlClient " connectionString = "Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Student.MDF; Integrated Security=True; User Instance=True; MultipleActiveResultSets =True" /> </connectionStrings> .... </configuration>
Tiện ích của MARS:
- Giúp việc lập trình dễ dàng hơn bằng cách tạo ra một kết nối cho mỗi lệnh. Tuy nhiên, MARS có thể phát sinh những ảnh hưởng tiêu cực (do cho phép nhiều lệnh đồng thời) do đó nên tắt MARS (thiết lập giá trị false cho tuỳ chọn MultipleActiveResultSets) nếu không cần thiết.
- Có thể tiết kiệm kinh phí do không lệ thuộc vào số lượng kết nối của khách hàng đến database (có thể thực hiện nhiều lệnh cho một kết nối).
Xét ví dụ dùng MARS như sau:
Mã VB
Dim nw = ConfigurationManager.ConnectionStrings("nwMars") Using connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" connection.Open() Dim rdr = cmd.ExecuteReader() While rdr.Read() Dim OrdersCmd = connection.CreateCommand() OrdersCmd.CommandType = CommandType.Text OrdersCmd.CommandText = _ "SELECT COUNT(OrderID) FROM Orders WHERE (CustomerID = @CustId)" Dim parm = OrdersCmd.CreateParameter() parm.ParameterName = "@CustId" parm.Value = rdr("CustomerID") OrdersCmd.Parameters.Add(parm) Dim qtyOrders = OrdersCmd.ExecuteScalar() MessageBox.Show( _ rdr("CompanyName").ToString() + ": " + qtyOrders.ToString()) End While End Using
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nwMars"]; using(var connection = new SqlConnection()) { connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; connection.Open(); var rdr = cmd.ExecuteReader(); while (rdr.Read()) { var ordersCmd = connection.CreateCommand(); ordersCmd.CommandType = CommandType.Text; ordersCmd.CommandText = "SELECT COUNT(OrderID) FROM Orders WHERE (CustomerID = @CustId)"; var parm = ordersCmd.CreateParameter(); parm.ParameterName = "@CustId"; parm.Value = rdr["CustomerID"]; ordersCmd.Parameters.Add(parm); var qtyOrders = ordersCmd.ExecuteScalar(); MessageBox.Show(rdr["CompanyName"].ToString() + ": " + qtyOrders.ToString()); } }
Sao chép số lượng lớn dữ liệu với đối tượng SqlBulkCopy
SQL Server hỗ trợ nhiều phương tiện để thực hiện việc copy dữ liệu từ database đến vị trí khác như SQL Server Enterprise Manager (giao diện đồ hoạ) hay SQL Server Bulk Copy Program (tập tin BCP.exe) (giao diện dòng lệnh). Chúng ta cũng có thể viết riêng chương trình copy dữ liệu cho riêng mình với lớp SqlBulkCopy.
Lớp SqlBulkCopy cung cấp phương thức WriteToServer để copy dữ liệu đến một bảng trong cơ sở dữ liệu trong SQL Server và tuỳ vào nguồn (DataRow, DataTable,…) mà chúng ta quá tải (overload) phương thức WriteToServer cho phù hợp. Hình ảnh minh hoạ về SqlBulkCopy và WriteToServer như sau:
Xem ví dụ minh hoạ copy dữ liệu từ bảng Customer trong cơ sở dữ liệu Northwind đến bảng CustomerList trong cơ sở dữ liệu SQL Server tên là BulkCopy:
Mã VB
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim nwConnection = New SqlConnection() nwConnection.ConnectionString = nw.ConnectionString Dim bulkCopy = ConfigurationManager.ConnectionStrings("BulkCopy") Dim bulkConnection = New SqlConnection() bulkConnection.ConnectionString = bulkCopy.ConnectionString Dim cmd = nwConnection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" nwConnection.Open() bulkConnection.Open() Dim rdr = cmd.ExecuteReader() Dim bc As New SqlBulkCopy(bulkConnection) bc.DestinationTableName = "StoreList" bc.WriteToServer(rdr) nwConnection.Close() bulkConnection.Close() MessageBox.Show("Done with bulk copy")
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var nwConnection = new SqlConnection(); nwConnection.ConnectionString = nw.ConnectionString; var bulkCopy = ConfigurationManager.ConnectionStrings["BulkCopy"]; var bulkConnection = new SqlConnection(); bulkConnection.ConnectionString = bulkCopy.ConnectionString; var cmd = nwConnection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; nwConnection.Open(); bulkConnection.Open(); var rdr = cmd.ExecuteReader(); var bc = new SqlBulkCopy(bulkConnection); bc.DestinationTableName = "CustomerList"; bc.WriteToServer(rdr); nwConnection.Close(); bulkConnection.Close(); MessageBox.Show("Done with bulk copy");
Đối tượng DbDataAdapter
Chúng ta dùng đối tượng DbDataAdapter để nhận và cập nhật dữ liệu giữa một bảng dữ liệu và database. Như những đối tượng khác ở trên (DbConnection, DbCommand,…), DbDataAdapter thừa kế từ lớp cơ sở DataAdapter và mỗi nhà cung cấp sẽ có một lớp DbDataAdapter được thừa kế tương ứng như hình sau:
Khi cần nhận dữ liệu, DbDataAdapter dùng thuộc tính SelectCommand; khi cần cập nhật dữ liệu trở lại database, DbDataAdapter dùng các thuộc tính InsertCommand, UpdateCommand, và DeleteCommand.
Trước khi nhận hay cập nhật dữ liệu, DbDataAdapter sẽ kiểm tra trạng thái kết nối. Nếu kết nếu mở, DbDataAdapter sẽ dùng nó, nếu kết nối bị đóng thì DbDataAdapter sẽ mở kết nối, sử dụng nó, và sẽ đóng kết nối một cách tự động.
Phương thức Fill
Chuyển dữ liệu từ database đến đối tượng DataTable mà chúng ta chuyển vào phương thức Fill như tham số. Có nhiều phiên bản phương thức Fill (quá tải), có phương thức Fill chỉ nhận duy nhất một tham số là một đối tượng DataSet. Trong trường hợp một DataSet được chuyển tới Fill, một đối tượng DataTable mới sẽ được tạo. Xem ví dụ minh hoạ dùng Fill:
Mã VB
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = CType(connection.CreateCommand(), SqlCommand) cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" Dim nwSet As New DataSet("nw") Dim da As New SqlDataAdapter(cmd) da.Fill(nwSet, "Customers") MessageBox.Show("DataSet Filled")
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = (SqlCommand)connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; var da = new SqlDataAdapter(cmd); var nwSet = new DataSet("nw"); da.Fill(nwSet, "Customers"); MessageBox.Show("DataSet Filled");
Nếu chúng ta cần lưu trữ dữ liệu thay đổi, cân nhắc sử dụng mỗi DbDataAdapter cho mỗi bảng dữ liệu (thay vì dùng một DbDataAdapter), như minh hoạ hình dưới dùng hai DbDataAdapter cho hai bảng là Customers và Sales:
Phương thức Update
Update lưu các thay đổi từ bảng dữ liệu và sẽ gửi trở lại database. Để phương thức Update làm việc, cần một trong hai điều kiện sau:
- Tất cả các thuộc tính SelectCommand, UpdateCommand, InsertCommand, và DeleteCommand phải được gán đến đối tượng DbDataAdapter.
- Dùng đối tượng DbCommandBuilder để tạo các thuộc tính SelectCommand, UpdateCommand, InsertCommand, và DeleteCommand.
Xem đoạn mã minh hoạ cập nhật dữ liệu đến database và hiển thị trên DataGridView:
Mã VB
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT * FROM Customers" Dim nwSet As New DataSet("nw") Dim da As New SqlDataAdapter(cmd) Dim bldr As New SqlCommandBuilder(da) da.Fill(nwSet, "Customers") 'Chỉnh sửa hàng ************************** Dim customersTable = nwSet.Tables("Customers") Dim updRow = customersTable.Select("CustomerID='WOLZA'")(0) updRow("CompanyName") = "New Wolza Company" 'Thêm hàng mới********************************* customersTable.Rows.Add( _ "AAAAA", "Five A Company") 'Xoá một hàng, lưu ý ràng buộc************************* Dim delRow = customersTable.Select("CustomerID='PARIS'")(0) delRow.Delete() 'Cập nhật thay đổi đến dataase ******************** da.Update(nwSet, "Customers") 'Hiển thị ra DataGridView ******************** DataGridView2.DataSource = nwSet DataGridView2.DataMember = "Customers" MessageBox.Show("Update Complete")
Mã C#
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Customers"; var da = new SqlDataAdapter(cmd); var nwSet = new DataSet("nw"); var bldr = new SqlCommandBuilder(da); da.Fill(nwSet, "Customers"); //Chỉnh sửa hàng ************************** var customersTable = nwSet.Tables["Customers"]; var updRow = customersTable.Select("CustomerID='WOLZA'")[0]; updRow["CompanyName"] = "New Wolza Company"; //Thêm hàng mới********************************* customersTable.Rows.Add( "AAAAA", "Five A Company"); //Xoá một hàng, lưu ý ràng buộc************************* var delRow = customersTable.Select("CustomerID='PARIS'")[0]; delRow.Delete(); //Cập nhật thay đổi đến dataase ******************** da.Update(nwSet, "Customers"); 'Hiển thị ra DataGridView ******************** dataGridView2.DataSource = nwSet; dataGridView2.DataMember = "Customers"; MessageBox.Show("Update Complete");
Cập nhật dữ liệu đến database theo lô (batches)
Phương thức Update chúng ta đã đề cập ở trên áp dụng nguyên tắc cập nhật dữ liệu theo từng hàng. Một giải pháp khác là áp dụng cập nhật theo lô (batches) – hay nhiều hàng một lúc. Để áp dụng cập nhật theo lô, chúng ta thiết lập một giá trị đến thuộc tính UpdateBatchSize của đối tượng DbDataAdapter. Mặc định, giá trị của UpdateBatchSize là 1 (cập nhật từng hàng một). Ví dụ bảng Customers chứa 91 hàng, thuộc tính UpdateBatchSize = 40 thì khi phương thức Update thực thi, thay đổi được gửi đến database theo 3 lô: lô 1 gồm 40 thay đổi, lô 2 gồm 40 thay đổi, và lô 3 gồm 11 thay đổi. Minh hoạ mã VB và C#:
Mã VB
Private WithEvents da As New SqlDataAdapter() Private sb as New System.Text.StringBuilder() private sub rowUpdated(byval sender as Object, _ byval e as SqlRowUpdatedEventArgs) handles da.RowUpdated sb.Append("Rows: " & e.RecordsAffected.ToString() & vbCrLf) End Sub Private Sub menuUpdateBatch_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles UpdateBatchToolStripMenuItem.Click Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT * FROM Customers" Dim nwSet As New DataSet("nw") da.SelectCommand = cmd Dim bldr As New SqlCommandBuilder(da) da.Fill(nwSet, "Customers") 'chỉnh sửa dữ liệu (viết hoa tên công ty) For Each dr As DataRow In nwSet.Tables("Customers").Rows dr("CompanyName") = dr("CompanyName").ToString().ToUpper() Next sb.Clear() da.UpdateBatchSize = 40 da.Update(nwSet, "Customers") MessageBox.Show(sb.ToString()) End Sub
Mã C#
private SqlDataAdapter da = new SqlDataAdapter(); private System.Text.StringBuilder sb = new System.Text.StringBuilder(); private void rowUpdated(object sender, SqlRowUpdatedEventArgs e ) { sb.Append("Rows: " + e.RecordsAffected.ToString() + "\r\n"); } private void menuUpdateBatch_Click(object sender, EventArgs e) { da.RowUpdated += rowUpdated; var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Customers"; da.SelectCommand = cmd; var nwSet = new DataSet("nw"); var bldr = new SqlCommandBuilder(da); da.Fill(nwSet, "Customers"); <strong> </strong> //chỉnh sửa dữ liệu (viết hoa tên công ty) foreach (DataRow dr in nwSet.Tables["Customers"].Rows) { dr["CompanyName"] = dr["CompanyName"].ToString().ToUpper(); } sb.Clear(); da.UpdateBatchSize = 40; da.Update(nwSet, "Customers"); da.RowUpdated -= rowUpdated; MessageBox.Show(sb.ToString()); }
Các lớp DbProviderFactory
Các ứng dụng có thể được viết độc lập với nhà cung cấp để có thể dễ dàng chuyển đổi giữa các nhà cung cấp (như từ MS Access sang MS SQL Server) hay có thể kết nối dễ dàng với nhiều nguồn dữ liệu của các nhà cung cấp khác nhau. Cách phổ biến thường dùng khi viết chương trình có thể như các đoạn mã sau:
Mã VB:
Public Enum DbProvider SqlClient OleDb Odbc End Enum Public Function GetConnection() As IDbConnection ' lấy thông tin nhà cung cấp từ tập tin cấu hình Dim provider As DbProvider = [Enum].Parse( _ GetType(DbProvider), _ ConfigurationSettings.AppSettings("provider").ToString()) Dim connection As IDbConnection = Nothing Select Case (provider) Case DbProvider.SqlClient connection = New System.Data.SqlClient.SqlConnection() Case DbProvider.OleDb connection = New System.Data.OleDb.OleDbConnection() Case DbProvider.Odbc connection = New System.Data.Odbc.OdbcConnection() Case DbProvider.Oracle connection = New System.Data.OracleClient.OracleConnection() End Select Return connection End Function
Mã C#:
public IDbConnection GetConnection() { // lấy thông tin nhà cung cấp từ tập tin cấu hình DbProvider provider = (DbProvider)Enum.Parse( typeof(DbProvider), (string)ConfigurationManager.AppSettings["provider"]); IDbConnection connection = null; switch (provider) { case DbProvider.SqlClient: connection = new System.Data.SqlClient.SqlConnection(); break; case DbProvider.OleDb: connection = new System.Data.OleDb.OleDbConnection(); break; case DbProvider.Odbc: connection = new System.Data.Odbc.OdbcConnection(); break; case DbProvider.Oracle: connection = new System.Data.OracleClient.OracleConnection(); break; } return connection; } public enum DbProvider { SqlClient, OleDb, Odbc, Oracle };
App.config
<configuration> <appSettings> <add key="provider" value="SqlClient" /> </appSettings> </configuration>
Một số vấn đề:
- Không thể tạo các thể hiện giao diện một cách trực tiếp vì mỗi nhà cung cấp cụ thể có mã để quyết định kiểu kết nối được tạo.
- Các giao diện được định nghĩa bất biến (immutable) nên việc thêm các đặc trưng mới là rất khó khăn.
Giải pháp:
Mỗi nhà cung cấp phải cung cấp một lớp con (subclass) của lớp DbProviderFactory để tạo các thể hiện. Ví dụ, chúng ta có thể dùng lớp SqlClientFactory (thừa kế từ DbProviderFactory) để tạo các thể hiện của bất kỳ lớp nào của nhà cung cấp SQL Server.
Mỗi lớp provider factory (ví dụ SqlClientFactory) sẽ cung cấp một thuộc tính instance cho phép truy cập đến các phương thức và thuộc tính. Ví dụ dùng lớp SqlClientFactory để tạo ra kết nối mới như sau:
Mã VB:
Dim factory As DbProviderFactory = SqlClientFactory.Instance Public Function GetProviderConnection() As DbConnection Dim connection = factory.CreateConnection() connection.ConnectionString = "Data Source=.\SQLEXPRESS;" _ & "AttachDbFilename=|DataDirectory|PUBS.MDF;" _ & "Integrated Security=True;User Instance=True" Return connection End Function
Mã C#:
DbProviderFactory factory = SqlClientFactory.Instance; public DbConnection GetProviderConnection() { var connection = factory.CreateConnection(); connection.ConnectionString = @"Data Source=.\SQLEXPRESS;" + "AttachDbFilename=|DataDirectory|Northwind.MDF;" + "Integrated Security=True;User Instance=True"; return connection; }
Biến factory ở ví dụ trên có thể được dùng để tạo ra các đối tượng SQL Server khác như đoạn mã sau (chú ý SqlDataReader được tạo một cách gián tiếp bằng cách tạo một SQL command và dùng phương thức ExecuteReader):
Mã VB
Private Function GetData(ByVal commandText As String, _ ByVal commandType As CommandType) As DataTable 'get SqlDbCommand Dim command = factory.CreateCommand() command.Connection = GetProviderConnection() If (command.Connection Is Nothing) Then Return Nothing End If command.CommandText = commandText command.CommandType = commandType command.Connection.Open() Dim dataTable = New DataTable() 'Get SqlDataReader and populate data table dataTable.Load(command.ExecuteReader()) command.Connection.Close() Return dataTable End Function
Mã C#
private DataTable GetData(string commandText, CommandType commandType) { //get SqlDbCommand var command = factory.CreateCommand(); command.Connection = GetProviderConnection(); if (command.Connection == null) return null; command.CommandText = commandText; command.CommandType = commandType; command.Connection.Open(); var dataTable = new DataTable(); //Get SqlDataReader and populate data table dataTable.Load(command.ExecuteReader()); command.Connection.Close(); return dataTable; }
Lớp DbException
Các ngoại lệ phát sinh khi từ các provider sẽ được thừa kế từ lớp cơ sở DbException. Khối try/catch sẽ đón bắt DbException thay vì đón bắt các ngoại lệ của từng nhà cung cấp cụ thể.
Ý kiến bài viết

markdown:
Để thực hiện các lệnh đến cơ sở dữ liệu, chúng ta cần mở một kết nối và một đối tượng để thực hiện lệnh (command object).
[Phần 1](https://ngocminhtran.com/2017/02/22/ado-net-connected-classes-phan-1-ket-noi-den-data-store/) chúng ta đã tìm hiểu cách mở một kết nối, trong phần này chúng ta sẽ tìm hiểu cách tạo và dùng đối tượng lệnh và cũng lưu ý phần này chỉ đề cập đến provider là SQL Server. **Đối tượng DbCommand**
Chúng ta dùng đối tượng
**DbCommand** để gửi các lệnh truy vấn SQL đến data store. **DbCommand** có thể là một lệnh **DML** (Data Manipulation Language) để thêm, xoá, sửa dữ liệu; có thể là một lệnh **DDL** (Data Definition Language) cho phép tạo các bảng hay chỉnh sửa thông tin lược đồ (schema) của database. **DbCommand** yêu cầu mở một kết nối với đối tượng **DbConnection** trước khi gửi lệnh đến data store. Đối tượng **DbConnection** có thể:
- Chuyển vào hàm
**constructor**của đối tượng **DbCommand (xem trong** [sides](https://ngocminhtran.com/data-provider/));
- Gán đến thuộc tính
**Connection**của đối tượng **DbCommand (xem trong** [slides](https://ngocminhtran.com/data-provider/));
- Dùng phương thức
**CreateCommand**của đối tượng **DbConnection**. **DbCommand** cũng yêu cầu giá trị hợp lệ cho các thuộc tính **CommandText** và **CommandType** tương ứng như sau:
|
|CommandType |
|CommandText
|StoredProcedure||Tên của một thủ tục lưu trú trong SQL Server|
|TableDirect||Tên của một bảng dữ liệu (chỉ hỗ trợ cho provider OleDb)|
|Text||Một chuỗi lệnh SQL|
**Ví dụ 1**: tạo một kết nối và một lệnh là một thủ tục lưu trú (stored procedure) tên ABC **Mã VB:**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "ABC" …………
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(nw.ConnectionString); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "ABC"; ……….
**Ví dụ 2**: tạo một kết nối và một lệnh là một chuỗi lệnh SQL **Mã VB:**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "Select * from Student" …………
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(nw.ConnectionString); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = " Select * from Student "; ……….
**Đối tượng DbParameter**
Thủ tục lưu trú hay chuỗi lệnh SQL thường yêu cầu chuyển các giá trị tham số đến chúng để thực thi, ví dụ thủ tục hay chuỗi lệnh yêu cầu ID của một sinh viên để lấy thông tin về sinh viên đó. Để thực hiện điều này, chúng ta sẽ tạo một đối tượng
**System.Data.Common.DbParameter** bằng cách dùng phương thức **Parameters.Add** của đối tương **DbCommand** như minh hoạ yêu cầu một tham số tên Id và được gán giá trị là 004 sau: **Mã** **VB**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "ABC" Dim parm = cmd.CreateParameter() parm.ParameterName = "@Id" parm.Value = "004" cmd.Parameters.Add(parm) Dim id = cmd.Parameters("@Id").Value
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "ABC"; DbParameter parm = cmd.CreateParameter(); parm.ParameterName = "@Id"; parm.Value = "004"; cmd.Parameters.Add(parm); var id = (string)cmd.Parameters["@Id"].Value;
**Phương thức ExecuteNonQuery**
Chúng ta dùng phương thức
**ExecuteNonQuery** chỉ khi không cần kết quả trả về là một hay nhiều hàng, **ExecuteNonQuery** chỉ trả về một số nguyên là số hàng bị ảnh hưởng bởi lệnh. **Phương thức ExecuteReader**
Trả về một đối tượng
**DbDataReader** (sẽ tìm hiểu phần sau). **Phương thức ExecuteScalar**
Thực hiện truy vấn và trả về cột đầu tiên ở hàng đầu tiên trong tập kết quả được trả về bởi truy vấn.
**ExecuteScalar** nhận một giá trị đơn từ cơ sở dữ liệu nên sử dụng ít tài nguyên và khả năng thực thi tốt hơn dùng phương thứ **ExecuteReader**. **Đối tượng DbDataReader**
Đối tượng
**DbDataReader** cung cấp một phương thức hiệu quả cao để nhận dữ liệu từ data store; là một lựa chọn tốt cho **ListBox** hay **DropDownList**. Đối tượng **DbDataReader** là tốt nếu chúng ta muốn nhận dữ liệu từ data store nhưng sẽ không hiệu quả nếu chúng ta muốn chỉnh sửa thông tin và cập nhật trở lại data store – lúc này nên dùng **DbDataAdapter** (tìm hiểu phần sau).
Đối tượng
**DbDataReader** dùng phương thức **Read** để nhận dữ liệu từ data store và chứa trong vùng đệm (buffer) của nó. Chỉ một hàng được đọc tại một thời điểm, điều này có nghĩa rằng dữ liệu từ data store không cần phải được đọc toàn bộ vào trong ứng dụng trước khi nó được xử lý. **Dùng MARS (Mutiple Active Result Sets) để thực thi nhiều lệnh trong cùng một kết nối**
Dùng đối tượng
**DbDataReader** là phương pháp hiệu quả nhất để nhận dữ liệu từ data store nhưng khi thực hiện một lệnh nó sẽ duy trì trạng kết nối đến data store cho đến khi lệnh hoàn tất. Nếu lệnh thứ nhất chưa hoàn tất và chúng ta thực hiện lệnh thứ hai thì một ngoại lệ ( **InvalidOperatonException**) sẽ phát sinh.
Một giải pháp là cho phép thực hiện nhiều lệnh với
**MARS** bằng cách thiết lập giá trị ** cho tuỳ chọn true** **MultipleActiveResultSets**trong chuỗi kết nối. Khai báo một chuỗi kết nối mới tên **trong tập tin cấu hình như ví dụ sau:** *nwMars*
<configuration> <connectionStrings> <clear/> <add Name="nw" providerName = " System.Data.SqlClient " connectionString = "Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Student.MDF; Integrated Security=True; User Instance=True; " /> <add Name="nwMars" providerName = " System.Data.SqlClient " connectionString = "Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Student.MDF; Integrated Security=True; User Instance=True; MultipleActiveResultSets =True" /> </connectionStrings> .... </configuration>
**Tiện ích của MARS:**
- Giúp việc lập trình dễ dàng hơn bằng cách tạo ra một kết nối cho mỗi lệnh. Tuy nhiên,
**MARS**có thể phát sinh những ảnh hưởng tiêu cực (do cho phép nhiều lệnh đồng thời) do đó nên tắt **MARS**(thiết lập giá trị **cho tuỳ chọn** *false* **MultipleActiveResultSets**) nếu không cần thiết.
- Có thể tiết kiệm kinh phí do không lệ thuộc vào số lượng kết nối của khách hàng đến database (có thể thực hiện nhiều lệnh cho một kết nối).
Xét ví dụ dùng
**MARS** như sau: **Mã VB**
Dim nw = ConfigurationManager.ConnectionStrings("nwMars") Using connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" connection.Open() Dim rdr = cmd.ExecuteReader() While rdr.Read() Dim OrdersCmd = connection.CreateCommand() OrdersCmd.CommandType = CommandType.Text OrdersCmd.CommandText = _ "SELECT COUNT(OrderID) FROM Orders WHERE (CustomerID = @CustId)" Dim parm = OrdersCmd.CreateParameter() parm.ParameterName = "@CustId" parm.Value = rdr("CustomerID") OrdersCmd.Parameters.Add(parm) Dim qtyOrders = OrdersCmd.ExecuteScalar() MessageBox.Show( _ rdr("CompanyName").ToString() + ": " + qtyOrders.ToString()) End While End Using
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nwMars"]; using(var connection = new SqlConnection()) { connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; connection.Open(); var rdr = cmd.ExecuteReader(); while (rdr.Read()) { var ordersCmd = connection.CreateCommand(); ordersCmd.CommandType = CommandType.Text; ordersCmd.CommandText = "SELECT COUNT(OrderID) FROM Orders WHERE (CustomerID = @CustId)"; var parm = ordersCmd.CreateParameter(); parm.ParameterName = "@CustId"; parm.Value = rdr["CustomerID"]; ordersCmd.Parameters.Add(parm); var qtyOrders = ordersCmd.ExecuteScalar(); MessageBox.Show(rdr["CompanyName"].ToString() + ": " + qtyOrders.ToString()); } }
**Sao chép số lượng lớn dữ liệu với đối tượng SqlBulkCopy**
SQL Server hỗ trợ nhiều phương tiện để thực hiện việc copy dữ liệu từ database đến vị trí khác như
**SQL Server Enterprise Manager** (giao diện đồ hoạ) hay **SQL Server Bulk Copy Program **(tập tin **BCP.exe**) (giao diện dòng lệnh). Chúng ta cũng có thể viết riêng chương trình copy dữ liệu cho riêng mình với lớp **SqlBulkCopy**.
Lớp
**SqlBulkCopy** cung cấp phương thức **WriteToServer** để copy dữ liệu đến một bảng trong cơ sở dữ liệu trong **SQL Server** và tuỳ vào nguồn ( **DataRow**, **DataTable**,…) mà chúng ta quá tải (overload) phương thức **WriteToServer** cho phù hợp. Hình ảnh minh hoạ về **SqlBulkCopy** và **WriteToServer** như sau:
Xem ví dụ minh hoạ copy dữ liệu từ bảng
**Customer** trong cơ sở dữ liệu **Northwind** đến bảng **CustomerList** trong cơ sở dữ liệu **SQL Server** tên là **BulkCopy**: **Mã VB**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim nwConnection = New SqlConnection() nwConnection.ConnectionString = nw.ConnectionString Dim bulkCopy = ConfigurationManager.ConnectionStrings("BulkCopy") Dim bulkConnection = New SqlConnection() bulkConnection.ConnectionString = bulkCopy.ConnectionString Dim cmd = nwConnection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" nwConnection.Open() bulkConnection.Open() Dim rdr = cmd.ExecuteReader() Dim bc As New SqlBulkCopy(bulkConnection) bc.DestinationTableName = "StoreList" bc.WriteToServer(rdr) nwConnection.Close() bulkConnection.Close() MessageBox.Show("Done with bulk copy")
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var nwConnection = new SqlConnection(); nwConnection.ConnectionString = nw.ConnectionString; var bulkCopy = ConfigurationManager.ConnectionStrings["BulkCopy"]; var bulkConnection = new SqlConnection(); bulkConnection.ConnectionString = bulkCopy.ConnectionString; var cmd = nwConnection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; nwConnection.Open(); bulkConnection.Open(); var rdr = cmd.ExecuteReader(); var bc = new SqlBulkCopy(bulkConnection); bc.DestinationTableName = "CustomerList"; bc.WriteToServer(rdr); nwConnection.Close(); bulkConnection.Close(); MessageBox.Show("Done with bulk copy");
**Đối tượng DbDataAdapter**
Chúng ta dùng đối tượng
**DbDataAdapter** để nhận và cập nhật dữ liệu giữa một bảng dữ liệu và database. Như những đối tượng khác ở trên ( **DbConnection**, **DbCommand**,…), **DbDataAdapter** thừa kế từ lớp cơ sở **DataAdapter** và mỗi nhà cung cấp sẽ có một lớp **DbDataAdapter** được thừa kế tương ứng như hình sau:
Khi cần nhận dữ liệu,
**DbDataAdapter** dùng thuộc tính **SelectCommand**; khi cần cập nhật dữ liệu trở lại database, **DbDataAdapter** dùng các thuộc tính **InsertCommand**, **UpdateCommand**, và **DeleteCommand**.
Trước khi nhận hay cập nhật dữ liệu,
**DbDataAdapter** sẽ kiểm tra trạng thái kết nối. Nếu kết nếu mở, **DbDataAdapter** sẽ dùng nó, nếu kết nối bị đóng thì **DbDataAdapter** sẽ mở kết nối, sử dụng nó, và sẽ đóng kết nối một cách tự động. **Phương thức Fill**
Chuyển dữ liệu từ database đến đối tượng
**DataTable** mà chúng ta chuyển vào phương thức **Fill** như tham số. Có nhiều phiên bản phương thức **Fill** (quá tải), có phương thức **Fill** chỉ nhận duy nhất một tham số là một đối tượng **DataSet**. Trong trường hợp một **DataSet** được chuyển tới **Fill**, một đối tượng **DataTable** mới sẽ được tạo. Xem ví dụ minh hoạ dùng **Fill**: **Mã VB**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = CType(connection.CreateCommand(), SqlCommand) cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers" Dim nwSet As New DataSet("nw") Dim da As New SqlDataAdapter(cmd) da.Fill(nwSet, "Customers") MessageBox.Show("DataSet Filled")
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = (SqlCommand)connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"; var da = new SqlDataAdapter(cmd); var nwSet = new DataSet("nw"); da.Fill(nwSet, "Customers"); MessageBox.Show("DataSet Filled");
Nếu chúng ta cần lưu trữ dữ liệu thay đổi, cân nhắc sử dụng mỗi
**DbDataAdapter** cho mỗi bảng dữ liệu (thay vì dùng một **DbDataAdapter**), như minh hoạ hình dưới dùng hai **DbDataAdapter** cho hai bảng là **Customers** và **Sales**: **Phương thức Update** **Update** lưu các thay đổi từ bảng dữ liệu và sẽ gửi trở lại database. Để phương thức **Update** làm việc, cần ** điều kiện sau:một trong hai**
- Tất cả các thuộc tính
**SelectCommand**, **UpdateCommand**, **InsertCommand**, và **DeleteCommand**phải được gán đến đối tượng **DbDataAdapter**.
- Dùng đối tượng
**DbCommandBuilder**để tạo các thuộc tính **SelectCommand**, **UpdateCommand**, **InsertCommand**, và **DeleteCommand**.
Xem đoạn mã minh hoạ cập nhật dữ liệu đến database và hiển thị trên
**DataGridView**: **Mã VB**
Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT * FROM Customers" Dim nwSet As New DataSet("nw") Dim da As New SqlDataAdapter(cmd) Dim bldr As New SqlCommandBuilder(da) da.Fill(nwSet, "Customers") 'Chỉnh sửa hàng ************************** Dim customersTable = nwSet.Tables("Customers") Dim updRow = customersTable.Select("CustomerID='WOLZA'")(0) updRow("CompanyName") = "New Wolza Company" 'Thêm hàng mới********************************* customersTable.Rows.Add( _ "AAAAA", "Five A Company") 'Xoá một hàng, lưu ý ràng buộc************************* Dim delRow = customersTable.Select("CustomerID='PARIS'")(0) delRow.Delete() 'Cập nhật thay đổi đến dataase ******************** da.Update(nwSet, "Customers") 'Hiển thị ra DataGridView ******************** DataGridView2.DataSource = nwSet DataGridView2.DataMember = "Customers" MessageBox.Show("Update Complete")
**Mã C#**
var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Customers"; var da = new SqlDataAdapter(cmd); var nwSet = new DataSet("nw"); var bldr = new SqlCommandBuilder(da); da.Fill(nwSet, "Customers"); //Chỉnh sửa hàng ************************** var customersTable = nwSet.Tables["Customers"]; var updRow = customersTable.Select("CustomerID='WOLZA'")[0]; updRow["CompanyName"] = "New Wolza Company"; //Thêm hàng mới********************************* customersTable.Rows.Add( "AAAAA", "Five A Company"); //Xoá một hàng, lưu ý ràng buộc************************* var delRow = customersTable.Select("CustomerID='PARIS'")[0]; delRow.Delete(); //Cập nhật thay đổi đến dataase ******************** da.Update(nwSet, "Customers"); 'Hiển thị ra DataGridView ******************** dataGridView2.DataSource = nwSet; dataGridView2.DataMember = "Customers"; MessageBox.Show("Update Complete");
**Cập nhật dữ liệu đến database theo lô (batches)**
Phương thức
**Update** chúng ta đã đề cập ở trên áp dụng nguyên tắc cập nhật dữ liệu theo từng hàng. Một giải pháp khác là áp dụng cập nhật theo lô (batches) – hay nhiều hàng một lúc. Để áp dụng cập nhật theo lô, chúng ta thiết lập một giá trị đến thuộc tính **UpdateBatchSize** của đối tượng **DbDataAdapter**. Mặc định, giá trị của **UpdateBatchSize** là 1 (cập nhật từng hàng một). Ví dụ bảng **Customers** chứa 91 hàng, thuộc tính **UpdateBatchSize** = 40 thì khi phương thức **Update** thực thi, thay đổi được gửi đến database theo 3 lô: lô 1 gồm 40 thay đổi, lô 2 gồm 40 thay đổi, và lô 3 gồm 11 thay đổi. Minh hoạ mã VB và C#: **Mã VB**
Private WithEvents da As New SqlDataAdapter() Private sb as New System.Text.StringBuilder() private sub rowUpdated(byval sender as Object, _ byval e as SqlRowUpdatedEventArgs) handles da.RowUpdated sb.Append("Rows: " & e.RecordsAffected.ToString() & vbCrLf) End Sub Private Sub menuUpdateBatch_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles UpdateBatchToolStripMenuItem.Click Dim nw = ConfigurationManager.ConnectionStrings("nw") Dim connection = New SqlConnection() connection.ConnectionString = nw.ConnectionString Dim cmd = connection.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT * FROM Customers" Dim nwSet As New DataSet("nw") da.SelectCommand = cmd Dim bldr As New SqlCommandBuilder(da) da.Fill(nwSet, "Customers") 'chỉnh sửa dữ liệu (viết hoa tên công ty) For Each dr As DataRow In nwSet.Tables("Customers").Rows dr("CompanyName") = dr("CompanyName").ToString().ToUpper() Next sb.Clear() da.UpdateBatchSize = 40 da.Update(nwSet, "Customers") MessageBox.Show(sb.ToString()) End Sub
**Mã C#**
private SqlDataAdapter da = new SqlDataAdapter(); private System.Text.StringBuilder sb = new System.Text.StringBuilder(); private void rowUpdated(object sender, SqlRowUpdatedEventArgs e ) { sb.Append("Rows: " + e.RecordsAffected.ToString() + "\r\n"); } private void menuUpdateBatch_Click(object sender, EventArgs e) { da.RowUpdated += rowUpdated; var nw = ConfigurationManager.ConnectionStrings["nw"]; var connection = new SqlConnection(); connection.ConnectionString = nw.ConnectionString; var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Customers"; da.SelectCommand = cmd; var nwSet = new DataSet("nw"); var bldr = new SqlCommandBuilder(da); da.Fill(nwSet, "Customers"); <strong> </strong> //chỉnh sửa dữ liệu (viết hoa tên công ty) foreach (DataRow dr in nwSet.Tables["Customers"].Rows) { dr["CompanyName"] = dr["CompanyName"].ToString().ToUpper(); } sb.Clear(); da.UpdateBatchSize = 40; da.Update(nwSet, "Customers"); da.RowUpdated -= rowUpdated; MessageBox.Show(sb.ToString()); }
**Các lớp DbProviderFactory**
Các ứng dụng có thể được viết độc lập với nhà cung cấp để có thể dễ dàng chuyển đổi giữa các nhà cung cấp (như từ MS Access sang MS SQL Server) hay có thể kết nối dễ dàng với nhiều nguồn dữ liệu của các nhà cung cấp khác nhau. Cách phổ biến thường dùng khi viết chương trình có thể như các đoạn mã sau:
**Mã VB:**
Public Enum DbProvider SqlClient OleDb Odbc End Enum Public Function GetConnection() As IDbConnection ' lấy thông tin nhà cung cấp từ tập tin cấu hình Dim provider As DbProvider = [Enum].Parse( _ GetType(DbProvider), _ ConfigurationSettings.AppSettings("provider").ToString()) Dim connection As IDbConnection = Nothing Select Case (provider) Case DbProvider.SqlClient connection = New System.Data.SqlClient.SqlConnection() Case DbProvider.OleDb connection = New System.Data.OleDb.OleDbConnection() Case DbProvider.Odbc connection = New System.Data.Odbc.OdbcConnection() Case DbProvider.Oracle connection = New System.Data.OracleClient.OracleConnection() End Select Return connection End Function
**Mã C#:**
public IDbConnection GetConnection() { // lấy thông tin nhà cung cấp từ tập tin cấu hình DbProvider provider = (DbProvider)Enum.Parse( typeof(DbProvider), (string)ConfigurationManager.AppSettings["provider"]); IDbConnection connection = null; switch (provider) { case DbProvider.SqlClient: connection = new System.Data.SqlClient.SqlConnection(); break; case DbProvider.OleDb: connection = new System.Data.OleDb.OleDbConnection(); break; case DbProvider.Odbc: connection = new System.Data.Odbc.OdbcConnection(); break; case DbProvider.Oracle: connection = new System.Data.OracleClient.OracleConnection(); break; } return connection; } public enum DbProvider { SqlClient, OleDb, Odbc, Oracle };
**App.config**
<configuration> <appSettings> <add key="provider" value="SqlClient" /> </appSettings> </configuration>
**Một số vấn đề:**
- Không thể tạo các thể hiện giao diện một cách trực tiếp vì mỗi nhà cung cấp cụ thể có mã để quyết định kiểu kết nối được tạo.
- Các giao diện được định nghĩa bất biến (immutable) nên việc thêm các đặc trưng mới là rất khó khăn.
**Giải pháp:**
Mỗi nhà cung cấp phải cung cấp một lớp con (subclass) của lớp DbProviderFactory để tạo các thể hiện. Ví dụ, chúng ta có thể dùng lớp SqlClientFactory (thừa kế từ DbProviderFactory) để tạo các thể hiện của bất kỳ lớp nào của nhà cung cấp SQL Server.
Mỗi lớp provider factory (ví dụ SqlClientFactory) sẽ cung cấp một thuộc tính instance cho phép truy cập đến các phương thức và thuộc tính. Ví dụ dùng lớp SqlClientFactory để tạo ra kết nối mới như sau:
**Mã VB:**
Dim factory As DbProviderFactory = SqlClientFactory.Instance Public Function GetProviderConnection() As DbConnection Dim connection = factory.CreateConnection() connection.ConnectionString = "Data Source=.\SQLEXPRESS;" _ & "AttachDbFilename=|DataDirectory|PUBS.MDF;" _ & "Integrated Security=True;User Instance=True" Return connection End Function
**Mã C#:**
DbProviderFactory factory = SqlClientFactory.Instance; public DbConnection GetProviderConnection() { var connection = factory.CreateConnection(); connection.ConnectionString = @"Data Source=.\SQLEXPRESS;" + "AttachDbFilename=|DataDirectory|Northwind.MDF;" + "Integrated Security=True;User Instance=True"; return connection; }
Biến factory ở ví dụ trên có thể được dùng để tạo ra các đối tượng SQL Server khác như đoạn mã sau (chú ý SqlDataReader được tạo một cách gián tiếp bằng cách tạo một SQL command và dùng phương thức ExecuteReader):
**Mã VB**
Private Function GetData(ByVal commandText As String, _ ByVal commandType As CommandType) As DataTable 'get SqlDbCommand Dim command = factory.CreateCommand() command.Connection = GetProviderConnection() If (command.Connection Is Nothing) Then Return Nothing End If command.CommandText = commandText command.CommandType = commandType command.Connection.Open() Dim dataTable = New DataTable() 'Get SqlDataReader and populate data table dataTable.Load(command.ExecuteReader()) command.Connection.Close() Return dataTable End Function
**Mã C#**
private DataTable GetData(string commandText, CommandType commandType) { //get SqlDbCommand var command = factory.CreateCommand(); command.Connection = GetProviderConnection(); if (command.Connection == null) return null; command.CommandText = commandText; command.CommandType = commandType; command.Connection.Open(); var dataTable = new DataTable(); //Get SqlDataReader and populate data table dataTable.Load(command.ExecuteReader()); command.Connection.Close(); return dataTable; }
**Lớp DbException**
Các ngoại lệ phát sinh khi từ các provider sẽ được thừa kế từ lớp cơ sở DbException. Khối try/catch sẽ đón bắt DbException thay vì đón bắt các ngoại lệ của từng nhà cung cấp cụ thể.
## Ý kiến bài viết Hủy trả lời

X-ac: 3.dca _dca


text:
Hiện nay có không ít nam giới bị tình trạng bao quy đầu dài, khiến cho quy đầu luôn bị trùm kín, điều này gây […]
Điện thoại: 028 3832 9333
Website: https://phongkhammayo.vn
Email: phongkhamdakhoamayo@gmail.com
Phòng Khám Đa Khoa Mayo tự hào đem đến chất lượng tối đa cho từng bệnh nhân tin tưởng vào dịch vụ hỗ trợ khám chữa các bệnh: Nam Khoa, Phụ Khoa, Bệnh Xã Hội, Bệnh Trĩ, Chỉnh Hình Dương Vật, Thẩm Mỹ Vùng Kín, Phá thai... tại đây.
Yếu tố quyết định đến chất lượng của Mayo chính là đội ngũ Y Bác Sĩ giỏi chuyên môn, giàu kinh nghiệm luôn tâm huyết với nghề. Thêm vào đó, trang thiết bị được nhập khẩu trực tiếp từ những nền y học tiên tiến trên thế giới như Mỹ, EU… áp dụng công nghệ tiên tiến trong hỗ trợ khám chữa bệnh.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: text/html

Server: nginx

Content-Type: text/html; charset=UTF-8

Connection: keep-alive

Vary: Accept-Encoding,User-Agent

X-Crawler-Content-Encoding: gzip


text: ✔ Kính chào Quý khách !!! Trung tâm Sim Số Đẹp được thành lập vào ngày 08/08/2008 trụ sở chính đặt tại Số 16 ngõ 105 Nguyễn Trãi - P Thượng Đình - Q Thanh Xuân - TP Hà Nội. Chúng tôi là chuyên gia hàng đầu về lĩnh vực bán sim số đẹp trực tuyến, ngay từ khi ra đời trung tâm Sim So Dep đã đặt sự am hiểu và chia sẻ với khách hàng làm kim chỉ nam của mọi hoạt động kinh doanh. SIMSODEP.COM - Mr Thắng: 0944.88.9999 Giao Dịch Toàn Quốc 24/24 Mua Bán - Trao Đổi - Cầm Cố Sim Tứ Quý - Ngũ Quý - Lục Quý - Taxi Dùng Thử Và Hoàn Trả Lại Sim Trong Vòng 10 Ngày Duy Nhất Tại Đây Mua Bán Trả Góp Lãi 0.0010% (Sim Có Giá Trên 50 Triệu) Bán Hàng: Nhanh, Chuẩn, Giá Tốt Nhất Cầm Cố: Định Giá Cao Với Lãi Suất Thấp (Sim Có Giá Trên 50 Triệu) Tìm Sim VIP Theo Yêu Cầu Thu Mua Sim Số Đẹp Đã Qua Sử Dụng Với Giá Cao Nhất Nhằm đáp ứng nhu cầu sở hữu sim số đẹp của bộ phận lớn người Việt trong giới chơi sim, chúng tôi chuyên cung cấp các loại dịch vụ viễn thông thuộc các nhà mạng như: Viettel, Vinaphone, Mobifone, Vietnamobile, và Gmobile. Bao gồm các dạng số đep như: Sim Tứ Quý Sim Ngũ Quý Sim Lục Quý Sim Lộc Phát Sim Thần Tài Sim Tiến Đơn Sim Tiến Đôi Sim Tam Hoa Đơn Sim Tam Hoa Kép Sim Kép Sim Lặp Sim Đối Sim Gánh Sim Đảo Sim Đặc Biệt Sim Ông Địa Sim Đầu Số Cổ Sim Năm Sinh Sim Ngày Tháng Năm Sinh Sim Taxi Lặp 2 Sim Taxi Lặp 3 Sim Taxi Lặp 4 0942222266 = 0 VNĐ 0948496688 = 0 VNĐ 0932424888 = 0 VNĐ 0932426888 = 0 VNĐ 0934786888 = 0 VNĐ 0935046888 = 0 VNĐ 0906146888 = 0 VNĐ 0932455999 = 0 VNĐ 0935800888 = 0 VNĐ 0935800999 = 0 VNĐ 0943335999 = 0 VNĐ 0942666699 = 0 VNĐ 0909020000 = 0 VNĐ 0934783478 = 0 VNĐ 0904447979 = 0 VNĐ 0906356666 = 0 VNĐ 0985828282 = 0 VNĐ 0901009999 = 0 VNĐ 01234393939 = 0 VNĐ 01244008888 = 0 VNĐ 01244009999 = 0 VNĐ 01202565656 = 0 VNĐ 01253098888 = 0 VNĐ 01255090909 = 0 VNĐ 01272565656 = 0 VNĐ 01225848484 = 0 VNĐ 01232939393 = 0 VNĐ 01232949494 = 0 VNĐ 01232979797 = 0 VNĐ 01264919191 = 0 VNĐ 01272508888 = 0 VNĐ 01297818181 = 0 VNĐ 01213575757 = 0 VNĐ 01255030303 = 0 VNĐ 01256010101 = 0 VNĐ 01257757575 = 0 VNĐ 01287565656 = 0 VNĐ 01202303030 = 0 VNĐ 01214080808 = 0 VNĐ 01216644444 = 0 VNĐ 01233646464 = 0 VNĐ 01252535353 = 0 VNĐ 01253515151 = 0 VNĐ 01253626262 = 0 VNĐ 01255626262 = 0 VNĐ 01255636363 = 0 VNĐ 01259456666 = 0 VNĐ 01259535353 = 0 VNĐ 01274070707 = 0 VNĐ 01275080808 = 0 VNĐ 01297252525 = 0 VNĐ 01214505050 = 0 VNĐ 01215626262 = 0 VNĐ 01215644444 = 0 VNĐ 01215646464 = 0 VNĐ 01216646464 = 0 VNĐ 01217202020 = 0 VNĐ 01217434343 = 0 VNĐ 01217606060 = 0 VNĐ 01218323232 = 0 VNĐ 01223626262 = 0 VNĐ 01226505050 = 0 VNĐ 01226515151 = 0 VNĐ 01227626262 = 0 VNĐ 01227646464 = 0 VNĐ 01232404040 = 0 VNĐ 01232515151 = 0 VNĐ 01235626262 = 0 VNĐ 01237303030 = 0 VNĐ 01237313131 = 0 VNĐ 01239476666 = 0 VNĐ 01253040404 = 0 VNĐ 01254494949 = 0 VNĐ 01254606060 = 0 VNĐ 01254606666 = 0 VNĐ 01255096666 = 0 VNĐ 01255206666 = 0 VNĐ 01256313131 = 0 VNĐ 01259464646 = 0 VNĐ 01259646464 = 0 VNĐ 01262010101 = 0 VNĐ 01263500000 = 0 VNĐ 01263515151 = 0 VNĐ 01263525252 = 0 VNĐ 01263545454 = 0 VNĐ 01264757575 = 0 VNĐ 01265464646 = 0 VNĐ 01269515151 = 0 VNĐ 01269535353 = 0 VNĐ 01272505050 = 0 VNĐ 01272506666 = 0 VNĐ 01272515151 = 0 VNĐ 01275076666 = 0 VNĐ 01278040404 = 0 VNĐ 01278050505 = 0 VNĐ 01278494949 = 0 VNĐ 01293216666 = 0 VNĐ 01296212121 = 0 VNĐ 01296535353 = 0 VNĐ 01296545454 = 0 VNĐ 01296626262 = 0 VNĐ 01297056666 = 0 VNĐ 01297434343 = 0 VNĐ 01298707070 = 0 VNĐ ★ Kho Sim với hơn 9 triệu số luôn có sẵn tại kho trung tâm, chúng tôi tin sẽ đáp ứng được những yêu cầu khắt khe nhất của khách hàng có nhu cầu dùng sim số đẹp. Khách hàng khi mua sim số đẹp tại SimSoDep.Com đều được tư vấn về việc chọn nhà mạng, loại sim, gói cước... phù hợp với nhu cầu của từng người. Tất cả các sim bán ra đều được trung tâm đăng ký thông tin thuê bao nhanh chóng, nghiêm túc, chính chủ đảm bảo cho khách hàng yên tâm sử dụng mãi mãi. ★ Dù khách hàng ở bất cứ nơi đâu cũng có thể dễ dàng đặt mua Sim Số Đẹp và nhận sim ngay tại nhà bằng dịch vụ giao sim tận nơi trong vòng 24h. ★ Với mong muốn mang lại lợi ích tối đa cho khách hàng, phát triển, quảng bá thương hiệu trung tâm SimSoDep.Com tất cả các nhân viên trung tâm luôn cố gắng làm việc với phong cách chuyên nghiệp, tận tình, chu đáo với khách hàng, luôn sẵn sàng giải đáp thắc mắc của khách hàng và tâm niệm rằng chỉ có thể phát triển lớn mạnh bằng cách đáp ứng tốt nhất các yêu cầu của khách hàng một cách nhanh chóng và chuyên nghiệp. ★ Chúng tôi cam kết sẽ đem đến cho Quý khách hàng những sản phẩm, dịch vụ tốt nhất, cách phục vụ chu đáo tận tình nhất. Nơi mà duy nhất chất lượng dịch vụ được đảm bảo bằng những " Cam Kết Cụ Thể " nhất. • Name: Đỗ Mạnh Thắng • Company: Công ty CP Thương mại và Dịch vụ Viễn thông Hồng Thịnh • Add: Số 16 ngõ 105 Nguyễn Trãi - P Thượng Đình - Q Thanh Xuân - TP Hà Nội • Website: simsodep.com • Fanpage: facebook.com/simsodep.vn • Facebook: facebook.com/thang.simsodep • Email: thang.simsodep@gmail.com • Tel: 0902.83.83.83 - 0912.83.83.83 - 0944.88.9999 - 024.22.345.678 ✔ SimSoDep.Com hiện là thương hiệu đã được Bộ Công Thương chấp nhận do vậy có đầy đủ tư cách pháp nhân để phân phối sản phẩm và được đảm bảo về uy tín cũng như sự tin tưởng của khách hàng.

markdown:
[,](http://thammyviensaigon.com.vn/) **diễn đàn thẩm mỹ** [.](http://muabannha24h.net/) **mua bán nhà đất** **cung cấp thiết bị phòng tập gym** [Berjaya](http://bepberjaya.com) [in túi ni lông giá rẻ](http://www.baobiphuthanh.com/sp-In-tui-ni-long-2.html)chất lượng nhất tại TPHCM. [giá tôn phương nam](http://satthepxaydungvn.com/gia-ton-phuong-nam.html) [tôn phương nam](http://satthepxaydungvn.com/bang-gia-ton/ton-phuong-nam/)
# SimSoDep.Com-Kho-Sim-Số-Đẹp-Giá-Rẻ-Lớn-Nhất-Việt-Nam
Thảo luận trong '
[Điện thoại & linh kiện](forums/dien-thoai-linh-kien/)' bắt đầu bởi [simsodep8388](members/simsodep8388.1948/), [3 Tháng tám 2018](threads/simsodep-com-kho-sim-so-dep-gia-re-lon-nhat-viet-nam.1006/).

Cache-control: private, max-age=0

Set-Cookie: xf_session=48a3c582eb43919e6f07d449e15decc5; path=/; secure; httponly

X-Frame-Options: SAMEORIGIN

Keep-Alive: timeout=2, max=99

Connection: Keep-Alive


text:
MST: 0800929619- Đại diện: Phạm Đức ThếĐịa chỉ: Số nhà 165, Khu 17
MST: 0800869857- Đại diện: Nguyễn Đình ThànhĐịa chỉ: Khu I, Bích Nhôi
MST: 0800973505- Đại diện: Nguyễn Việt SơnĐịa chỉ: Xóm 8, thôn Hội Xuyên
MST: 0800869889- Đại diện: Lê Văn HiếuĐịa chỉ: Lô 102.86, tổ 1, khu 4
MST: 0800973512- Đại diện: Nguyễn Văn TânĐịa chỉ: Số 74, đường Hữu Nghị, phố Trần Hưng Đạo
MST: 0800869906- Đại diện: Nguyễn Văn HuyĐịa chỉ: Khu I
MST: 0800899273- Đại diện: Trịnh Xuân PhúcĐịa chỉ: Số nhà 47, phố Đoàn Kết
MST: 0800973777- Đại diện: KIM JIN GYONGĐịa chỉ: Km43 Quốc lộ 5
MST: 0800899298- Đại diện: Nguyễn Văn CươngĐịa chỉ: Tổ 1, khu 13
MST: 0800899308- Đại diện: Đặng Thanh BìnhĐịa chỉ: Số 17/96, đường Nguyễn Thị Duệ
MST: 0800899315- Đại diện: Vũ Anh TuấnĐịa chỉ: Số nhà 35, đường Nguyễn Chí Thanh
MST: 0800899322- Đại diện: Nguyễn Thị LýĐịa chỉ: Số nhà 25, phố Minh Khai
MST: 0800899347- Đại diện: Vũ Ngọc ĐứcĐịa chỉ: Phố Hoàng Ngân
MST: 0800899354- Đại diện: Phạm Văn ViễnĐịa chỉ: Khu chợ xóm Vạn, thôn Văn Thai
MST: 0800973865- Đại diện: Vũ Văn BảnĐịa chỉ: Thôn Chàng
MST: 0800899361- Đại diện: Mạc Duy LamĐịa chỉ: Thôn Huề Trì
MST: 0800973872- Đại diện: Trương Văn QuýĐịa chỉ: Thôn Ngọc Lâu
MST: 0800899379- Đại diện: Dương Thị DàoĐịa chỉ: Số nhà 94, phố Lục Đầu Giang
MST: 0800899386- Đại diện: Phạm Văn ThắngĐịa chỉ: Số 06/17, ngách 243, khu 18
MST: 0800973897- Đại diện: Nguyễn Văn TầnĐịa chỉ: Thôn Phú An
MST: 0800973907- Đại diện: Nguyễn Văn ThuyênĐịa chỉ: Thị Tứ
MST: 0800973914- Đại diện: Phạm Đình ĐangĐịa chỉ: Số 19 Trần Hưng Đạo khu Mạc Thị Bưởi
MST: 0800973939- Đại diện: Bùi Thị MỵĐịa chỉ: Khu I
MST: 0800973946- Đại diện: Kim Thúy AnhĐịa chỉ: Số nhà 112, Đường Bến xe khách
MST: 0800974202- Đại diện: Vương Anh TuấnĐịa chỉ: Số nhà 30/78, Phố Quan Thánh
MST: 0800974227- Đại diện: Trịnh Huy ĐoànĐịa chỉ: Đường Đặng Tính
MST: 0800974234- Đại diện: Lê Hải LongĐịa chỉ: Số nhà 40, phố Chu Văn An
MST: 0800974241- Đại diện: Lê Văn BíchĐịa chỉ: Số nhà 80, Phố Vũ Dự, Khu Tứ Thông
MST: 0800974259- Đại diện: Đỗ Văn HoạtĐịa chỉ: Số nhà 7, phố Bắc Sơn
MST: 0800974266- Đại diện: Nguyễn Văn HiệpĐịa chỉ: Số nhà 3, Phố Lý Nam Đế
MST: 0800974280- Đại diện: Trần Văn ThựcĐịa chỉ: Số nhà 58, Phố Bình Lộc
MST: 0800974315- Đại diện: Nguyễn Xuân LộcĐịa chỉ: Số nhà 128, phố Thống Nhất
MST: 0800974668- Đại diện: Phạm Thị ĐộngĐịa chỉ: 40 đường Thống Nhất
MST: 0800974675- Đại diện: MICHIO SUGIYAMAĐịa chỉ: Nhà số E61 khu chợ Hội Đô đường Nguyễn Chí Thanh
MST: 0800974844- Đại diện: Nguyễn Xuân QuangĐịa chỉ: Số nhà 2, ngách 14A/42, đường Phan Bội Châu
MST: 0800974869- Đại diện: Phan Văn TâmĐịa chỉ: Số nhà 138, Phố Quang Trung
MST: 0800974876- Đại diện: Đinh Thị LýĐịa chỉ: Số 12/84, Đường An Thái
MST: 0800974883- Đại diện: Nguyễn Thị LiênĐịa chỉ: Khu 11 thôn Tiền
MST: 0800975100- Đại diện: Phạm Hải AnhĐịa chỉ: Lô 21.15, Khu Đô Thị Mới phía Tây
MST: 0800975118- Đại diện: Phạm Quốc HảiĐịa chỉ: Số 74 Ngõ 296 Điện Biên Phủ
MST: 0800975125- Đại diện: Nguyễn Thị NhungĐịa chỉ: Thôn Viên Chử
MST: 0800975132- Đại diện: Nguyễn Xuân ThủyĐịa chỉ: Thôn Hiệp Thượng
MST: 0800975157- Đại diện: Vương Đức LanhĐịa chỉ: Khu 18
MST: 0800975164- Đại diện: Vũ Thị HàĐịa chỉ: Số nhà 2, phố Nguyễn Hới
MST: 0800975189- Đại diện: Lê Tiến LợiĐịa chỉ: Khu Phụ Sơn
MST: 0800975534- Đại diện: Phạm Văn SơnĐịa chỉ: Số nhà 539, đường Trần Phú, khu Nguyễn Văn Trỗi
MST: 0800975541- Đại diện: Nguyễn Văn HọcĐịa chỉ: Khu 19
MST: 0800975559- Đại diện: Đồng Thị HàĐịa chỉ: Km 46 thôn Tiền
MST: 0800975830- Đại diện: Phan Thị ThúyĐịa chỉ: Tam Kỳ
MST: 0800975904- Đại diện: Nguyễn Thị Hồng ĐàĐịa chỉ: Đồng Gia

markdown:
MST: 0800929619- Đại diện: Phạm Đức Thế
Địa chỉ: Số nhà 165, Khu 17
MST: 0800869857- Đại diện: Nguyễn Đình Thành
Địa chỉ: Khu I, Bích Nhôi
MST: 0800973505- Đại diện: Nguyễn Việt Sơn
Địa chỉ: Xóm 8, thôn Hội Xuyên
MST: 0800869889- Đại diện: Lê Văn Hiếu
Địa chỉ: Lô 102.86, tổ 1, khu 4
MST: 0800973512- Đại diện: Nguyễn Văn Tân
Địa chỉ: Số 74, đường Hữu Nghị, phố Trần Hưng Đạo
MST: 0800869906- Đại diện: Nguyễn Văn Huy
Địa chỉ: Khu I
MST: 0800899273- Đại diện: Trịnh Xuân Phúc
Địa chỉ: Số nhà 47, phố Đoàn Kết
MST: 0800973777- Đại diện: KIM JIN GYONG
Địa chỉ: Km43 Quốc lộ 5
MST: 0800899298- Đại diện: Nguyễn Văn Cương
Địa chỉ: Tổ 1, khu 13
MST: 0800899308- Đại diện: Đặng Thanh Bình
Địa chỉ: Số 17/96, đường Nguyễn Thị Duệ
MST: 0800899315- Đại diện: Vũ Anh Tuấn
Địa chỉ: Số nhà 35, đường Nguyễn Chí Thanh
MST: 0800899322- Đại diện: Nguyễn Thị Lý
Địa chỉ: Số nhà 25, phố Minh Khai
MST: 0800899347- Đại diện: Vũ Ngọc Đức
Địa chỉ: Phố Hoàng Ngân
MST: 0800899354- Đại diện: Phạm Văn Viễn
Địa chỉ: Khu chợ xóm Vạn, thôn Văn Thai
MST: 0800973865- Đại diện: Vũ Văn Bản
Địa chỉ: Thôn Chàng
MST: 0800899361- Đại diện: Mạc Duy Lam
Địa chỉ: Thôn Huề Trì
MST: 0800973872- Đại diện: Trương Văn Quý
Địa chỉ: Thôn Ngọc Lâu
MST: 0800899379- Đại diện: Dương Thị Dào
Địa chỉ: Số nhà 94, phố Lục Đầu Giang
MST: 0800899386- Đại diện: Phạm Văn Thắng
Địa chỉ: Số 06/17, ngách 243, khu 18
MST: 0800973897- Đại diện: Nguyễn Văn Tần
Địa chỉ: Thôn Phú An
MST: 0800973907- Đại diện: Nguyễn Văn Thuyên
Địa chỉ: Thị Tứ
MST: 0800973914- Đại diện: Phạm Đình Đang
Địa chỉ: Số 19 Trần Hưng Đạo khu Mạc Thị Bưởi
MST: 0800973939- Đại diện: Bùi Thị Mỵ
Địa chỉ: Khu I
MST: 0800973946- Đại diện: Kim Thúy Anh
Địa chỉ: Số nhà 112, Đường Bến xe khách
MST: 0800974202- Đại diện: Vương Anh Tuấn
Địa chỉ: Số nhà 30/78, Phố Quan Thánh
MST: 0800974227- Đại diện: Trịnh Huy Đoàn
Địa chỉ: Đường Đặng Tính
MST: 0800974234- Đại diện: Lê Hải Long
Địa chỉ: Số nhà 40, phố Chu Văn An
MST: 0800974241- Đại diện: Lê Văn Bích
Địa chỉ: Số nhà 80, Phố Vũ Dự, Khu Tứ Thông
MST: 0800974259- Đại diện: Đỗ Văn Hoạt
Địa chỉ: Số nhà 7, phố Bắc Sơn
MST: 0800974266- Đại diện: Nguyễn Văn Hiệp
Địa chỉ: Số nhà 3, Phố Lý Nam Đế
MST: 0800974280- Đại diện: Trần Văn Thực
Địa chỉ: Số nhà 58, Phố Bình Lộc
MST: 0800974315- Đại diện: Nguyễn Xuân Lộc
Địa chỉ: Số nhà 128, phố Thống Nhất
MST: 0800974668- Đại diện: Phạm Thị Động
Địa chỉ: 40 đường Thống Nhất
MST: 0800974675- Đại diện: MICHIO SUGIYAMA
Địa chỉ: Nhà số E61 khu chợ Hội Đô đường Nguyễn Chí Thanh
MST: 0800974844- Đại diện: Nguyễn Xuân Quang
Địa chỉ: Số nhà 2, ngách 14A/42, đường Phan Bội Châu
MST: 0800974869- Đại diện: Phan Văn Tâm
Địa chỉ: Số nhà 138, Phố Quang Trung
MST: 0800974876- Đại diện: Đinh Thị Lý
Địa chỉ: Số 12/84, Đường An Thái
MST: 0800974883- Đại diện: Nguyễn Thị Liên
Địa chỉ: Khu 11 thôn Tiền
MST: 0800975100- Đại diện: Phạm Hải Anh
Địa chỉ: Lô 21.15, Khu Đô Thị Mới phía Tây
MST: 0800975118- Đại diện: Phạm Quốc Hải
Địa chỉ: Số 74 Ngõ 296 Điện Biên Phủ
MST: 0800975125- Đại diện: Nguyễn Thị Nhung
Địa chỉ: Thôn Viên Chử
MST: 0800975132- Đại diện: Nguyễn Xuân Thủy
Địa chỉ: Thôn Hiệp Thượng
MST: 0800975157- Đại diện: Vương Đức Lanh
Địa chỉ: Khu 18
MST: 0800975164- Đại diện: Vũ Thị Hà
Địa chỉ: Số nhà 2, phố Nguyễn Hới
MST: 0800975189- Đại diện: Lê Tiến Lợi
Địa chỉ: Khu Phụ Sơn
MST: 0800975534- Đại diện: Phạm Văn Sơn
Địa chỉ: Số nhà 539, đường Trần Phú, khu Nguyễn Văn Trỗi
MST: 0800975541- Đại diện: Nguyễn Văn Học
Địa chỉ: Khu 19
MST: 0800975559- Đại diện: Đồng Thị Hà
Địa chỉ: Km 46 thôn Tiền
MST: 0800975830- Đại diện: Phan Thị Thúy
Địa chỉ: Tam Kỳ
MST: 0800975904- Đại diện: Nguyễn Thị Hồng Đà
Địa chỉ: Đồng Gia

Cache-Control: private

Content-Type: text/html; charset=utf-8

Vary: Accept-Encoding


text:
MST: 0108043577- Đại diện: Nguyễn Đình KhoaĐịa chỉ: Đội 1, thôn Hoàng Xá, Xã Hoàng Kim, Huyện Mê Linh, Hà Nội
MST: 0108043584- Đại diện: Phạm Hoàng TùngĐịa chỉ: Số 571 đường Thụy Khuê, Phường Bưởi, Quận Tây Hồ, Hà Nội
MST: 0108043601- Đại diện: Nguyễn Giang NamĐịa chỉ: Số 627 Lạc Long Quân, Phường Xuân La, Quận Tây Hồ, Hà Nội
MST: 0108043626- Đại diện: Phạm Xuân Thiên DuyĐịa chỉ: Số 84, phố Yên Phụ, Phường Yên Phụ, Quận Tây Hồ, Hà Nội
MST: 0108043633- Đại diện: Nguyễn Văn ThắngĐịa chỉ: Số 43, ngõ 80, khu tập thể Hưu trí Lê Quý Đôn, đường Bà Triệ, Phường Hà Cầu, Quận Hà Đông, Hà Nội
MST: 0108043658- Đại diện: Đào Thành TrungĐịa chỉ: No 17, LK 647, Khu Giếng sen, đường Lê Trọng Tấn, Phường La Khê, Quận Hà Đông, Hà Nội
MST: 0108043665- Đại diện: Nguyễn Văn NamĐịa chỉ: Căn hộ 7, nhà B5 TTQĐ A45, Phường Nghĩa Tân, Quận Cầu Giấy, Hà Nội
MST: 0108043672- Đại diện: Nguyễn Xuân HảiĐịa chỉ: Xóm 1, thôn Bát Tràng, Xã Bát Tràng, Huyện Gia Lâm, Hà Nội
MST: 0108043697- Đại diện: Lê Hữu NguyênĐịa chỉ: Tầng 3, Tòa Nhà An Phú, Số 24 Hoàng Quốc Việt, Phường Nghĩa Đô, Quận Cầu Giấy, Hà Nội
MST: 0108043707- Đại diện: Đặng Thị Bích HạnhĐịa chỉ: Thôn 3 Giang Cao, Xã Bát Tràng, Huyện Gia Lâm, Hà Nội
MST: 0108043721- Đại diện: Tạ Sơn TùngĐịa chỉ: thôn Nhòn, Xã Tiến Xuân, Huyện Thạch Thất, Hà Nội
MST: 0108043739- Đại diện: Nguyễn Đình HồngĐịa chỉ: Thôn 5, Xã Canh Nậu, Huyện Thạch Thất, Hà Nội
MST: 0108043753- Đại diện: Lê Đình HoàngĐịa chỉ: Số 5, liền kề 19, KĐT Văn Khê,, Phường La Khê, Quận Hà Đông, Hà Nội
MST: 0108043778- Đại diện: Phạm Thị ChúcĐịa chỉ: Số 24, Ngõ 102/2, đường Phú Mỹ, Phường Biên Giang, Quận Hà Đông, Hà Nội
MST: 0108043792- Đại diện: Đỗ Thúy HằngĐịa chỉ: Số nhà 17, Ngõ 379 Văn Cao,, Phường Liễu Giai, Quận Ba Đình, Hà Nội
MST: 0108043802- Đại diện: Nguyễn Hữu ThànhĐịa chỉ: Số 101 Ngõ 29 Phố Đội Nhân, Phường Vĩnh Phúc, Quận Ba Đình, Hà Nội
MST: 0108043827- Đại diện: Đoàn Thị HàĐịa chỉ: Số 635B Kim Mã, Phường Ngọc Khánh, Quận Ba Đình, Hà Nội
MST: 0108043834- Đại diện: Lê Minh SơnĐịa chỉ: Số nhà 9 ngõ 2 phố Vạn Phúc, Phường Kim Mã, Quận Ba Đình, Hà Nội
MST: 0108043841- Đại diện: Nguyê�N Xuân ThuĐịa chỉ: Sô� 5, phô� Nguyê�n Ca�nh Chân, Phường Quán Thánh, Quận Ba Đình, Hà Nội
MST: 0108043859- Đại diện: Nguyễn Thành ChungĐịa chỉ: Số nhà D3, Khu TT Xí nghiệp Thuốc Thú y Trung ương, Xã Đức Thượng, Huyện Hoài Đức, Hà Nội
MST: 0108043866- Đại diện: Phạm Thị Ngọc BíchĐịa chỉ: Số 9, Ngách 26/27, Ngõ 26, Phố Đỗ Quang, Phường Trung Hoà, Quận Cầu Giấy, Hà Nội
MST: 0108043880- Đại diện: Phạm Tuấn KiênĐịa chỉ: Số 7 Tôn Thất Thuyết, Phường Dịch Vọng Hậu, Quận Cầu Giấy, Hà Nội
MST: 0108043898- Đại diện: Nguyễn Ngọc QuýĐịa chỉ: Tầng 6, Tòa nhà Sannam, Số 78 Phố Duy Tân, Phường Dịch Vọng Hậu, Quận Cầu Giấy, Hà Nội
MST: 0108043908- Đại diện: Nguyễn Thị Nhật HằngĐịa chỉ: Nhà số 14, Ngõ 358/40/30 Bùi Xương Trạch, Phường Khương Đình, Quận Thanh Xuân, Hà Nội
MST: 0108043915- Đại diện: Đỗ Văn BằngĐịa chỉ: Thôn Sông Công, Xã Trung Giã, Huyện Sóc Sơn, Hà Nội
MST: 0108043922- Đại diện: Đặng Thị Bảo PhươngĐịa chỉ: Tầng 1, số 4, ngách 2, ngõ 66 Ngọc Lâm, Phường Ngọc Lâm, Quận Long Biên, Hà Nội
MST: 0108043947- Đại diện: Hoàng Văn QuỳnhĐịa chỉ: Số 8, ngách 87/56, Tổ 1, Thạch Cầu, Phường Long Biên, Quận Long Biên, Hà Nội
MST: 0108043954- Đại diện: Trần Trung NghĩaĐịa chỉ: Số 41 ngõ Yên Thái, Phường Hàng Gai, Quận Hoàn Kiếm, Hà Nội
MST: 0108043961- Đại diện: Nguyễn Thị ThươngĐịa chỉ: Số 503 đường Nguyễn Văn Linh, Phường Sài Đồng, Quận Long Biên, Hà Nội
MST: 0108043979- Đại diện: Vũ Hoàng LộcĐịa chỉ: Số 218 Ngõ 264 Đường Ngọc Thụy, Tổ 14, Phường Ngọc Thuỵ, Quận Long Biên, Hà Nội
MST: 0108043986- Đại diện: Trịnh Thị ThủyĐịa chỉ: Số 299, Đường Ngọc Thụy, Tổ 9,, Phường Ngọc Thuỵ, Quận Long Biên, Hà Nội
MST: 0108043993- Đại diện: Đàm Hữu TrướcĐịa chỉ: Số 335, đường Lâm Du, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044027- Đại diện: Địa chỉ: 107 A13 Nguyễn Quý Đức, Phường Thanh Xuân Bắc, Quận Thanh Xuân, Hà Nội
MST: 0108044066- Đại diện: Takahiro KakutaĐịa chỉ: Phòng 1601R09, tầng 16, tòa nhà Daeha, số 360 Kim Mã, Phường Ngọc Khánh, Quận Ba Đình, Hà Nội
MST: 0108044073- Đại diện: Nguyễn Thị ThiệnĐịa chỉ: Số 11 ngách 81 ngõ 123 Bằng Liệt, Phường Hoàng Liệt, Quận Hoàng Mai, Hà Nội
MST: 0108044080- Đại diện: Trần Thu HiềnĐịa chỉ: Số 5 hẻm 6 ngách 145 ngõ 143 Phố Nguyễn Chính, Phường Thịnh Liệt, Quận Hoàng Mai, Hà Nội
MST: 0108044108- Đại diện: Địa chỉ: C13 Nơ 10, khu ĐTM Định Công, Phường Định Công, Quận Hoàng Mai, Hà Nội
MST: 0108044122- Đại diện: Trần Đăng HiệpĐịa chỉ: 105 phố Láng Hạ, Phường Láng Hạ, Quận Đống đa, Hà Nội
MST: 0108044147- Đại diện: Địa chỉ: C13 Nơ 10, khu ĐTM Định Công, Phường Định Công, Quận Hoàng Mai, Hà Nội
MST: 0108044154- Đại diện: Ngô Văn HòaĐịa chỉ: Thôn Ngọc Chi, Xã Vĩnh Ngọc, Huyện Đông Anh, Hà Nội
MST: 0108044161- Đại diện: Nguyễn Huy HoànĐịa chỉ: Số 12B, Ngõ 43 Đường Lâm Hạ, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044179- Đại diện: Nguyễn Văn ThắngĐịa chỉ: Số nhà 4 ngõ 239/60 phố Bồ Đề, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044186- Đại diện: Nguyễn Duy HưngĐịa chỉ: P 2&3 tầng 2 nhà B thuộc TCTCN tàu thuỷ VN, 109 Quán thánh, , Quận Ba Đình, Hà Nội
MST: 0108044193- Đại diện: Ngô Quốc ĐịnhĐịa chỉ: Số 64/165, phố Chợ Khâm Thiên, Phường Trung Phụng, Quận Đống đa, Hà Nội
MST: 0108044203- Đại diện: Đoàn Thị HoàiĐịa chỉ: Số 135, Chùa Láng, Phường Láng Thượng, Quận Đống đa, Hà Nội
MST: 0108044210- Đại diện: Đỗ Quang TùngĐịa chỉ: Số 40, phố Hàng Phèn, Phường Hàng Bồ, Quận Hoàn Kiếm, Hà Nội
MST: 0108044228- Đại diện: Trịnh Hải NamĐịa chỉ: Số 16, hẻm 73/268/9 đường Nguyễn Trãi, Phường Thanh Xuân Trung, Quận Thanh Xuân, Hà Nội
MST: 0108044235- Đại diện: Phạm Minh DũngĐịa chỉ: Số 21/26 Dốc Tam Đa, Phường Thuỵ Khuê, Quận Tây Hồ, Hà Nội
MST: 0108044242- Đại diện: Hoàng Minh HảoĐịa chỉ: Số nhà 21 ngõ 74 phố An Trạch, Phường Cát Linh, Quận Đống đa, Hà Nội
MST: 0108044274- Đại diện: Hoàng Thị Thu HiềnĐịa chỉ: Tổ dân phố Bình Minh, Thị trấn Trâu Quỳ, Huyện Gia Lâm, Hà Nội

markdown:
MST: 0108043577- Đại diện: Nguyễn Đình Khoa
Địa chỉ: Đội 1, thôn Hoàng Xá, Xã Hoàng Kim, Huyện Mê Linh, Hà Nội
MST: 0108043584- Đại diện: Phạm Hoàng Tùng
Địa chỉ: Số 571 đường Thụy Khuê, Phường Bưởi, Quận Tây Hồ, Hà Nội
MST: 0108043601- Đại diện: Nguyễn Giang Nam
Địa chỉ: Số 627 Lạc Long Quân, Phường Xuân La, Quận Tây Hồ, Hà Nội
MST: 0108043626- Đại diện: Phạm Xuân Thiên Duy
Địa chỉ: Số 84, phố Yên Phụ, Phường Yên Phụ, Quận Tây Hồ, Hà Nội
MST: 0108043633- Đại diện: Nguyễn Văn Thắng
Địa chỉ: Số 43, ngõ 80, khu tập thể Hưu trí Lê Quý Đôn, đường Bà Triệ, Phường Hà Cầu, Quận Hà Đông, Hà Nội
MST: 0108043658- Đại diện: Đào Thành Trung
Địa chỉ: No 17, LK 647, Khu Giếng sen, đường Lê Trọng Tấn, Phường La Khê, Quận Hà Đông, Hà Nội
MST: 0108043665- Đại diện: Nguyễn Văn Nam
Địa chỉ: Căn hộ 7, nhà B5 TTQĐ A45, Phường Nghĩa Tân, Quận Cầu Giấy, Hà Nội
MST: 0108043672- Đại diện: Nguyễn Xuân Hải
Địa chỉ: Xóm 1, thôn Bát Tràng, Xã Bát Tràng, Huyện Gia Lâm, Hà Nội
MST: 0108043697- Đại diện: Lê Hữu Nguyên
Địa chỉ: Tầng 3, Tòa Nhà An Phú, Số 24 Hoàng Quốc Việt, Phường Nghĩa Đô, Quận Cầu Giấy, Hà Nội
MST: 0108043707- Đại diện: Đặng Thị Bích Hạnh
Địa chỉ: Thôn 3 Giang Cao, Xã Bát Tràng, Huyện Gia Lâm, Hà Nội
MST: 0108043721- Đại diện: Tạ Sơn Tùng
Địa chỉ: thôn Nhòn, Xã Tiến Xuân, Huyện Thạch Thất, Hà Nội
MST: 0108043739- Đại diện: Nguyễn Đình Hồng
Địa chỉ: Thôn 5, Xã Canh Nậu, Huyện Thạch Thất, Hà Nội
MST: 0108043753- Đại diện: Lê Đình Hoàng
Địa chỉ: Số 5, liền kề 19, KĐT Văn Khê,, Phường La Khê, Quận Hà Đông, Hà Nội
MST: 0108043778- Đại diện: Phạm Thị Chúc
Địa chỉ: Số 24, Ngõ 102/2, đường Phú Mỹ, Phường Biên Giang, Quận Hà Đông, Hà Nội
MST: 0108043792- Đại diện: Đỗ Thúy Hằng
Địa chỉ: Số nhà 17, Ngõ 379 Văn Cao,, Phường Liễu Giai, Quận Ba Đình, Hà Nội
MST: 0108043802- Đại diện: Nguyễn Hữu Thành
Địa chỉ: Số 101 Ngõ 29 Phố Đội Nhân, Phường Vĩnh Phúc, Quận Ba Đình, Hà Nội
MST: 0108043827- Đại diện: Đoàn Thị Hà
Địa chỉ: Số 635B Kim Mã, Phường Ngọc Khánh, Quận Ba Đình, Hà Nội
MST: 0108043834- Đại diện: Lê Minh Sơn
Địa chỉ: Số nhà 9 ngõ 2 phố Vạn Phúc, Phường Kim Mã, Quận Ba Đình, Hà Nội
MST: 0108043841- Đại diện: Nguyê�N Xuân Thu
Địa chỉ: Sô� 5, phô� Nguyê�n Ca�nh Chân, Phường Quán Thánh, Quận Ba Đình, Hà Nội
MST: 0108043859- Đại diện: Nguyễn Thành Chung
Địa chỉ: Số nhà D3, Khu TT Xí nghiệp Thuốc Thú y Trung ương, Xã Đức Thượng, Huyện Hoài Đức, Hà Nội
MST: 0108043866- Đại diện: Phạm Thị Ngọc Bích
Địa chỉ: Số 9, Ngách 26/27, Ngõ 26, Phố Đỗ Quang, Phường Trung Hoà, Quận Cầu Giấy, Hà Nội
MST: 0108043880- Đại diện: Phạm Tuấn Kiên
Địa chỉ: Số 7 Tôn Thất Thuyết, Phường Dịch Vọng Hậu, Quận Cầu Giấy, Hà Nội
MST: 0108043898- Đại diện: Nguyễn Ngọc Quý
Địa chỉ: Tầng 6, Tòa nhà Sannam, Số 78 Phố Duy Tân, Phường Dịch Vọng Hậu, Quận Cầu Giấy, Hà Nội
MST: 0108043908- Đại diện: Nguyễn Thị Nhật Hằng
Địa chỉ: Nhà số 14, Ngõ 358/40/30 Bùi Xương Trạch, Phường Khương Đình, Quận Thanh Xuân, Hà Nội
MST: 0108043915- Đại diện: Đỗ Văn Bằng
Địa chỉ: Thôn Sông Công, Xã Trung Giã, Huyện Sóc Sơn, Hà Nội
MST: 0108043922- Đại diện: Đặng Thị Bảo Phương
Địa chỉ: Tầng 1, số 4, ngách 2, ngõ 66 Ngọc Lâm, Phường Ngọc Lâm, Quận Long Biên, Hà Nội
MST: 0108043947- Đại diện: Hoàng Văn Quỳnh
Địa chỉ: Số 8, ngách 87/56, Tổ 1, Thạch Cầu, Phường Long Biên, Quận Long Biên, Hà Nội
MST: 0108043954- Đại diện: Trần Trung Nghĩa
Địa chỉ: Số 41 ngõ Yên Thái, Phường Hàng Gai, Quận Hoàn Kiếm, Hà Nội
MST: 0108043961- Đại diện: Nguyễn Thị Thương
Địa chỉ: Số 503 đường Nguyễn Văn Linh, Phường Sài Đồng, Quận Long Biên, Hà Nội
MST: 0108043979- Đại diện: Vũ Hoàng Lộc
Địa chỉ: Số 218 Ngõ 264 Đường Ngọc Thụy, Tổ 14, Phường Ngọc Thuỵ, Quận Long Biên, Hà Nội
MST: 0108043986- Đại diện: Trịnh Thị Thủy
Địa chỉ: Số 299, Đường Ngọc Thụy, Tổ 9,, Phường Ngọc Thuỵ, Quận Long Biên, Hà Nội
MST: 0108043993- Đại diện: Đàm Hữu Trước
Địa chỉ: Số 335, đường Lâm Du, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044027- Đại diện:
Địa chỉ: 107 A13 Nguyễn Quý Đức, Phường Thanh Xuân Bắc, Quận Thanh Xuân, Hà Nội
MST: 0108044066- Đại diện: Takahiro Kakuta
Địa chỉ: Phòng 1601R09, tầng 16, tòa nhà Daeha, số 360 Kim Mã, Phường Ngọc Khánh, Quận Ba Đình, Hà Nội
MST: 0108044073- Đại diện: Nguyễn Thị Thiện
Địa chỉ: Số 11 ngách 81 ngõ 123 Bằng Liệt, Phường Hoàng Liệt, Quận Hoàng Mai, Hà Nội
MST: 0108044080- Đại diện: Trần Thu Hiền
Địa chỉ: Số 5 hẻm 6 ngách 145 ngõ 143 Phố Nguyễn Chính, Phường Thịnh Liệt, Quận Hoàng Mai, Hà Nội
MST: 0108044108- Đại diện:
Địa chỉ: C13 Nơ 10, khu ĐTM Định Công, Phường Định Công, Quận Hoàng Mai, Hà Nội
MST: 0108044122- Đại diện: Trần Đăng Hiệp
Địa chỉ: 105 phố Láng Hạ, Phường Láng Hạ, Quận Đống đa, Hà Nội
MST: 0108044147- Đại diện:
Địa chỉ: C13 Nơ 10, khu ĐTM Định Công, Phường Định Công, Quận Hoàng Mai, Hà Nội
MST: 0108044154- Đại diện: Ngô Văn Hòa
Địa chỉ: Thôn Ngọc Chi, Xã Vĩnh Ngọc, Huyện Đông Anh, Hà Nội
MST: 0108044161- Đại diện: Nguyễn Huy Hoàn
Địa chỉ: Số 12B, Ngõ 43 Đường Lâm Hạ, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044179- Đại diện: Nguyễn Văn Thắng
Địa chỉ: Số nhà 4 ngõ 239/60 phố Bồ Đề, Phường Bồ Đề, Quận Long Biên, Hà Nội
MST: 0108044186- Đại diện: Nguyễn Duy Hưng
Địa chỉ: P 2&3 tầng 2 nhà B thuộc TCTCN tàu thuỷ VN, 109 Quán thánh, , Quận Ba Đình, Hà Nội
MST: 0108044193- Đại diện: Ngô Quốc Định
Địa chỉ: Số 64/165, phố Chợ Khâm Thiên, Phường Trung Phụng, Quận Đống đa, Hà Nội
MST: 0108044203- Đại diện: Đoàn Thị Hoài
Địa chỉ: Số 135, Chùa Láng, Phường Láng Thượng, Quận Đống đa, Hà Nội
MST: 0108044210- Đại diện: Đỗ Quang Tùng
Địa chỉ: Số 40, phố Hàng Phèn, Phường Hàng Bồ, Quận Hoàn Kiếm, Hà Nội
MST: 0108044228- Đại diện: Trịnh Hải Nam
Địa chỉ: Số 16, hẻm 73/268/9 đường Nguyễn Trãi, Phường Thanh Xuân Trung, Quận Thanh Xuân, Hà Nội
MST: 0108044235- Đại diện: Phạm Minh Dũng
Địa chỉ: Số 21/26 Dốc Tam Đa, Phường Thuỵ Khuê, Quận Tây Hồ, Hà Nội
MST: 0108044242- Đại diện: Hoàng Minh Hảo
Địa chỉ: Số nhà 21 ngõ 74 phố An Trạch, Phường Cát Linh, Quận Đống đa, Hà Nội
MST: 0108044274- Đại diện: Hoàng Thị Thu Hiền
Địa chỉ: Tổ dân phố Bình Minh, Thị trấn Trâu Quỳ, Huyện Gia Lâm, Hà Nội


text:
5 loại trái cây tốt cho sức khỏe, ăn càng nhiều càng tốt cho sức khỏe
Ăn trái cây là cách giúp chúng ta bổ sung nhiều vitamin có lợi cho sức khỏe. Tuy nhiên, có những loại trái cây nếu ăn quá nhiều sẽ có một tác dụng phụ đó là gây ra dư thừa lượng đường trong máu.
Nhưng với 5 loại trái cây dưới đây, bạn có thể ăn thường xuyên vì những tác dụng tyệt vời với sức khỏe, lại đẹp da, giữ dáng.
Ổi
Ổi có hàm lượng chất xơ cao, vị ngọt nhẹ, là lựa chọn lý tưởng đầu tiên để hỗ trợ công cuộc giảm cân. Trong ổi còn rất giàu vitamin, protein và khoáng chất, đồng thời còn chứa rất ít carbohydrate và không có cholesterol nên khi ăn sẽ giúp bạn cảm thấy ngon miệng và no lâu hơn.
Ngoài ra, ăn ổi thường xuyên có thể giúp bạn chống lão hóa, đào thải những độc tố ra khỏi cơ thể, thúc đẩy sự trao đổi chất, điều tiết chức năng sinh lý, tăng cường sức khỏe. Đặc biệt hơn nữa, ổi là một loại trái cây rất tốt đối với những người mắc bệnh tiểu đường.
Đu đủ
Đu đủ giúp làm sáng làn da và củng cố xương khớp. Một nửa quả đu đủ cung cấp đến 238mg vitamin C giúp tăng cường hệ miễn dịch. Nếu thường xuyên bị cảm cúm do hệ miễn dịch suy giảm, bạn nên lưu ý bổ sung đu đủ trong chế độ dinh dưỡng.
Đu đủ còn có tác dụng phòng ngừa cao huyết áp, viêm thận, táo bón, hỗ trợ tiêu hóa, thúc đẩy sự trao đổi chất và chống lão hóa. Ngoài ra, đu đủ còn có tác dụng kháng khuẩn, chống viêm, giảm mỡ máu khá hiệu quả.
Cherry
Cherry (còn gọi là quả anh đào) có giá khá đắt ở Việt Nam. Quả cherry rất tốt cho những người bị cao huyết áp. Đây cũng là một trong những loại quả giúp bạn loại bỏ được mức độ cholesterol xấu trong cơ thể.
Nếu bạn ăn cherry thường xuyên, tình trạng mất ngủ của bạn sẽ được cải thiện. Cherry là thực phẩm tốt cho não bộ, tăng trí nhớ. Ăn cherry thường xuyên có thể phòng ngừa ung thư, giảm nguy cơ bệnh tim và rất tốt cho sức khỏe tổng thể.
Táo
Táo có tính lạnh vị ngọt, bất kể là giống táo nào cũng đều có tác dụng bổ tim, ích khí, giải khát, giảm ho, bổ thận, dưỡng dạ dày, giải tỏa căng thẳng mệt mỏi.
Đặc biệt, đối với những người thường xuyên uống rượu thì nên ăn nhiều táo vì táo có tác dụng giải rượu và thải độc rất tốt. Ăn táo có thể giúp giảm lượng đường trong máu, vì thế đặc biệt tốt với những người mắc bệnh tiểu đường.
Bưởi
Bưởi là loại trái cây được khuyên là nên ăn nhiều, bởi vì bưởi có có tác dụng làm giảm lượng đường trong máu. Theo đông y, quả bưởi có tính hàn vị ngọt, hơi chua, có tác dụng tiêu đờm, hỗ trợ tiêu hóa, hỗ trợ điều trị các chứng bệnh phù nề, viêm nhiễm…
Đặc biệt những người mắc bệnh tiểu đường càng nên ăn bưởi, vì trong bưởi có chứa một lượng lớn thành phần insulin, không chỉ có tác dụng giảm lượng đường trong máu mà còn có tác dụng bảo vệ tim mạch.
Theo Minh Anh/Gia đình & Xã hội!

markdown:
# 5 loại trái cây tốt cho sức khỏe, ăn càng nhiều càng tốt cho sức khỏe
#### Ăn trái cây là cách giúp chúng ta bổ sung nhiều vitamin có lợi cho sức khỏe. Tuy nhiên, có những loại trái cây nếu ăn quá nhiều sẽ có một tác dụng phụ đó là gây ra dư thừa lượng đường trong máu.
Nhưng với 5 loại trái cây dưới đây, bạn có thể ăn thường xuyên vì những tác dụng tyệt vời với sức khỏe, lại đẹp da, giữ dáng.
###### Ổi
**Ổi** có hàm lượng chất xơ cao, vị ngọt nhẹ, là lựa chọn lý tưởng đầu tiên để hỗ trợ công cuộc giảm cân. Trong ổi còn rất giàu vitamin, protein và khoáng chất, đồng thời còn chứa rất ít carbohydrate và không có cholesterol nên khi ăn sẽ giúp bạn cảm thấy ngon miệng và no lâu hơn.
Ngoài ra, ăn ổi thường xuyên có thể giúp bạn chống lão hóa, đào thải những độc tố ra khỏi cơ thể, thúc đẩy sự trao đổi chất, điều tiết chức năng sinh lý, tăng cường sức khỏe. Đặc biệt hơn nữa, ổi là một loại trái cây rất tốt đối với những người mắc bệnh tiểu đường.
###### Đu đủ
**Đu đủ** giúp làm sáng làn da và củng cố xương khớp. Một nửa quả đu đủ cung cấp đến 238mg vitamin C giúp tăng cường hệ miễn dịch. Nếu thường xuyên bị cảm cúm do hệ miễn dịch suy giảm, bạn nên lưu ý bổ sung đu đủ trong chế độ dinh dưỡng.
Đu đủ còn có tác dụng phòng ngừa cao huyết áp, viêm thận, táo bón, hỗ trợ tiêu hóa, thúc đẩy sự trao đổi chất và chống lão hóa. Ngoài ra, đu đủ còn có tác dụng kháng khuẩn, chống viêm, giảm mỡ máu khá hiệu quả.
###### Cherry
**Cherry** (còn gọi là quả anh đào) có giá khá đắt ở Việt Nam. Quả cherry rất tốt cho những người bị cao huyết áp. Đây cũng là một trong những loại quả giúp bạn loại bỏ được mức độ cholesterol xấu trong cơ thể.
Nếu bạn ăn cherry thường xuyên, tình trạng mất ngủ của bạn sẽ được cải thiện. Cherry là thực phẩm tốt cho não bộ, tăng trí nhớ. Ăn cherry thường xuyên có thể phòng ngừa ung thư, giảm nguy cơ bệnh tim và rất tốt cho sức khỏe tổng thể.
###### Táo
**Táo** có tính lạnh vị ngọt, bất kể là giống táo nào cũng đều có tác dụng bổ tim, ích khí, giải khát, giảm ho, bổ thận, dưỡng dạ dày, giải tỏa căng thẳng mệt mỏi.
Đặc biệt, đối với những người thường xuyên uống rượu thì nên ăn nhiều táo vì táo có tác dụng giải rượu và thải độc rất tốt. Ăn táo có thể giúp giảm lượng đường trong máu, vì thế đặc biệt tốt với những người mắc bệnh tiểu đường.
###### Bưởi
**Bưởi** là loại trái cây được khuyên là nên ăn nhiều, bởi vì bưởi có có tác dụng làm giảm lượng đường trong máu. Theo đông y, quả bưởi có tính hàn vị ngọt, hơi chua, có tác dụng tiêu đờm, hỗ trợ tiêu hóa, hỗ trợ điều trị các chứng bệnh phù nề, viêm nhiễm…
Đặc biệt những người mắc bệnh tiểu đường càng nên ăn bưởi, vì trong bưởi có chứa một lượng lớn thành phần insulin, không chỉ có tác dụng giảm lượng đường trong máu mà còn có tác dụng bảo vệ tim mạch.
Theo Minh Anh/Gia đình & Xã hội!

X-Litespeed-Cache: miss

X-Crawler-Transfer-Encoding: chunked

Accept-Ranges: bytes

Server: LiteSpeed

Connection: close


text:
Theo trang Science Alert, phát hiện mới về cấu trúc gene được mô tả như một "nút xoắn" của DNA trong các tế bào sống đã khẳng định thêm sự thật là bảng mã gene phức tạp của chúng ta không chỉ gồm chuỗi xoắn kép quen thuộc lâu nay mà còn gồm một cấu trúc khác có tính đối xứng phức tạp hơn nữa.
Các biến thể phân tử này có thể có những ảnh hưởng nhất định tới các chức năng sinh học của cơ thể.
Ông Daniel Christ - nhà nghiên cứu điều trị kháng thể của Viện Nghiên cứu Y khoa Garvan ở Australia, chủ trì nghiên cứu về cấu trúc mới của DNA, cho biết: "Giống như phần lớn chúng ta thường nghĩ về DNA, chúng tôi cũng chỉ nghĩ về chuỗi xoắn kép. Tuy nhiên nghiên cứu mới này nhắc nhở chúng tôi rằng có những cấu trúc DNA khác cũng đang tồn tại và có thể rất quan trọng với các tế bào của chúng ta".
Thành phần mới trong DNA do nhóm nghiên cứu tìm ra được gọi là cấu trúc motif xen giữa ("intercalated motif" hay "i-motif") vốn lần đầu được phát hiện vào những năm 1990. Tuy nhiên cho tới nay người ta mới chỉ thấy xuất hiện cấu trúc này trong các tế bào ở điều kiện nghiên cứu ống nghiệm mà không phải trong các tế bào sống.
Tuy nhiên nhờ công trình nghiên cứu của nhóm các nhà khoa học do ông Christ chủ trì, người ta đã thấy cấu trúc i-motif này xuất hiện một cách tự nhiên trong tế bào người, điều này cho thấy tầm quan trọng nhất định của cấu trúc này.
Như vậy, với việc khẳng định chắc chắn về sự tồn tại của một dạng cấu trúc DNA mới trong các tế bào, các nhà khoa học đã có căn cứ xác thực để tiếp tục tìm hiểu chức năng thực sự của những cấu trúc này với cơ thể chúng ta.
Kết quả nghiên cứu này vừa được đăng tải trên tạp chí khoa học Nature Chemistry.
(Theo Tuoitre.vn)

markdown:
Theo trang
*Science Alert*, phát hiện mới về cấu trúc gene được mô tả như một "nút xoắn" của DNA trong các tế bào sống đã khẳng định thêm sự thật là bảng mã gene phức tạp của chúng ta không chỉ gồm chuỗi xoắn kép quen thuộc lâu nay mà còn gồm một cấu trúc khác có tính đối xứng phức tạp hơn nữa.
Các biến thể phân tử này có thể có những ảnh hưởng nhất định tới các chức năng sinh học của cơ thể.
Ông Daniel Christ - nhà nghiên cứu điều trị kháng thể của Viện Nghiên cứu Y khoa Garvan ở Australia, chủ trì nghiên cứu về cấu trúc mới của DNA, cho biết: "Giống như phần lớn chúng ta thường nghĩ về DNA, chúng tôi cũng chỉ nghĩ về chuỗi xoắn kép. Tuy nhiên nghiên cứu mới này nhắc nhở chúng tôi rằng có những cấu trúc DNA khác cũng đang tồn tại và có thể rất quan trọng với các tế bào của chúng ta".
Thành phần mới trong DNA do nhóm nghiên cứu tìm ra được gọi là cấu trúc motif xen giữa ("intercalated motif" hay "i-motif") vốn lần đầu được phát hiện vào những năm 1990. Tuy nhiên cho tới nay người ta mới chỉ thấy xuất hiện cấu trúc này trong các tế bào ở điều kiện nghiên cứu ống nghiệm mà không phải trong các tế bào sống.
Tuy nhiên nhờ công trình nghiên cứu của nhóm các nhà khoa học do ông Christ chủ trì, người ta đã thấy cấu trúc i-motif này xuất hiện một cách tự nhiên trong tế bào người, điều này cho thấy tầm quan trọng nhất định của cấu trúc này.
Như vậy, với việc khẳng định chắc chắn về sự tồn tại của một dạng cấu trúc DNA mới trong các tế bào, các nhà khoa học đã có căn cứ xác thực để tiếp tục tìm hiểu chức năng thực sự của những cấu trúc này với cơ thể chúng ta.
Kết quả nghiên cứu này vừa được đăng tải trên tạp chí khoa học
*Nature Chemistry.* *(Theo Tuoitre.vn)*

WARC-Identified-Payload-Type: application/xhtml+xml

Server: Apache/2.2.32 (Unix) mod_ssl/2.2.32 OpenSSL/1.0.1e-fips mod_bwlimited/1.4

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Keep-Alive: timeout=5, max=100

Content-Type: text/html