Làm việc với cơ sở dữ liệu – ADO.NET

2 Tháng 4

Trong bài viết hôm nay, chúng ta sẽ tìm hiểu về cách thức truy cập đến dữ liệu thông qua mô hình ADO.NET. Từ đó, các bạn có thể tự mình viết một ứng dụng đơn giản có sử dụng cơ sở dữ liệu

ADO.NET là mô hình mà các ứng dụng .NET sử dụng để có thể làm việc với các hệ quản trị cơ sở dữ liệu cũng như các nguồn dữ liệu khác (gọi chung là nguồn dữ liệu – data sources). Trước khi .NET xuất hiện thì mô hình được sử dụng để kết nối là ADO (ActiveX Data Object). Với sự ra đời của .NET thì ADO.NET cũng được phát triển để có thể giúp lập trình viên viết ứng dụng làm việc với các nguồn dữ liệu dễ dàng hơn và thống nhất hơn nhờ việc sử dụng chung các kiểu dữ liệu, các mẫu thiết kế (design pattern) và các quy tắc đặt tên.

ADO.NET được thiết kế với các tính năng: kiến trúc dữ liệu không kết nối (disconnected data architecture), tích hợp với XML, và được tối ưu để kết nối với cơ sở dữ liệu (và các nguồn dữ liệu khác). Mặc khác, mô hình lập trình ADO.NET cũng khá giống ADO, do đó rút ngắn thời gian tìm hiểu cho những ai đã sử dụng qua ADO trong quá khứ.

Tham khảo thêm: http://msdn.microsoft.com/en-us/library/e80y5yhx(v=vs.80).aspx

Đó là các thông tin tổng quan chung về ADO.NET, sau đây chúng ta sẽ tìm hiểu chi tiết về ADO.NET qua một ví dụ mẫu để hiểu được cách thức làm việc của ADO.NET là như thế nào, các thành phần bên trong nó gồm có những gì và sử dụng chúng ra sao. Chúng ta sẽ viết một chương trình đơn giản dùng để quản lý danh sách, giao diện của chương trình như sau:

image

Sau khi hoàn thành ứng dụng này, chúng ta sẽ có được các kiến thức sau đây:

  • Ôn lại kiến thức về Windows Forms
  • Biết được cách tạo kết nối và truy xuất dữ liệu từ SQL Server
  • Biết được cách thực thi câu lệnh SQL từ ứng dụng
  • Hiểu cơ bản về Data Binding
  • Biết cách sử dụng DataGridView

OK, let’s get started

Trước hết, chúng ta tạo một ứng dụng Windows Forms Application bằng ngôn ngữ C# trong Visual Studio và đặt tên cho ứng dụng này là ADONET (hoặc là tên gì đó mà bạn thích)

Đổi thuộc tính Name của Form1 thành MainForm và thay đổi một số thuộc tính như sau:

  • StartPosition: CenterScreen, mục đích là để form xuất hiện giữa màn hình lúc chạy
  • Text: “Quản lý danh sách”, tiêu đề của form

Tiếp theo, chúng ta kéo control DataGridView và các Label, TextBox từ ToolBox vào trong Form cùng để có được giao diện như sau, tên của các control được đặt lại là:

  • DataGridView: gridStudent
  • Nút Thêm: btnAdd; nút Xóa: btnDelete; nút Lưu: btnSave
  • Tên: txtName; Tuổi: txtAge; Email: txtEmail và Địa chỉ: txtAddress

image 

Thông tin lưu trữ của chúng ta là sinh viên và mỗi người bao gồm các thông tin sau đây: Họ tên, Tuổi, Email, Địa chỉ. Để tạo cơ sở dữ liệu, chúng ta chọn trong cửa sổ Server Explorer chức năng Connect To Database (nếu không thấy cửa số Server Explorer thì chọn từ Menu View-> Server Explorer). Lưu ý, máy tính phải được cài đặt SQL Server trước. Mặc định khi cài Visual Studio, các bạn đã được cài SQL Server Express

image 

Hộp thoại Connect To Database xuất hiện, chúng ta sẽ thấy hộp thoại có giao diện như sau:

image

Một số thành phần trong hộp thoại:

  • Data Source: chỉ định nguồn cung cấp dữ liệu cho ứng dụng. Mặc định là SQL Server, nếu thao tác với các nguồn dữ liệu khác thì chúng ta có thể thay đổi bằng cách nhất nút Change và chọn trong danh sách các loại máy chủ cung cấp dữ liệu
  • Server Name: Thông thường, nếu bạn cài đặt SQL Server Express thì tên máy chủ sẽ là “.\SQLEXPRESS” (trong đó dấu .\ có nghĩa là máy chủ chính là máy tính đang dùng – local), còn nếu như là phiên bản SQL Server đầy đủ thì tên máy chủ thường là “.\”. Để biết cụ thể tên máy chủ của mình là gì, các bạn mở SQL Server Configuration Manager (All Program-> Microsoft SQL Server –> Configuration Tools –> SQL Server Configuration Manager). Các bạn sẽ thấy danh sách các máy chủ SQL hiện có trong máy kèm theo tên. Ví dụ trong hình sau thì máy tính hiện tại có sử dụng SQL Server Express (tên máy chủ ở trong dấu ngoặc đơn).image
  • Log on to the server: chọn kiểu chứng thực để đăng nhập vào Cơ sở dữ liệu. Nếu bạn nào đã từng học qua môn CSDL thì sẽ biết tác dụng của phần này, mục đích của nó là xác nhận tài khoản được phép truy cập vào SQL Server. Mặc định của SQL Express là Windows Authentication, còn đối với các phiên bản khác thì tùy chọn này phụ thuộc lúc bạn cài đặt SQL Server.
  • Connect to a database: nếu như các bạn đã gõ Server Name ở trên rồi thì các bạn sẽ có thể nhập vào tên database cần tạo ra trong ô “Select or enter a database name”. Nếu như muốn sử dụng một database đã có sẵn thì chúng ta nhấp vào mũi tên xổ xuống để chọn database. Phần Attach a database file cho phép các bạn tạo ra một tập tin database nằm chung với ứng dụng. Khi đó, nếu như sao chép ứng dụng qua nơi khác thì tập tin này cũng được copy theo cùng. Sau khi thực hiện xong, các bạn nhấn Test Connection để kiểm tra. Nếu như hộp thoại MessageBox hiện thông báo Test Connection Succeeded thì các bạn có thể tiếp tục thực hiện phần tiếp theo. Còn không thì các bạn cần phải kiểm tra lại các thông tin mình cung cấp có chính xác hay chưa (Server Name, Authentication, Database Name…)

    Sau khi tạo thành công database, chúng ta sẽ tạo bảng dữ liệu. Trong cửa sổ Server Explorer, các bạn chọn vào database vừa tạo, mở đến nhãn Table, nhấn chuột phải chọn Add New Table.

image

Table này sẽ có các cột như sau:

image

