Sử dụng CURSOR trong MS-SQL Server

1.  Khi nào dùng?

– Khi cần duyệt qua từng dòng dữ liệu của một bảng để thao tác với chúng.

-Chỉ dùng khi không còn cách nào khác để cho ra kết quả tương tự, hoặc trong khả năng của bạn, chưa thể tìm cách giải quyết, chỉ chiếm dưới 5% thôi, tùy trường hợp cụ thể,  còn hầu hết các trường hợp còn lại, đều có thể sử dụng các câu lệnh T-SQL khác để xử lý và nên sử dụng cách khác vì vấn đề tốc độ thực thi của cursor trong hầu hết trường hợp đều chậm hơn vì chúng thường sử dụng nhiều tài nguyên SQL Server.

-Hãy cân nhắc khi câu lệnh của bạn tác động đến bảng có số lượng lớn records, tốt nhất là khi bạn chắc chắn là bạn tác động đến không nhiều dữ liệu hiện tại cũng như sự phát triển số lượng dữ liệu sau này và không ảnh hưởng đáng kể đối với tốc độ của ứng dụng khi thực hiện tác vụ nào đó.

2. Dùng như thế nào?

Nhìn vào ví dụ dưới, các phần in đậm là những đoạn code cần thiết khi ta làm việc với CURSOR:

ALTER PROC up_BangKeToKhaiNhapKhauDuaVaoThanhKhoan(
	@LanThanhLy bigint,      
	@NamThanhLy int,      
	@MaDoanhNghiep varchar(50)) 
AS   
BEGIN 
	--
	DECLARE @BKToKhaiNhapDVTK  TABLE  
	(   
	 SoToKhai NVARCHAR(255),  
	 TenNPL NVARCHAR(1000), 
	 DVT VARCHAR(50), 
	 LuongNK numeric(18,8)      
	)  
	--
	DECLARE @soTK bigint --(1)
	DECLARE cs_DSTK CURSOR FOR (SELECT * FROM ufn_LayDSToKhaiDuaVaoThanhKhoan(@LanThanhLy))--(2)
	OPEN cs_DSTK --(3)
	FETCH NEXT FROM  cs_DSTK INTO @soTK --(4)
	WHILE @@FETCH_STATUS = 0 --(5)
	BEGIN
		INSERT INTO @BKToKhaiNhapDVTK			
		SELECT dbo.ufn_LaySoToKhai(dbo.ufn_LaySoToKhaiVnaccTuV4(@soTK)),				
				dbo.ufn_LayTenHangChoBaoCaoDanhSachToKhaiNhapDuaVaoThanhKhoan(@soTK, MaNPL, TenNPL,DonGiaTT, Luong),
				TenDVT_NPL, 
				Luong
		FROM ufn_LayDanhSachHangCuaToKhaiNhapDuaVaoThanhKhoan(@LanThanhLy, @NamThanhLy, @MaDoanhNghiep, @soTK)
		FETCH NEXT FROM cs_DSTK INTO @soTK --(6)
	END
	CLOSE cs_DSTK --(7)
	DEALLOCATE cs_DSTK--(8)

	SELECT * FROM @BKToKhaiNhapDVTK
END
GO

Bạn chú ý các đánh dấu số ở đoạn code trên.  (hình đoạn code trên để bạn dễ theo dõi khi đọc bài biết)

(1) Khai báo một hoặc nhiều  ‘scalar variable’, bạn dùng các biến này để thao tác với từng dòng dữ liệu được duyệt qua, các thông tin của dòng dữ liệu đang duyệt sẽ được gán vào các biến này.

Nếu cần khai báo nhiều biến, bạn có thể khai báo từng dòng, hoặc gộp luôn như  ví dụ sau:

DECLARE @soTK BIGINT, @tenTK NVARCHAR(255)

-Trường hợp bạn thao tác luôn với cả dòng dữ liệu, ví dụ INSERT tất cả dữ liệu vào một bảng, thì không cần phải khai báo.

(2)Khai báo CURSOR

DECLARE cs_DSTK CURSOR FOR (SELECT * FROM ufn_LayDSToKhaiDuaVaoThanhKhoan(@LanThanhLy))

Chi tiết phần này thì khá dài, bạn có thể tham khảo ở microsoft library, hoặc nếu tiếng Anh không tốt thì vào slideshare từ slide 9 đến 16, nội dung từ các trang này khá đầy đủ.

Một số lưu ý:

-Sau từ khóa DECLARE là tên biến cursor, thường bắt đầu bằng ‘cs_’ hoặc ‘cursor’ để phân biệt loại biến.

-Sau tờ khóa FOR là câu lệnh SELECT, bạn chỉ lấy các trường cần thao tác trong bảng dữ liệu được chọn, hoặc SELECT * nếu tất cả các trường đều cần thiết cho việc xử lý.

(3) Mở cursor bạn vừa khai báo.

OPEN [<tencursor>]

(4)Đọc qua dữ liệu từng dòng

FETCH NEXT FROM cs_DSTK INTO @soTK

Lưu ý sau câu lệnh INTO là danh sách các biến mà khi đọc một dòng, dữ liệu các trường sẽ được gán tuần tự vào.

Ví dụ khi bạn khai báo CURSOR như sau:

DECLARE cs_DSTK CURSOR FOR (SELECT SoToKhai, TenToKhai FROM ufn_LayDSToKhaiDuaVaoThanhKhoan(@LanThanhLy))

thì sau khi mở OPEN cursor, có thể lấy dữ liệu từng dòng như sau:

FETCH NEXT FROM cs_DSTK INTO @soTK,@tenTK

(5) Thao tác với dòng dữ liệu đang  được chọn

WHILE @@FETCH_STATUS = 0 
BEGIN
  <code xử lý>
  FETCH NEXT FROM cs_DSTK INTO @soTK  
END

(Bạn có biết) sau @ là khai báo biến tự định nghĩa, còn sau @@ là tên biến hệ thống, nó sẽ hiển thị màu hồng.

Trong phần <code xử lý> bạn có thể thao tác xử lý theo mục đích của bạn, thêm, sửa, xóa lên các bảng có dự liệu liên quan, hoặc xử lý với bảng tạm nào đó,v..v.

Ví dụ như trên, mình đang tạo một báo cáo với dữ liệu được lấy từ nhiều function khác nhau với tham số hàm có @soTK được đọc lần lượt từ các dòng dữ liệu trong cursor. Các dữ liệu này được INSERT vào một biến bảng (table variable) tên @BKToKhaiNhapDVTK, đó là dữ liệu ta cần lấy.

(6) Đọc dòng tiếp theo, tương tự (4)

FETCH NEXT FROM cs_DSTK INTO @soTK

(7) Giải phóng dữ liệu tham chiếu bên trong CURSOR

CLOSE cs_DSTK

(8) Giải phóng CURSOR ra khỏi bộ nhớ.

DEALLOCATE cs_DSTK

Đến đây mới thực sự hủy cursor, bất kỳ tham chiếu đến tên cursor đã hũy đều gây ra lỗi.

3. Tổng kết.

-Bạn chỉ nên sử dụng CURSOR khi không thấy phương pháp nào khả dĩ hơn, cân nhắc kĩ về tốc độ thực thi của ứng dụng khi sử dụng nó.

-Cách sử dụng của CURSOR khá đơn giản

+Khai báo cursor với một SELECT <các trường cần lấy> trong một bảng nào đó

+Đọc qua từng dòng dự liệu , gán tuần tự cho các biến đã khai báo nếu thấy cần thiết

+Thao tác với dữ liệu đọc được từng dòng

+Đọc dòng tiếp theo

+Khi đọc hết thì giải phóng các dòng dữ liệu tham chiếu và giải phóng cursor.

4. Các vấn đề mở rộng.