Trường ID của chúng ta có kiểu nguyên và là trường tự động tăng (chắc các bạn vẫn còn nhớ tạo khóa IDENTITY trong môn CSDL). Để cho trường này là tự động tăng, các bạn chọn dòng của trường này và thay đổi giá trị Identity trong cửa sổ Column Properties ngay bên dưới. Chi tiết các bạn xem hình vẽ sau:

image

Lưu lại bảng này với tên Student. Sau đó, các bạn nhập vào một vài dòng dữ liệu để test ứng dụng. Nhấp chuột phải lên tên bảng, chọn Show Table Data và thực hiện việc nhập dữ liệu. Lưu ý là chúng ta không cần phải nhập dữ liệu vào cột ID bởi vì dữ liệu cột này sẽ được tự động sinh ra

image

Như vậy là chúng ta xong phần thiết lập cơ sở dữ liệu. Công việc cần thiết bây giờ là kết nối đến cơ sở dữ liệu, lấy dữ liệu ra sử dụng. Chúng ta hoàn toàn có thể sử dụng các Wizard để thực hiện các kết nối đến CSDL, tuy nhiên, trong ứng dụng này chúng ta sẽ viết code để hiểu rõ chi tiết hoạt động của các thành phần là như thế nào.

Đoạn code sau đây được khai báo trong lớp của Form chúng ta vừa tạo (chọn Form, nhấp chuột phải chọn View Code hoặc nhấn F7)

//Tạo kết nối đến database
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Xuan Chien\Desktop\ITIC\ADONET\StudentDB.mdf;Integrated Security=True;User Instance=True");

//Data Adapter
SqlDataAdapter da;

//DataSet dùng để lưu trữ lại dữ liệu lấy từ SQL Server
DataSet ds = new DataSet();

//ID hiện tại
int studentID = -1;

//Nếu người dùng dùng chức năng thêm thì add=true
bool add = false;

Giải thích:

  • SqlConnection: dùng để chỉ rõ là chúng ta kết nối đến đâu. Để chỉ định các thông tin như Server Name, Database Name, Authentication thì ta cần phải truyền vào cho constructor của lớp SqlConnection một chuỗi kết nối (Connection String). Chi tiết về chuỗi kết nối thì các bạn xem tại: connectionstrings.com. Nói một cách tổng quát, chuỗi kết nối là cách chúng ta truyền vào thông tin cách thức kết nối đến nguồn dữ liệu. Ví dụ, xét chuỗi kết nối sau: “Data Source=.\sqlexpress;Initial Catalog=AdventureWorksLT2008;Integrated Security=True”. Trong chuỗi kết nối, chúng ta đã chỉ định rằng Server của SQL Server là .\sqlexpress, CSDL được dùng là AdventureWorksLT2008, cơ chế chứng thực là Windows Authentication.
  • DataSet: đây là đối tượng mà sẽ chứa toàn bộ dữ liệu chúng ta truy xuất được từ database. Ứng dụng của chúng ta sẽ thao tác trên dữ liệu trong DataSet này. Sử dụng DataSet cho phép chúng ta chỉ truy xuất dữ liệu từ database 1 lần duy nhất và kết nối đến Database sẽ được ngắt đi ngay sau khi truy xuất.
  • SqlDataAdapter: đối tượng của lớp này hoạt động như là một cầu nối để đưa dữ liệu từ database đổ vào DataSet. Đối tượng lớp này chịu trách nhiệm tự động quản lý đóng mở kết nối đến database.
  • studentIDadd: giải thích sau

Đoạn code quan trọng tiếp theo nằm trong hàm xử lý sự kiện Load của Form dùng để đưa dữ liệu lên Grid. Nội dung đoạn code như sau:

//Tạo Data Adapter
da = new SqlDataAdapter("Select * from Student", connection);

//Data Adapter sẽ tự động sinh ra khóa chính từ khóa chính ở Database
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

//Kết nối và đưa dữ liệu vào DataSet
da.Fill(ds, "Student");

//Hiển thị lên Data Grid View (Data Binding)
gridStudent.DataSource = ds.Tables["Student"];

Chúng ta trước khởi tạo một đối tượng SqlDataAdapter, cung cấp cho constructor câu lệnh Select để lấy dữ liệu và đối tượng chứa kết nối đến Database. Sau đó, chúng ta chỉnh giá trị của thuộc tính MissingSchemaAction sang AddWithKey để yêu cầu DataAdapter ánh xạ trường khóa chính vào trong DataSet. Nhờ việc thiết lập này mà sau này ta có thể tìm kiếm một dòng dữ liệu trên DataSet bằng cách cung cấp giá trị khóa. Đến đây thì việc kết nối đến CSDL và truy xuất vẫn chưa được thực hiện. Chỉ khi các bạn gọi phương thức Fill của DataAdapter thì lúc này dữ liệu mới được lấy từ Database và đổ vào DataSet. Tham số thứ 2 của phương thức Fill là chỉ định tên của bảng dữ liệu mà chúng ta sẽ quy định cho dữ liệu được đưa vào DataSet. Tên này không nhất thiết là phải giống như tên bảng dưới cơ sở dữ liệu mà có thể là một cái tên bất kỳ.

Dữ liệu đã được lấy ra, việc cuối cùng chỉ là hiển thị nó lên giao diện người dùng. Chúng ta sẽ chỉ định thuộc tính DataSource của gridStudentds.Tables[“Student”]. Điều này có nghĩa là sử dụng dữ liệu nằm trong một bảng có tên “Student” ở trong DataSet. Các bạn cần nhớ rằng 1 DataSet thì có thể chứa nhiều dữ liệu từ các bảng khác nhau. Việc gắn dữ liệu từ Database lên giao diện được gọi là DataBinding. Đối với các control khác như ListBox hay ComboBox thì chúng ta cũng có thể Binding dữ liệu vào thông qua thuộc tính DataSource và các thuộc tính DisplayMember, DisplayValue

Sau khi đã hoàn thành các bước ở trên thì khi chạy chương trình, chúng ta sẽ có được giao diện như sau:

image

Việc tiếp theo đó là chúng ta phải hiển thị thông tin chi tiết của dòng dữ liệu đang được chọn trong Grid vào các TextBox bên phải cửa sổ. DataGridView cung cấp cho chúng ta sự kiện RowEnter. Sự kiện này sẽ được gọi mỗi khi có một ô trên dòng nào đó được chọn (RowIndex thay đổi). Phương thức xử lý của sự kiện này là như sau:

private void gridStudent_RowEnter(object sender, DataGridViewCellEventArgs e)
{
    //Người dùng đang trong chế độ chỉnh sửa dữ liệu
    add = false;

    //Lấy ID của dòng hiện tại đang được chọn trong GridView
    studentID = Int32.Parse(gridStudent.Rows[e.RowIndex].Cells["ID"].Value.ToString());

    //Lấy ra dòng dữ liệu được chọn trong DataSet
    DataRow dr = ds.Tables["Student"].Rows.Find(studentID);

    //Hiển thị thông tin lên các TextBox
    txtName.Text = dr["Name"].ToString();
    txtAge.Text = dr["Age"].ToString();
    txtEmail.Text = dr["Email"].ToString();
    txtAddress.Text = dr["Address"].ToString();
}