Bài tiếp theo, mình sẽ bàn về các phương pháp giúp thay thế cursor bằng các T-SQL query .
–================================ HAPPY READING & HAPPY LEARNING ===============================– 
–==========================================****tieunai****===========================================– 

Insert hình ảnh vào Sql Server trong C#

Insert hình ảnh vào Sql Server trong C#
Insert hình ảnh vào Sql Server trong C#

Khi làm việc với các ứng dụng quản lý trên C# như ứng dụng quản lý sinh viên, quản lý nhân viên, … chúng ta có nhiều tình huống cần lưu trữ hình ảnh, ví dụ như là hình ảnh của sinh viên, nhân viên… Làm sao chúng ta giải quyết vấn đề đó?
Các giải pháp nào để lưu trữ hình ảnh. Nếu muốn lưu hình ảnh đó vào Cơ sở dữ liệu Sql Server thì làm thế nào? Làm sao để hiển thị chúng ra ngoài ứng dụng?

Video Insert hình ảnh vào Sql Server trong C#

Tóm tắt Video

  • Các loại lưu trữ hình ảnh. Ưu và nhược điểm?
  • Tạo Cơ sở dữ liệu bảng Student (lưu thông tin sinh viên)
  • Tạo dự án WindowForm mới
  • Tạo form thêm sinh viên
  • Tạo DataGridview load danh sách sinh viên
  • Code xử lý chuyển ảnh thành byte.
  • Code xử lý chuyển byte thành ảnh
  • Code xử lý dữ liệu, (select, insert….)
Nếu bạn đã hoàn thành theo hướng dẫn mà vẫn gặp khó khăn, hãy tải mã nguồn ứng dụng tại đây:  Download

Cảm ơn bạn đọc và mình luôn đánh giá cao phản hồi của bạn.

Categories and Subcategories

The adjacency model

The fundamental structure of the adjacency model is a one-to-many relationship between a parent entry and its child entries. As with any one-to-many relationship, the child entries carry a foreign key to their parent. What makes the adjacency model different is that the parent and child entries are both stored in the same table.

create table categories
( id       integer     not null  primary key 
, name     varchar(37) not null
, parentid integer     null
, foreign key parentid_fk (parentid) 
      references categories (id)
);

Here’s some sample data that might populate this table, and we should be able to get an idea of the parent-child relationships (if not grasp the entire hierarchy) just by looking at the data:

id name parentid
1 animal NULL
2 vegetable NULL
3 mineral NULL
4 doggie 1
5 kittie 1
6 horsie 1
7 gerbil 1
8 birdie 1
9 carrot 2
10 tomato 2
11 potato 2
12 celery 2
13 rutabaga 2
14 quartz 3
15 feldspar 3
16 silica 3
17 gypsum 3
18 hunting 4
19 companion 4
20 herding 4
21 setter 18
22 pointer 18
23 terrier 18
24 poodle 19
25 chihuahua 19
26 shepherd 20
27 collie 20

Terms commonly used with the adjacency model include tree, root, node, subtree, leaf, path, depth and level. There can be one or more trees in the table, and the parent foreign key is NULL for each tree’s root node. A root node is therefore at the “top” of its tree. A node is any entry, while a leaf is any node that has no children, i.e. for which there exists no other node having that node as its parent. A subtree is the portion of the tree “under” any node. The depth of a subtree is the maximum number of levels of subtree beneath that node. These may not be official terminology definitions, but they work for me.

Why is it called a tree when it grows down from the “root” which is at the top? Mere convention.

Now let’s see how a tree or hierarchy can be used to implement a category/subcategory structure.

Working with categories and subcategories

Using the adjacency model to implement categories and subcategories can be reduced to two simple steps:

  1. manage the hierarchical data
  2. display the hierarchical data

Managing the hierarchy is nothing special. Just look again at the table layout. There’s a primary key column (id) and a foreign key referencing it (parentid). Other than that, it’s a dead simple table. Use INSERT, UPDATE, and DELETE as with any other table. Whether we actually declare the foreign key on parentid, which is necessary for referential integrity, is secondary to the basic design. (Referential integrity means that the parent row should exist before the child row referencing it is inserted, and so on. See the article Relational Integrity in the Resources below.)