Trước hết, chúng ta thiết lập giá trị cho biến add thành false. Mục đích của biến này là để cho ứng dụng của chúng ta biết là chúng ta đang thêm mới một dòng dữ liệu hay là đang chỉnh sửa dữ liệu hiện có khi nhấn nút “Lưu”. Vì khi người dùng chọn vào một dòng, thông tin dữ liệu của dòng này được hiển thị và cho phép người dùng chỉnh sửa nên biến add được thiết lập giá trị là false.

Tiếp theo đó, chúng ta lấy ra ID của dòng dữ liệu được chọn. Các bạn để ý thấy rằng khi chạy chương trình, chúng ta có một cột dữ liệu có tên là ID. Dựa vào cột ID này mà chúng ta biết được ID của dòng dữ liệu được chọn. Giá trị ID này được lưu vào biến studentID của form nhằm sử dụng cho trường hợp cập nhật dữ liệu trong sự kiện của nút “Lưu”

Đã có được ID của dòng dữ liệu, bây giờ chúng ta chỉ cần lấy ra dòng dữ liệu thực sự chứa ID này trong DataSet của chúng ta. Việc truy xuất này khá đơn giản, chỉ cần chúng ta chỉ định bảng nào trong DataSet cần lấy dữ liệu và dùng phương thức Find của tập Rows trên bảng dữ liệu đó. Các bạn có thể thắc mắc là làm sao nó biết được phải tìm kiếm trên cột nào trong bảng. Theo mặc định nó sẽ tìm kiếm trên khóa chính của bảng, đó là lý do tại sao chúng ta phải thiết lập thuộc tính MissionSchemaAction của DataAdapter. Sau khi lấy được dòng dữ liệu này rồi thì chúng ta thiết lập giá trị Text của các TextBox nhằm hiển thị dữ liệu.

Nhấn F5 để chạy chương trình, kết quả chúng ta có được là như sau:

image

Công việc cuối cùng lúc bấy giờ chính là viết sự kiện xử lý cho các button của chúng ta. Hãy lần lượt đi qua từng phương thức xử lý sự kiện click của mỗi Button để hiểu rõ chức năng và cách chúng hoạt động.

  1. Thêm

    Khi người dùng nhấn nút “Thêm”, chúng ta chỉ đơn giản là xóa nội dung Text trong những TextBox để người dùng nhập thông tin mới, đồng thời thay đổi biến add thành true (các bạn có thể dễ dàng nhận thấy add hoạt động như một biến cờ để thông báo về sự thay đổi trạng thái)

    //Xóa nội dung trong các TextBox chuẩn bị cho dữ liệu nhập
    txtName.Text = "";
    txtAge.Text = "";
    txtAddress.Text = "";
    txtEmail.Text = "";
    
    //Chuyển sang chế độ Thêm dữ liệu
    add = true;

  2. Xóa

    Khi người dùng nhấn nút “Xóa”, chúng ta trước hết kiểm tra xem thực sự có dòng nào đang được chọn trên gridStudent hay không, sau đó hiển thị một MessageBox hỏi người dùng có chắc chắn muốn xóa dữ liệu này. Nếu người dùng đồng ý thì chúng ta thực hiện xóa dòng dữ liệu tương ứng trên DataSet và cập nhật xuống database

    private void btnDelete_Click(object sender, EventArgs e)
    {
        //Chắc chắn rằng người dùng đang chọn một dòng trên grid
        if (gridStudent.SelectedCells.Count == 0)
            return;
    
        //Hiển thị thông báo xóa dữ liệu
        DialogResult result = MessageBox.Show("Bạn có thật sự muốn xóa dòng dữ liệu này?", "Thông báo", MessageBoxButtons.YesNo);
        if (result == System.Windows.Forms.DialogResult.Yes)
        {
            DataRow dr = ds.Tables["Student"].Rows.Find(studentID);
            dr.Delete();
            SqlCommandBuilder commandBuiler = new SqlCommandBuilder(da);
            da.Update(ds, "Student");
        }
    }

    Các bạn lưu ý dòng khởi tạo đối tượng SqlCommandBuilder. Nếu như chúng ta chỉ muốn hiển thị dữ liệu thì dòng này là không cần thiết, tuy nhiên nếu như chúng ta muốn cập nhật dữ liệu (Thêm, Xóa, Sửa) trên Database thì dòng khởi tạo này là cần thiết. Dòng khởi tạo này sẽ thiết lập DataAdapter của chúng ta các câu lệnh Insert, Update và Delete mặc định cho việc cập nhật dữ liệu. Sau khi đã thiết lập xong, chúng ta gọi phương thức Update của DataAdapter. Trong phương thức Update cần phải chỉ rõ là DataSet nào cập nhật và bảng nào trên DataSet được cập nhật xuống CSDL. Nếu như chúng ta không gọi phương thức Update này thì các bạn có thể thấy rằng dữ liệu hiển thị trên Grid vẫn biến mất như là đã bị xóa. Nhưng thực sự lúc đó chúng ta chỉ xóa dữ liệu đó trên DataSet, hoàn toàn tách biệt với Database (các bạn còn nhớ kiến trúc dữ liệu không kết nối của ADO.NET chứ?)

  3. Lưu

    Khi người dùng nhấn nút “Lưu” thì cần phải xét 2 trường hợp là liệu người dùng đang thêm một dòng dữ liệu mới hay là người dùng đang cập nhật một dòng dữ liệu hiện có. Tùy vào từng tình huống mà chúng ta sẽ xử lý cho dữ liệu trên DataSet tương ứng

    private void btnSave_Click(object sender, EventArgs e)
    {
        //Nếu người dùng đang chỉnh sửa dữ liệu
        if (!add)
        {
            //Lấy ra dòng dữ liệu đang được chọn trong DataSet
            DataRow dr = ds.Tables["Student"].Rows.Find(studentID);
            
            //Bắt đầu chỉnh sửa dữ liệu
            dr.BeginEdit();
    
            //Cập nhật
            dr["Name"] = txtName.Text;
            dr["Age"] = txtAge.Text;
            dr["Email"] = txtEmail.Text;
            dr["Address"] = txtAddress.Text;
    
            //Kết thúc chỉnh sửa dữ liệu
            dr.EndEdit();
        }
        else //Người dùng thêm dữ liệu mới
        {
            //Tạo ra một dòng dữ liệu mới
            DataRow dr = ds.Tables["Student"].NewRow();
    
            //Đưa thông tin vào dòng dữ liệu này
            dr["Name"] = txtName.Text;
            dr["Age"] = txtAge.Text;
            dr["Email"] = txtEmail.Text;
            dr["Address"] = txtAddress.Text;
    
            //Thêm dòng dữ liệu này vào DataSet
            ds.Tables["Student"].Rows.Add(dr);
        }
    
        //Tạo đối tượng SqlCommandBuilder để có thể cập nhật dữ liệu
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da);
    
        //Cập nhật các thay đổi đã thực hiện trên DataSet.
        //Không có dòng này thì dữ liệu sẽ không được cập nhật trên database
        da.Update(ds, "Student");
    }

    Nếu như người dùng đang cập nhật một dòng dữ liệu đã có thì chúng ta lấy dòng dữ liệu đó ra và chỉnh sửa lại các thông tin trên dòng dữ liệu đó. Các phương thức ds.BeginEdit()ds.EndEdit() có tác dụng ngăn chặn các sự kiện khác có thể xảy ra trên dòng dữ liệu này khi gán các giá trị mới cho chúng (ví dụ như kiểm tra Lỗi, Validation, RowStateChanged….). Trường hợp người dùng thêm dữ liệu thì chúng ta sẽ tạo một DataRow mới nhờ phương thức NewRow() của bảng trong DataSet, sau đó chúng ta gán giá trị cho các trường của DataRow và cuối cùng là thêm dòng dữ liệu này vào danh sách các dòng dữ liệu đang có.

    Trong cả 2 trường hợp, chúng ta đều cần thiết phải cập nhật dữ liệu xuống database bằng phương thức Update của DataAdapter.

    Đến đây thì ứng dụng nhỏ của chúng ta đã hoàn thành. Các bạn nhấn F5 để chạy và thử nghiệm các tính năng Thêm, Xóa, Sửa của ứng dụng.

    Download chương trình Demo tại đây: ADONET