Displaying the hierarchy is challenging, but not difficult. Categories and subcategories can be handled in HTML in many ways. Current best practice is to use nested unordered lists. For further information, see Listamatic: one list, many options in the Resources below.

Displaying all categories and subcategories: site maps and navigation bars

To display the hierarchy, we must first retrieve it. The following method involves using as many LEFT OUTER JOINs as necessary to cover the depth of the deepest tree. For our sample data, the deepest tree has four levels, so the query requires four self-joins. Each join goes “down” a level from the node above it. The query begins at the root nodes.

select root.name  as root_name
     , down1.name as down1_name
     , down2.name as down2_name
     , down3.name as down3_name
  from categories as root
left outer
  join categories as down1
    on down1.parentid = root.id
left outer
  join categories as down2
    on down2.parentid = down1.id
left outer
  join categories as down3
    on down3.parentid = down2.id
 where root.parentid is null
order 
    by root_name 
     , down1_name 
     , down2_name 
     , down3_name

Notice how the WHERE clause ensures that only paths from the root nodes are followed. This query produces the following result set:

root_name down1_name down2_name down3_name
animal birdie NULL NULL
animal doggie companion chihuahua
animal doggie companion poodle
animal doggie herding collie
animal doggie herding shepherd
animal doggie hunting pointer
animal doggie hunting setter
animal doggie hunting terrier
animal gerbil NULL NULL
animal horsie NULL NULL
animal kittie NULL NULL
mineral feldspar NULL NULL
mineral gypsum NULL NULL
mineral quartz NULL NULL
mineral silica NULL NULL
vegetable carrot NULL NULL
vegetable celery NULL NULL
vegetable potato NULL NULL
vegetable rutabaga NULL NULL
vegetable tomato NULL NULL

Each row in the result set represents a distinct path from a root node to a leaf node. Notice how the LEFT OUTER JOIN, when extended “below” the leaf node in any given path, returns NULL (representing the fact that there was no node below that node, i.e. satisfying that join condition).

As we can see, this result set contains all our original categories and subcategories. If the categories and subcategories are being displayed on a web site, this query can therefore be used to generate the complete site map. An abbreviated query, that goes down only a certain number of levels from the roots, regardless of whether there may be nodes at deeper levels, can be used for the site’s navigation bar.

We can display this sample data using nested unordered lists like this:

  • animal
    • birdie
    • doggie
      • companion
        • chihuahua
        • poodle
      • herding
        • collie
        • shepherd
      • hunting
        • pointer
        • setter
        • terrier
    • gerbil
    • horsie
    • kittie
  • mineral
    • feldspar
    • gypsum
    • quartz
    • silica
  • vegetable
    • carrot
    • celery
    • potato
    • rutabaga
    • tomato

What’s the easiest way to transform the result set into the nested ULs? In ColdFusion, we use nested CFOUTPUT tags, with the GROUP= parameter on all but the innermost list. Very straightforward indeed. In other scripting languages, as the saying goes, your mileage may vary. Take comfort in the fact that once you’ve coded it, you will never have to change your site map page again.

What if the hierarchy is more than, say, three or four levels deep? What if it’s fifteen levels deep? My response to this question is threefold.

First, a query with fifteen self-joins may be a little more tedious to code but most assuredly will not present any difficulty to your database engine.

Second, in certain databases such as Oracle and DB2, recursion is built in, so you can go as many levels deep as you wish—although don’t fool yourself, the coding required to display an arbitrary number of levels is no picnic either. Do not make the mistake of simulating recursion by coding a script module that calls itself, because from the database perspective, this is a series of calls (a query in a loop) and the performance will reflect this.

Thirdly, if you have a tree that goes more than three or four levels deep, you may have difficulty conveying this structure satisfactorily in a visual way. You may want to go back and re-think how you expect your users to actually navigate through the hierarchy. Sometimes the best solution is simply to show no more than three levels, with some sort of visual clue that there are further levels below the nodes shown.

The path to the root: the breadcrumb trail

Retrieving the path from any given node, whether it is a leaf node or not, to the root at the top of its path, is very similar to the site map query. Again, we use LEFT OUTER JOINs, but this time we go “up” the tree from the node, rather than “down.”

select node.name as node_name 
     , up1.name as up1_name 
     , up2.name as up2_name 
     , up3.name as up3_name 
  from categories as node
left outer 
  join categories as up1 
    on up1.id = node.parentid  
left outer 
  join categories as up2
    on up2.id = up1.parentid  
left outer 
  join categories as up3
    on up3.id = up2.parentid
order
    by node_name

Here’s the result set from this query:

node_name up1_name up2_name up3_name
animal NULL NULL NULL
birdie animal NULL NULL
carrot vegetable NULL NULL
celery vegetable NULL NULL
chihuahua companion doggie animal
collie herding doggie animal
companion doggie animal NULL
doggie animal NULL NULL
feldspar mineral NULL NULL
gerbil animal NULL NULL
gypsum mineral NULL NULL
herding doggie animal NULL
horsie animal NULL NULL
hunting doggie animal NULL
kittie animal NULL NULL
mineral NULL NULL NULL
pointer hunting doggie animal
poodle companion doggie animal
potato vegetable NULL NULL
quartz mineral NULL NULL
rutabaga vegetable NULL NULL
setter hunting doggie animal
shepherd herding doggie animal
silica mineral NULL NULL
terrier hunting doggie animal
tomato vegetable NULL NULL
vegetable NULL NULL NULL

Here each row in the result set is a single path, one for every node in the table. On a web site, such a path is often called a breadcrumb trail. (This name is somewhat misleading, because it suggests that it might represent how the visitor arrived at the page, which is not always the case. The accepted meaning of breadcrumb is simply the path from the root.)

In practice, we’d have a WHERE clause that would specify a single node, so in effect, the results above are all of the breadcrumbs in the table.

To display a breadcrumb trail in the normal fashion, from root to node, just display the result set columns in reverse order, and ignore the nulls. For example, let’s say we run the above query for the category “companion” and get this:

node_name up1_name up2_name up3_name
companion doggie animal NULL

The breadcrumb would look like this:

Simple, eh?

Nguồn: http://sqllessons.com/categories.html

Kiểm tra khóa chính trước khi Insert trong Stored Procedure

Khi làm việc với Cơ sở dữ liệu chúng ta hay gặp các tình huống phát sinh lỗi do ràng buộc dữ liệu. Ví dụ khi người dùng đăng ký thành viên, chúng ta cần kiểm tra email có tồn tại hay chưa? Hoặc thêm một sản phẩm (ở đây là sách) vào trong CSDL, cần kiểm tra mã sách tồn tại hay chưa? Chúng ta dễ dàng kiểm tra bằng hàm EXISTS  trong Stored Procedure của SQL.

SQL EXISTS được sử dụng kết hợp với một truy vấn phụ và được coi là đáp ứng, nếu trả về ít nhất một dòng . Nó có thể được sử dụng trong các trường hợp như SELECT, INSERT, UPDATE, hoặc DELETE .

Hướng dẫn sau giúp bạn kiểm tra Mã sách tồn tại hay chưa trước khi thực thi lệnh INSERT dữ liệu. Nếu có rồi thì bỏ qua, ngược lại thì INSERT vào trong CSDL.

Code tạo bảng mẫu

Create Table Book
(
    BookID nvarchar(50) primary key,
    Name nvarchar(50),
    Author nvarchar(50)
)
insert into Book(BookID, Name, Author) values('B01',N'Lá nằm trong lá',N'Nguyễn Nhật Ánh')

Code tạo thủ tục

create procedure Book_Insert
(
    @BookID nvarchar(50),
    @Name nvarchar(50),
    @Author nvarchar(50)
)
as
begin
    if not exists(select top 1 BookID from Book where BookID = @BookID)
        insert into Book(BookID, Name, Author) values(@BookID,@Name,@Author)
end
-- Test
exec Book_Insert 'B02', 'Văn học VN','Không rõ'

Chúc các bạn thành công

Các kiểu dữ liệu trong SQL Server

Khi thực hành với SQL server thì đa số chúng ta có người thì hiểu lơ mơ, có người thì chỉ chép lại bài thực hành mà không hiểu kiểu biến đó được dùng để làm gì. Cái đó rất là bất cập, để có thể hiểu rõ hơn về các kiểu dữ liệu khi ép kiểu mình xin đưa ra những tổng hợp mà mình tìm hiểu và biết được.

 

DATA TYPES DESCRIPTION
bigint Integer data from -2^63 through 2^63-1
int Integer data from -2^31 through 2^31 – 1
smallint Integer data from -2^15 through 2^15 – 1
tinyint Integer data from 0 through 255
bit Integer data with either a 1 or 0 value
decimal Fixed precision and scale numeric data from -10^38 +1 through 10^38 -1
numeric Fixed precision and scale numeric data from -10^38 +1 through 10^38 -1
money Monetary data values from -2^63 through 2^63 – 1
smallmoney Monetary data values from -214,748.3648 through +214,748.3647
float Floating precision number data from -1.79E + 308 through 1.79E + 308
real Floating precision number data from -3.40E + 38 through 3.40E + 38
datetime Date and time data from January 1, 1753, through December 31, 9999,
with an accuracy of 3.33 milliseconds
smalldatetime Date and time data from January 1, 1900, through June 6, 2079,
with an accuracy of one minute
char Fixed-length character data with a maximum length of 8,000 characters
varchar Variable-length data with a maximum of 8,000 characters
text Variable-length data with a maximum length of 2^31 – 1 characters
nchar Fixed-length Unicode data with a maximum length of 4,000 characters
nvarchar Variable-length Unicode data with a maximum length of 4,000 characters
ntext Variable-length Unicode data with a maximum length of 2^30 – 1 characters
binary Fixed-length binary data with a maximum length of 8,000 bytes
varbinary Variable-length binary data with a maximum length of 8,000 bytes
image Variable-length binary data with a maximum length of 2^31 – 1 bytes
cursor A reference to a cursor
sql_variant A data type that stores values of various data types,
except text, ntext, timestamp, and sql_variant
table A special data type used to store a result set for later processing
timestamp A database-wide unique number that gets updated every time
a row gets updated
uniqueidentifier A globally unique identifier

———————————————————————————————————————–

Diễn giải:

Binary: Là kiểu dữ liệu chứa dạng số ở hệ hexa, gồm 3 kiểu dữ liệu Binary, Varbinary, Image.

Text: Là kiểu ký tự, chứa chữ cái, ký hiệu, số, gồm những kiểu dữ liệu sau:

– Char: Kiểu ký tự, khi xác định độ dài thì độ dài trong CSDL sẽ xác định theo độ dài đặt trước mà không theo độ dài dữ liệu thực có, không sử dụng với ký tự dạng Unicode, độ dài tối đa là 8000.
– Ncharr: Tương tự như Char nhưng sử dụng với ký tự Unicode, độ dài tối đa 4000.
– Nvarchar: Tương tự như NChar nhưng kích thước trong CSDL sẽ là kích thước thực dữ liệu hiện có, không tính theo kích thước đặt trước, kích thước tối đa là 4000.
– Varchar: Tương tự như Nvarchar nhưng không hỗ trợ Unicode.
– Text: Kiểu văn bản, chứa cả ký tự xuống dòng, lưu trữ theo dạng văn bản, có kích thước lớn, có thể lên đến vài Gb, cơ chế quản lý kiểu dữ liệu theo dạng con trỏ và cách thức chèn và cập nhật sẽ khác, kiểu dữ liệu này không hỗ trợ cho Unicode.
– Ntext: Tương tự như Text nhưng có hỗ trợ Unicode.

Data/Time: Kiểu dữ liệu ngày, thời gian, ngày và thời gian, gồm 2 kiểu:

– DateTime: Đầy đủ cả ngày và thời gian.
– SmallDataTime: Chỉ ngày hoặc thời gian.

Numeric: Dữ liệu kiểu số, gồm các kiểu dữ liệu sau:

– Int, smallint, tinyint, bigint: Số nguyên
– Float, real, decimal, numeric: Số thực.

Monetary: Tiền tệ:

– Money, Smallmoney.

Bit: Kiểu số 0, 1.

Sql_variant: Là kiểu dữ liệu xác định theo kiểu dữ liệu khác, một cột dữ liệu được định nghĩa dữ liệu kiểu này có thể lưu trữ nhiều dữ liệu có kiểu khác nhau trong cùng một bảng. Ví dụ có thể lưu trữ nhiều kiểu dữ liệu int, binary, char, nhưng không chứa dữ liệu kiểu text, ntext, image, timestamp, sql_variant.

Timestamp: Là kiểu dữ liệu có kích thước 8 byte, lưu trữ dạng số nhị phân do hệ thống tự sinh ra, mỗi giá trị timestamp trong CSDL là duy nhất.

XML: Là kiểu dùng để lưu trữ dữ liệu dưới dạng xml

 

Nguồn: tham khảo internet

SQL Server connection strings

Chào các bạn. Trong quá trình tham gia các diễn đàn, mình hay bắt gặp nhiều bạn hay gặp lỗi khi kết nối CSDL trong C#, hay ASP.NET. Do vậy mình chia sẻ một số cách kết nối chuẩn SQL Server connection strings dùng trong các ứng dụng liên quan tới SQL Server như lập trình C#, ứng dụng web ASP.NET, MVC… Hy vọng các bạn bớt khó khăn hơn khi gặp tình huống như vậy. 🙂

Standard Security

Server=myServerAddress;Database=myDataBase;User Id=myUsername; Password=myPassword;
VD: Server=TUANITPRO.com;Database=myDataBase;User Id=myUsername; Password=myPassword;
hoặc
Server=192.168.1.100;Database=myDataBase;User Id=myUsername; Password=myPassword;

Trusted Connection

Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;

Connection to a SQL Server instance

Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername;Password=myPassword;
VD:
Server=TUANITPRO-PC\SQLEXPRESS;Database=myDataBase;User Id=myUsername; Password=myPassword;

hoặc
Server=TUANITPRO-PC\SQLEXPRESS;Database=myDataBase;UID=myUsername; PWD=myPassword;
hoặc
Server=.\SQLEXPRESS;Database=myDataBase;User Id=myUsername;Password=myPassword;

Server=.\SQLEXPRESS;Database=myDataBase;UID=myUsername; PWD=myPassword;

Ngoài ra còn một số cách viết khác trong .NET

Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;User ID=myDomain\myUsername;Password=myPassword;
VD:
Data Source=TUANITPRO.com;Initial Catalog=myDataBase;Integrated Security=SSPI;User ID=myUsername;Password=myPassword;
Data Source=192.168.1.100;Initial Catalog=myDataBase;Integrated Security=SSPI;User ID=myDomain\myUsername;Password=myPassword;
Data Source=TUANITPRO-PC\SQLEXPRESS;Initial Catalog=myDataBase;Integrated Security=SSPI;User ID=myDomain\myUsername;Password=myPassword;
Data Source=.\SQLEXPRESS;Initial Catalog=myDataBase;Integrated Security=SSPI;User ID=myDomain\myUsername;Password=myPassword;

*Cách này dùng khi kết nối file *.mdf trong thư mục App_Data của ứng dung web .NET

Server=.\SQLExpress;AttachDbFilename=|DataDirectory|mydbfile.mdf;Database=dbname;Trusted_Connection=Yes;

Chúc các bạn thành công.