Kết luận: ADO.NET là một công nghệ nền tảng của .NET dùng trong việc truy cập vào CSDL. Các đối tượng như DataAdapter và DataSet làm việc kết hợp với nhau tạo nên kiến trúc dữ liệu không kết nối, điều này giúp tăng tốc độ làm việc với CSDL cũng như tiết kiệm tài nguyên hệ thống (không cần phải duy trì kết nối liên tục đến database). Trong các bài tiếp theo, chúng ta sẽ tìm hiểu về một số cách khác có thể giúp bạn truy xuất và cập nhật cơ sở dữ liệu như DataReader hoặc tìm hiểu về công nghệ ADO.NET Entity Model giúp cho các thao tác với CSDL trở nên dễ dàng hơn lúc trước rất nhiều. Chúc các bạn thành công!

About these ads

88 phản hồi to “Làm việc với cơ sở dữ liệu – ADO.NET”

  1. Tri Tháng Tư 3, 2011 lúc 12:07 #

    A ơi, sao e làm bt Xóa code như trên nhưng mà khi xóa xong, rồi cho chạy lại thì cái row e đã xóa trước đó vẫn còn vậy ?

    • Mr Jamesbond Tháng Tư 3, 2011 lúc 14:56 #

      Em kiểm tra lại để chắc chắn là đã gọi phương thức Update của DataAdapter. Em có thể post đoạn code dùng để Xóa của em lên đây để a kiểm tra.

      • tri Tháng Tư 10, 2011 lúc 10:49 #

        đây a

        private void btXoa_Click(object sender, EventArgs e)
        {
        if (dtvDanhsach.SelectedCells.Count == 0)
        return;
        string data = “Xóa chứ ?”;
        if (MessageBox.Show(data, “Thông báo”, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
        DataRow dr = ds.Tables["Student"].Rows.Find(studentId);
        ds.Tables["Student"].Rows.Remove(dr);
        SqlCommandBuilder commandbuilder = new SqlCommandBuilder(da);
        da.Update(ds, “Student”);
        }
        }

    • Mr Jamesbond Tháng Tư 10, 2011 lúc 11:32 #

      Sorry em. Em sửa dòng ds.Tables["Student"].Rows.Remove(dr) thành dr.Delete() nhé. Cảm ơn e vì đã chỉ ra lỗi… ^_^

  2. Vĩnh Quyên Lê Tháng Tư 8, 2011 lúc 17:38 #

    Cho mình hỏi,vậy làm sao ta lấy được csdl ra,để mang cái project này qua máy khác mà nó vẫn hỉu.Cảm ơn

    • Mr Jamesbond Tháng Tư 8, 2011 lúc 19:03 #

      Nếu dữ liệu của mình chỉ định là dùng ở Database Server (có nghĩa là máy của mình hoạt động như một máy chủ chứa CSDL thì khi đem sang máy khác chúng ta phải thực hiện Attach database đó vào trong SQL Server và phải chỉnh lại Connection String. Còn nếu như chúng ta dùng Database dạng đi kèm theo ứng dụng (trong connection string sẽ có dạng AttachDbFileName=…) thì chúng ta chỉ cần thay đổi Connection String là được. Thân

  3. thanhcuong1990 Tháng Tư 8, 2011 lúc 20:47 #

    Anh ơi cho em hỏi. Sao để tuổi anh là 17 tuổi zậy. :D

  4. nemo Tháng Tư 8, 2011 lúc 21:10 #

    anh ơi em có một cái CSDL trên sql gồm 2 cột 1 cột là MaPhong, 1 cột là Tenphong tương úng với cái mã phòng đó.Bây jo e thiết kế một cái form chứa cái combobox đó, em mún khi lựa chọn các mã phòng thi tên của phòng đó hiện ra trên label e phải viết sao anh. Em đang cần gấp anh pm sơm dùm em

    • Mr Jamesbond Tháng Tư 8, 2011 lúc 21:36 #

      Không biết có phải yêu cầu của em là ComboBox sẽ hiển thị mã phòng và khi chọn mã phòng đó thì sẽ hiển thị tên Phòng trên một Label khác. Em có thể load hết toàn bộ dữ liệu lên ứng dụng 1 lần duy nhất (lúc này toàn bộ dữ liệu đang ở trong DataTable của DataSet). Em sẽ Bind dữ liệu lên ComboBox như sau (giả sử tên ComboBox là cmbMaPhong):
      cmbMaPhong.DataSource = ds.Tables["Phong"];
      cmbMaPhong.DisplayMember = “MaPhong”;
      cmbMaPhong.ValueMember = “MaPhong”; (trong trường hợp em muốn rằng hiển thị tên phòng trong ComboBox thì DisplayMember= “TenPhong”)
      Khi người dùng chọn thay đổi lựa chọn trong ComboBox thì sự kiện SelectedIndexChanged sẽ được gọi. Em sẽ viết hàm xử lý sự kiện này. Lấy giá trị mã phòng (cmbMaPhong.SelectedValue), sau đó dựa vào mã phòng này mà hiện thị tên phòng trên Label bằng cách tìm trong DataTable chứa dữ liệu Phòng.

      • nemo Tháng Tư 9, 2011 lúc 18:07 #

        e camr ơn anh nhiều

  5. nemo Tháng Tư 14, 2011 lúc 08:19 #

    anh ơi em down một cái file pdf về mà không đoc đc tại nó có thêm cái đuôi .com ở phía trước đuôi pdf jo làm sao đọc được file đoa anh chỉ em với

  6. herotroy91 Tháng Năm 31, 2011 lúc 22:14 #

    Cách của anh làm là thông qua combobox, còn nếu em muốn edit trực tiếp trên bảng hiện thị của datagridview thì làm như thế nào?
    Tức là khi Debug thì hiện lên bảng, khi bấm nút edit thì ta có thể sửa dữ liệu ở các Cell, đồng thời cũng add thêm 1 Row mới để ta có thể thêm dữ liệu. Sau khi nhập trực tiếp xong thì nhấp nút Save, lập tức bên cái bảng trong cơ sở dữ liệu cũng được cập nhật như ta vừa sửa trên datagridview. Mong anh hồi đáp sớm.
    Núi Ấn, Sông Trà

  7. herotroy91 Tháng Sáu 1, 2011 lúc 12:53 #

    Anh bận hả. Sao anh không trả lời.

    • xuanchien Tháng Sáu 1, 2011 lúc 21:26 #

      Hi. Sorry vì hôm qua anh quên reply vì có chút việc. A chưa hiểu ý của em lắm vì anh không sử dụng ComboBox nào cả, chắc là em đang nói là tại sao anh ko sử dụng chỉ DataGridView thôi mà lại dùng tới các TextBox. Em có thể chọn mũi tên bên góc trên phải của DataGridView, trong đó sẽ có các tùy chọn để em cho phép chỉnh sửa dữ liệu trực tiếp trong DataGridView đó.
      Thân,

  8. Pham Nguyen Tháng Sáu 11, 2011 lúc 16:59 #

    Dữ dội quá. Bài viết hay lắm ông !

  9. chau Tháng Sáu 14, 2011 lúc 00:11 #

    Bạn cho mình hỏi làm sao để hiện thì sự kiện RowEnter để minh viết code vào đó. Sự kiện này năm trong file nào trogn ví dụ của bạn vậy. :(

    • xuanchien Tháng Sáu 14, 2011 lúc 17:22 #

      Bạn chọn control cần viết sự kiện và mở cái khung Properties, sau đó chọn cái icon hình sấm sét để xem danh sách sự kiện của Control đó, tìm đến dòng có chữ RowEnter và double click vào đó để tạo phương thức xử lý sự kiện. Phương thức này nằm trong File có đuôi .cs và tên trùng với tên Form (Bạn có thể nhấn chuột phải lên form chọn View Code)

      • Doãn văn sáng Tháng Mười Hai 4, 2011 lúc 23:12 #

        Bạn nói cụ thể hơn trong ví dụ của bạn thì từng bước làm thế nào để hiện ra sự kiện :
        private void gridStudent_RowEnter(object sender, DataGridViewCellEventArgs e)
        Mình mới học bạn cố gắng giúp đỡ từng bước mình mới hiểu và làm theo được.
        Xin cảm ơn nhé!

      • Doãn văn sáng Tháng Mười Hai 4, 2011 lúc 23:28 #

        Mình làm được rồi!
        Xin cảm ơn!

  10. chau Tháng Sáu 14, 2011 lúc 10:03 #

    Sao mỗi lần Delete Row thì nó báo lỗi ở dòng dr.Delete(); trong hàm btn_Delete() vậy bạn

    • xuanchien Tháng Sáu 14, 2011 lúc 17:23 #

      Bạn nêu rõ lỗi gì để mình biết nhá, chứ chung chung thế này thì mình cũng không chắc là lỗi gì. Cảm ơn

  11. phuc Tháng Bảy 23, 2011 lúc 22:05 #

    cho minh hoi lam sao de insert 1 dong moi trong dataGridview?
    vi no cu bao loi la data is bound.thank ban nha!!!

  12. Toàn Tháng Tám 7, 2011 lúc 12:50 #

    NGANH(Manganh,Makhoa,Tennganh,He, TongSoTC)
    KHOANTHU(Makthu, NamHoc ,Tenkhoanthu)
    MUCTHU(Makthu,Manganh, ,Sotiendm)
    Giá trị tableMucThu( HP2004, 101,50000)
    -Mình có comboboxNganh, comboboxKhoanThu

    - Mình muốn khi chọn ngành và khoản thu thì sẽ lấy được SoTienDM = 50000

    • xuanchien Tháng Tám 9, 2011 lúc 20:10 #

      Không biết là bạn cần giúp đỡ chỗ nào? Bạn cần nêu rõ thắc mắc đang gặp phải thì mình sẽ trợ giúp, chứ câu hỏi chung chung thế này thì mình sẽ không biết trả lời như thế nào cho đúng.
      Thân,

  13. Toàn Tháng Tám 7, 2011 lúc 12:51 #

    Mong bạn giúp đỡ!!! thank!!!

  14. Toan Tháng Tám 29, 2011 lúc 16:30 #

    SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Xuan Chien\Desktop\ITIC\ADONET\StudentDB.mdf;Integrated Security=True;User Instance=True");

    mÌnh có thể đổi connect string này để sang máy khác chạy luôn được không?

    • xuanchien Tháng Tám 29, 2011 lúc 22:08 #

      Connection String trên mỗi máy có thể không giống nhau tùy thuộc vào phiên bản SQL Server máy đó đang cài cũng như là thiết lập SQL Server đó. Bạn có thể tham khảo các dạng Connection String tại địa chỉ: http://connectionstrings.com/

  15. Toan Tháng Tám 30, 2011 lúc 12:28 #

    Vậy có cách nào để sang máy khác mà project mình vẫn chạy khi có csdl không????

  16. truonggiang Tháng Chín 26, 2011 lúc 18:08 #

    pro wa, mình cũng đang làm project này, nhưng mình đang vướn phải vấn đề là không thể cập nhật dữ liệu được trong dataset mà nó cập nhật thẳng qua SQL luôn.
    Mình đang làm Console Appplication. Rất vui khi được các làm quen với các bạn

  17. tran tran phuong trinh Tháng Mười 26, 2011 lúc 16:59 #

    Anh cho em hoi la, khi pushlish ung dung do thanh mot chuong trinh chay tren desktop, neu co bo sung them button search thi bat buot phai co du lieu trong datagridview moi search duoc, nhung truc tiep lam luc may con khoi dong thi search duoc, nhung khi restar lai may thi du lieu da nhap truoc do bi mat thi lam sao a?
    anh giup em doan code ma luu du lieu mai mai trong ung dung csdl ma khong bi mat khi ta restar lai may, cac rows chi bi mat khi ta nhan button delete thoi. em cam on nhiu, hihihihihihihihihih

  18. nana Tháng Mười 26, 2011 lúc 17:27 #

    ID hiện tại = -1 là sao vậy a?

  19. minhbunpro Tháng Mười Một 4, 2011 lúc 17:48 #

    anh ơi cho em hỏi, em muốn tìm kiếm trong cơ sở dữ liệu một thông tin nào đó và cho nó hiện lên label thì sao ạ??

  20. Nthanhdat Tháng Mười Một 22, 2011 lúc 19:34 #

    Giúp mình với nhé… File tui down về chỉ sửa chuỗi kết nối thôi.

    SqlConnection connection = new SqlConnection(@”Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\StudentDB.mdf;Integrated Security=True;User Instance=True”);

    Nó vẫn chạy và vẫn lấy đc data trong Student.mdf xuất ra gridview

    Khi mình thêm, xóa, sửa thì nó vẫn thực hiện tốt trên gridview nhưng lại không cập nhật vào database.

    Mình không biết tại mình dùng 2005 nó khác với 2008 của bạn hay sao mà nó không cập nhật được T_T.

  21. Nthanhdat Tháng Mười Một 22, 2011 lúc 19:36 #

    http://www.mediafire.com/?tlnxwlv6n8pa9u8

    Có gì bạn sửa rồi up lên lại cho mình nhé.

    Cám ơn nhiều…

  22. Truong Giang Tháng Mười Một 30, 2011 lúc 10:29 #

    Tại sao mình chạy procedure trong sql thì cho kết quả như theo thủ tục, còn khi mình kết nối với visual c# thì kết quả lại khác nó không giống với điều kiện trong thủ tục.Ban coi giùm mình nhé:

    create procedure MyDirectory.Sale_by_Year_Category
    @CategoryID int,
    @CategoryName nvarchar(15),
    @OrderYear int
    as
    begin
    select p.ProductName,round(sum(v_o.Sale),2)’Total’ from Northwind.dbo.Categories c join Northwind.dbo.Products p on c.CategoryID=p.CategoryID join Northwind.dbo.View_Orders v_o on p.ProductID=v_o.ProductID
    where (@CategoryID is null or c.CategoryID=@CategoryID)
    and (@CategoryName is null or c.CategoryName=@CategoryName)
    and (@OrderYear is null or year(v_o.OrderDate)=@OrderYear)
    group by p.ProductName
    order by Total desc

    declare @SumMoney int
    select @SumMoney=round(SUM(v_o.Sale),2)
    from Northwind.dbo.Categories c join Northwind.dbo.Products p on c.CategoryID=p.CategoryID join Northwind.dbo.View_Orders v_o on p.ProductID=v_o.ProductID
    where (@CategoryID is null or c.CategoryID=@CategoryID)
    and (@CategoryName is null or c.CategoryName=@CategoryName)
    and (@OrderYear is null or year(v_o.OrderDate)=@OrderYear)
    return @SumMoney
    end

    Như thế này: Khi ta nhập CategoryID, và CategoryName la null thì nó sẽ lọc điều kiện theo CategoryID va OrderYear, ngược lại nếu ta nhập CategoryName, còn CategoryID la null thì nó sẽ dựa theo điều kiện CategoryName và OrderYear. Còn nếu mình nhập giá trị cả hai CategoryID & CategoryName nếu CategoryName thuộc CategoryID thì nó sẽ truy xuất, ngược lại thì null. Mình đã chạy trên SQL thì nó vẫn tốt, kết quả logic như suy luận. Nhưng khi mình chạy trong môi trường ADO thì khác nó bắt phải cả hai giá trị là CategoryID & CategoryName phải được nhập và CategoryName phải có ID là CategoryID thì truy xuất kết quả được. Nếu một trong hai null hoặc cả hai null thì truy xuất ra null. Mình nghe nói nếu như mình sử dụng điều kiện:

    (@CategoryID is null or c.CategoryID=@CategoryID)
    and (@CategoryName is null or c.CategoryName=@CategoryName)
    and (@OrderYear is null or year(v_o.OrderDate)=@OrderYear)

    thì có thể bị lỗi sniffing gì đó. Không biết đúng không???Mong mọi người giúp đỡ..Thankssss

  23. huy Tháng Mười Hai 4, 2011 lúc 00:06 #

    Anh oi cho em hoi the lam sao trong co so du lieu tu dong tang khoa co ca so va chu cai vi du la
    A0001 A0002…..

  24. Biên Trọng Tháng Mười Hai 18, 2011 lúc 20:56 #

    bạn có thể cho mình yahoo đc không vậy? mình muốn hỏi nhiều hơn! thanks bạn vì bài này of bạn rất bổ ích!

    • xuanchien Tháng Mười Hai 18, 2011 lúc 21:20 #

      Mình ít khi trả lời trên yahoo, bạn nên hỏi trên các diễn đàn như congdongcviet thì sẽ có rất nhiều người giải đáp cho bạn, hơn nữa sau này khi người khác gặp vấn đề tương tự thì họ cũng tìm được giải đáp trên diễn đàn đó luôn. Thân,

  25. quan Tháng Mười Hai 21, 2011 lúc 01:17 #

    sao em ghi code giong vậy mà nó ko hiện thị vào datagridview vậy anh ơi

  26. Hung le Tháng Mười Hai 28, 2011 lúc 02:34 #

    Anh co the viet nhieu bai ve .NET nua nhe
    bai viet rat hay.minh moi hoc .net nhung cung thay hay lam….thanks

  27. tu chi Tháng Một 7, 2012 lúc 14:54 #

    em muon tim kiem ten nhan vien va ten cua don vi va khi tim thi bang nhan vien hien tren dagirdview bang nhan vien co (manv, hotennv,ngaysinh,phai,diachi,manql,madv) k etnoi voi bang donvi(madv,tendonvi,sdt,trdv)

  28. ANNA Tháng Một 14, 2012 lúc 15:11 #

    KHI LÀM NÚT XÓA MÌNH BỊ LỖI CHỖ NÀY
    SqlConnection ketnoi = new SqlConnection(“Server=.\\BAONGOC-PC; Database=QLBH1; Integrated Security=true;”);
    SqlCommand command3 = new SqlCommand(“select * from NHANVIEN”, ketnoi);
    SqlDataAdapter NV = new SqlDataAdapter(command3);
    if (dataGridView4.SelectedCells.Count == 0)

    return;
    DialogResult result = MessageBox.Show(“Bạn có thật sự muốn xóa dòng dữ liệu này?”, “Thông báo”, MessageBoxButtons.YesNo);

    if (result == System.Windows.Forms.DialogResult.Yes)

    {
    DataRow dr = ds.Tables["NHANVIEN"].Rows.Find(MANV);//?? KHONGN BIET LOI NAY SUA SAO??????

    dr.Delete();

    SqlCommandBuilder commandBuiler = new SqlCommandBuilder(NV);

    NV.Update(ds, “NHANVIEN”);

    • xuanchien Tháng Một 14, 2012 lúc 16:23 #

      Bạn phải ghi rõ nội dung lỗi là gì thì mình mới giúp bạn được. Thân

  29. ANNA Tháng Một 15, 2012 lúc 00:28 #

    LỖI MANV KHÔNG TỒN TẠI ĐÓ BẠN

    • xuanchien Tháng Một 15, 2012 lúc 08:45 #

      MANV không tồn tại hình như là lỗi logic chứ không phải lỗi code

  30. ANNA Tháng Một 15, 2012 lúc 15:04 #

    lỗi đó mình sửa được rồi nhưng bị lỗi này sau khi mình debug chương trình
    row = ds.Tables["nhan vien"].Rows.Find(manv)
    lỗi:
    {“Object reference not set to an instance of an object.”}
    nó báo chỗ manv

    • xuanchien Tháng Một 15, 2012 lúc 15:39 #

      chỗ ds.Tables["..."] của bạn có vấn đề vì bạn không đặt tên bảng, vì vậy bạn nên để là ds.Tables[0] để truy cập vào bảng trong dataset

  31. ANNA Tháng Một 15, 2012 lúc 16:15 #

    vẫn bị lỗi bạn ơi
    DataRow dr = ds.Tables[0].Rows.Find(manv);
    lỗi
    {“Cannot find table 0.”} mình làm theo cách bạn chỉ
    mà mình có đặt tên bảng mà trong sql mình có tạo bảnh nhân viên mà

    • xuanchien Tháng Một 16, 2012 lúc 08:06 #

      Cái bảng trong SQL nó khác với cái bảng mà bạn truy vấn được. Mình mới xem lại code của bạn thì mình không thấy bạn đưa dữ liệu vào Dataset (biến ds). Bạn xem lại các phần code sử dụng SqlDataAdapter và DataSet thử xem.

  32. Giang Tháng Một 16, 2012 lúc 11:22 #

    Bạn làm ơn cho mình hỏi, khi mình delete dữ liệu trong một bảng có liên kết khóa ngoài với bảng khác thì nó báo lỗi, và không thể xóa được. Bạn có thể chỉ cho mình cách để xóa dữ liệu ở tất cả các bảng có liên kết khóa ngoài với nó không nhỉ.
    Ví dụ: Xóa Sinh viên trong bảng SinhVien thì sẽ xóa luôn cả Sinh viên đó trong bảng LopHoc
    Cảm ơn bạn nhiều!

  33. Đăng Khoa Tháng Hai 20, 2012 lúc 08:30 #

    Bạn ơi mình có vấn đề này là mình dựa trên nền code của bạn mình làm rất thành công.Nhưng bây giờ có vấn đề là cứ mỗi lần nhập dữ liệu là phải bấm lưu.Bạn có cách nào mà vẫn trên nền code đó nó tự động lưu không.Bạn làm ơn giúp mình.Mình đang cần gấp lắm.Cám ơn bạn.

    • xuanchien Tháng Hai 20, 2012 lúc 13:11 #

      Ở đây mình đặt đoạn code lưu trong btnClick, còn bạn thích đặt nó trong sự kiện khác vẫn được, ví dụ như sự kiện TextChanged của các textbox….

  34. Đăng Khoa Tháng Hai 20, 2012 lúc 14:17 #

    ok cám ơn bạn để mình thử

  35. bao Tháng Ba 2, 2012 lúc 09:16 #

    Huynh oi cho de hoi de da hien thi duoc thong tin len gritview oi nhung ma toi phan hien thi cac thong tin qua cac text thi ko duoc code thi ko thay bao loi
    Huynh oi chi dum de cai phan
    ID nha
    thankss

  36. Hà Minh Tháng Ba 13, 2012 lúc 16:54 #

    Cho mình hỏi 1 chút:”Mình đang làm về quản lý sinh viên.Nếu bây giờ dùng mã sv làm khóa chính thì nó sẽ báo lỗi.Mình đoán là do mã sv ko phải kiểu int.Không biết thế có đúng k nữa???Bạn giải thích dùm mình nhé

    • xuanchien Tháng Ba 13, 2012 lúc 19:44 #

      Bạn cần ghi rõ lỗi mà bạn gặp là gì thì mình mới có thể giúp được.
      Thân

    • ADO.net Tháng Tư 10, 2012 lúc 14:09 #

      cho mình hỏi bạn có tài liệu ADO.net băng tiếng việt không?

      • xuanchien Tháng Tư 10, 2012 lúc 19:07 #

        Mình không có bạn ơi, bạn cố gắng đọc các tài liệu viết bằng tiếng Anh đi, cũng không khó hiểu lắm đâu…

  37. Võ Minh Sơn Tháng Ba 14, 2012 lúc 22:19 #

    Anh cho em hỏi làm sao đóng gói 1 chương trình mà có dùng cơ sở dữ liệu của sql?

  38. HẢO Tháng Ba 17, 2012 lúc 18:39 #

    Cho mình hỏi là:
    VĐ 1: Mình tạo sẵn 1 datagridview và có sẵn các cột như “Mã Sinh Viên”, “Họ”, “Tên”…
    và khi mình load CSDL lên thì nó chỉ load thông tin ứng với cột đó trong CSDL lên thôi nhưng không thay đổi số cột cũng như tên cột đó.. Xin cảm ơn !!!

  39. Thế Ngọc Tháng Tư 15, 2012 lúc 20:02 #

    Xuân Chiến ơi, bạn có thể giải thích cho mình phần kết nối này SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Xuan Chien\Desktop\ITIC\ADONET\StudentDB.mdf;Integrated Security=True;User Instance=True");
    trong đó đoạn này @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Xuan Chien\Desktop\ITIC\ADONET\StudentDB.mdf;Integrated Security=True;User Instance=True" mình lấy đâu ra vậy ? Thanks bạn rất nhiều !

    • xuanchien Tháng Tư 15, 2012 lúc 22:02 #

      Bạn có thể tham khảo các chuỗi kết nối ở trang web này: http://connectionstrings.com/, Data Source là chuỗi kết nối đến SQL Server Database (thường là .\SQLEXPRESS hoặc .\), AttachDbFilename là đường dẫn đến file database trên ổ cứng, Integrated Security là cho biết sẽ chứng thực theo cách nào (SQL hay là Windows). Bạn có thể tham khảo thêm tại: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.71).aspx

      • Thế Ngọc Tháng Tư 16, 2012 lúc 23:05 #

        Mình đã hiểu rồi, Cảm ơn ban nhiều nhe ! Bài của bạn rất bổ ích cho những người mới bước vào lập trình C# như mình !

  40. Cường Nguyễn Tháng Tư 23, 2012 lúc 22:00 #

    Anh ơi cho em hỏi: Từ bài của anh em muốn thêm một nút button là Tìm kiếm, giả sử là tìm kiếm theo ID, khi đánh ID vào thì thông tin sinh viên sẽ hiện lên các textbox, em làm mãi mà không được. Cám ơn anh rất nhiều

    • xuanchien Tháng Tư 24, 2012 lúc 08:15 #

      Bạn làm không được phần nào? Kết nối dữ liệu, Tìm kiếm hay là hiển thị

      • Cường Nguyễn Tháng Tư 24, 2012 lúc 14:35 #

        Dạ, em đã làm được rồi ạ, cám ơn anh

  41. Ngô Yến Tháng Tư 26, 2012 lúc 17:01 #

    anh ơi. cho em hỏi là em tạo một cái dataset, khi em coppy dữ liệu sang máy khác attach đuôi mdf trong sql server chạy rùi, nhưng trong data set của vb thì nó báo lỗi không chạy được . a gúp e mới.

    • xuanchien Tháng Tư 26, 2012 lúc 19:45 #

      Bạn phải ghi lỗi chứ mình đoán mò cũng không ích gì…

  42. CeUIT Tháng Năm 16, 2012 lúc 22:13 #

    Anh cho em hỏi là: Trong phần hiển thị thông tin lên các textbox : txtName,txtAge,txtEmail,txtAddress em thấy là khi mình click chuột vào một dòng dữ liệu thì các dữ liệu đó đều phải có trong gridStudent thôi.Mình có cách nào mà có thể hiển thị được thông tin không có trong gridStudent không ạ ? em VD : là trong CSDL của em sẽ có thêm một Column là số điện thoại và trên MainForm sẽ có 1 textBox là số điện thoại nhưng khi select để hiển thị các column thông tin lên gridStudent em sẽ không chọn column số điện thoại. Vậy khi mình click vào một dòng trên gridStudent thì có cách nào để số điện thoại của người đó cũng hiện lên không ạ ?

    • xuanchien Tháng Năm 16, 2012 lúc 22:18 #

      Dữ liệu bạn lấy lên có thể nhiều nhưng bạn có thể tùy chỉnh chỉ cho chọn 1 số trường nhất định, sau đó bạn vẫn có thể truy xuất các trường khác. Hoặc bạn có thể lấy được ID của Student rồi sau đó truy vấn tới Database để lấy số điện thoại

  43. ngcqunguyn Tháng Năm 17, 2012 lúc 22:42 #

    Anh có thể hướng dẫn cụ thể cách tạo csdl chung thư mục với project được ko ạ? Em muốn tạo csdl chung thư mục với project để có thể đưa sang máy khác chạy được nhưng ở trong phần attach a database file thì phải chọn một csdl có sẵn, vậy phải làm sao để tạo csdl mới? Em tạo csdl bằng sql server, rồi copy file mdf đưa vào thư mục project rồi attach vào nhưng khi đưa sang máy khác chạy thì báo lỗi!!! Anh làm sao mà cái csdl của a đưa sang máy khác ko bị lỗi vậy?

    • xuanchien Tháng Năm 18, 2012 lúc 07:41 #

      Để tự động Attach database file trong thư mục riêng thì máy phải có cài đặt SQL Server Express, các phiên bản SQL Server khác sẽ không sử dụng được tính năng này. Hơn nữa trong Connection String bạn phải để đường dẫn AttachDbFilename=|DataDirectory|\DatabaseName.mdf để cho biết rằng file Database nằm trong thư mục App Data của project

      • NQNguyen Tháng Năm 18, 2012 lúc 11:55 #

        máy em có cài sql server express rồi, ý em muốn hỏi là lúc tạo database bằng visual studio thì phải là sao? Hay là phải tao database từ sql server rồi copy file mdf ra thư mục project? Em thử tạo database từ sql server rồi copy file mdf đưa vào project sau đó attach vào project nhưng khi đưa sang máy khác thi không chạy được? mà em thử conpy cái file StudentDB.mdf của anh attach vào project rồi chạy thì đưa sang máy khác chạy được, em muốn hỏi cách tạo file mdf của anh là như thế nào? Cám ơn anh!

      • xuanchien Tháng Năm 18, 2012 lúc 13:22 #

        Tạo ở đâu cũng giống nhau thôi, em chú ý tới phiên bản giữa các máy xem có tương thích hay không. Nếu máy em cài SQL Server Express chạy được thì sang máy khác sẽ chạy được….

  44. NQNguyen Tháng Năm 18, 2012 lúc 13:24 #

    Cám ơn anh! :)

  45. ellytien Tháng Bảy 20, 2012 lúc 10:15 #

    anh oi em attach du lieu vao CSDL k dk anh ah? anh viet 2005 hay 2008 vay?

  46. KING Tháng Mười 12, 2012 lúc 20:33 #

    sao mình binding không được vậy bạn, có cần bỏ hàm binding vào form load ko bạn

  47. Quyên Tháng Năm 12, 2013 lúc 10:04 #

    Anh ơi, em muốn load dữ liệu từ bảng dữ liệu lên textbox. Anh xem hộ em đoạn code này với ạ.
    protected void Page_Load(object sender, EventArgs e)
    {
    try
    {
    string id = Request.QueryString.Get(“IDTin”);
    txtMaTin.Text = id;
    NewID = Convert.ToInt32(id);
    if (!Page.IsPostBack)
    {
    LoadDuLieu();
    }
    }
    catch { }
    }
    private int NewID = 0;

    public void LoadDuLieu()
    {
    try
    {
    string strconnect = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    SqlConnection cn = new SqlConnection(strconnect);
    cn.Open();
    SqlCommand cmd = new SqlCommand();
    string sql = “select * from tbltintuc where IDTin=”+NewID;
    cmd.CommandText=sql;
    cmd.Connection=cn;
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.Read())
    {
    txttieude.Text=dr["TieuDe"].ToString();
    txtTomTat.Text = dr["TomTat"].ToString();
    FCKeditor1.Value = dr["NoiDung"].ToString();
    txtPath.Text=dr["hinh"].ToString();
    }
    cn.Close();
    cmd.Dispose();
    }
    catch { }

    }
    Em viết như vậy mà không load được j cả! Anh xem giúp em nhé! Em cảm ơn anh nhiều ạ

    • xuanchien Tháng Năm 12, 2013 lúc 11:24 #

      Bạn nên sử dụng Visual Studio để debug thử xem nó có load được dữ liệu lên không đã, có thể nó kết nối không được nên chạy vào khối catch và không có dữ liệu nào được load lên

      • Quyên Tháng Năm 12, 2013 lúc 11:51 #

        Anh hướng dẫn cụ thể em được ko ạ? Em GÀ về khoản code này quá! :(

Trackbacks/Pingbacks

  1. Sử dụng GridView trong ASP.NET « My power is my mind - Tháng Sáu 11, 2011

    [...] nút New Connection (chi tiết của các thao tác này có thể xem thêm tại bài viết giới thiệu về ADO.NET và sau đó là bài về [...]

  2. [ASP.NET] Sử dụng ObjectDataSource và SqlDataSource - Tháng Chín 7, 2013

    […] Tên namespace của bạn có thể không giống với ứng dụng này, nhưng điều đó không ảnh hưởng đến chức năng của ứng dụng. Như ta thấy, trong lớp MyDataSource chúng ta có một phương thức tĩnh là GetProducts(). Phương thức này lấy toàn bộ dữ liệu từ bảng Product trong cở sở dữ liệuAdventureWorks và trả về dữ liệu kiểu DataTable. Nếu bạn chưa biết cách thức kết nối và lấy dữ liệu ra như trên thì bạn có thể tham khảo trong bài viết: Tìm hiểu về ADO.NET […]

Gửi phản hồi

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Thay đổi )

Twitter picture

You are commenting using your Twitter account. Log Out / Thay đổi )

Facebook photo

You are commenting using your Facebook account. Log Out / Thay đổi )

Google+ photo

You are commenting using your Google+ account. Log Out / Thay đổi )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 163 other followers

%d bloggers like this: