Lập trình Cơ sở dữ liệu với C#
Giới thiệu
Với sự phát triển của công nghệ thông tin, ngày nay mọi lĩnh vực đều cố gắng xây dựng các phần mềm quản lý để tiết kiệm chi phí và tăng hiệu quả lao động như các phần mềm quản lý sản phẩm, quản lý bán hàng, quản lý nhân sự, v.v. Làm sao chúng ta có thể lập trình được một ứng dụng sử dụng dữ liệu được lưu trữ ở một hệ quản trị CSDL nào đó ví dụ như Access hoặc SQL Server. Với sự ra đời của .Net, bạn có thể xây dựng những ứng dụng lập trình với CSDL một cách dễ dàng và nhanh chóng. Đây là bài hướng dẫn từng bước cách lập trình với cơ sở dữ liệu sử dụng ngôn ngữ C# và hệ quản trị CSDL SQL Server.
Chuẩn bị trước
- Cài đặt Visual Studio, bạn có thể download phiên bản 2010
- Có kiến thức cơ bản về lập trình CSDL tại đây
- Chuẩn viết code C# tại đây
- Các câu lệnh SQL cơ bản như SELECT, INSERT, UPDATE, DELETE
Yêu cầu bài toán
Thiết kế cơ sở dữ liêu đặt tên QLBanHang, trong đó có bảng:
tblMatHang( MaSP nchar(5), TenSP nvarchar(30), NgaySX Date, NgayHH Date, DonVi nvarchar(10), DonGia Float , GhiChu nvarchar(200))
Thiết kết giao diện:
- Các phần cửa sổ co giãn hợp lý khi của sổ của Form phóng to hoặc thu nhỏ, ví dụ cửa sổ (3) luôn giữ cố định ở bên trái, phần cửa sổ (4) và (5) co giãn khi Form thay đổi kích thước, (1) và (2) luôn nằm trên đầu và phía dưới cùng của Form.
- Các nút có gắn các phím tắt ví dụ như Alt + T cho nút Tìm kiếm, Alt + H cho nút Thêm, v.v.
a) Chức năng Tìm kiếm
Hỗ trợ các tiêu chí: MaSP, TenSP, NgaySX, NgayHetHan, DonGia
Tiêu đề: TÌM KIẾM MẶT HÀNG
Khi ấn nút Tìm:
- dgvDanhSach sẽ hiển thị tất cả các thông tin về các sản phẩm thoả mãn các tiêu chí lựa chọn.
- Cấm Click vào các nút Sửa, Xoá
- Khi Click vào từng trường, các thông tin sẽ hiển thị chi tiết sang các control bên grbChiTiet, nhưng không cho phép sửa đổi dữ liệu. Không cho kích vào nút Lưu, Huỷ trong grbChiTiet.
b) Chức năng Thêm
Tiêu đề: THÊM MẶT HÀNG
Khi ấn nút Thêm:
- Sẽ xoá trắng các control trong grbChiTiet và hai nút Lưu và Huỷ sẽ kích hoạt.
- Cấm Click vào các nút Sửa, Xoá.
- Khi ấn nút Huỷ, sẽ thoát khỏi chức năng thêm (Xoá trắng grbChiTiet, không cho nhập dữ liệu)
- Khi ấn vào nút Lưu, nếu thêm mới thành công, cập nhật lại dữ liệu trong dgvDanhSach
c) Chức năng Sửa
Tiêu đề: CẬP NHẬT MẶT HÀNG
Nút Sửa chỉ cho Enable = True khi người dùng chọn một bản ghi trong dgvDanhSach.
Khi ấn nút Sửa:
- Cấm Click vào các nút Thêm, Xoá.
- grbChiTiet cho phép sửa dữ liệu. Trong grbChiTiet cho hiển thị nút lệnh Lưu, Huỷ bỏ. Khi ấn nút Huỷ, sẽ thoát khỏi chức năng Sửa (cấm Click vào nút Sửa, cho phép Click vào nút Thêm)
- Nếu Cập nhật thành công, cập nhật lại dgvDanhSach
d) Chức năng Xoá
Tiêu đề: XOÁ MẶT HÀNG
Nút Xoá chỉ cho phép Click khi người dùng chọn một bản ghi trong dgvDanhSach
Khi ấn nút Xoá:
- Cấm Click vào các nút Thêm, Sửa.
- Các control trên grbChiTiet không cho phép sửa dữ liệu. Trong grbChiTiet cho hiển thị nút lệnh Lưu, Huỷ bỏ. Khi ấn nút Huỷ sẽ thoát khỏi chức năng Xoá (cấm Click vào nút Xoá, cho phép Click vào nút Thêm)
Xây dựng chương trình
1. Tạo mới Project
- Kích vào menu Start > All Programs > Microsoft Visual Studio 2010 (tuỳ theo phiên bản bạn cài)
- Rồi trên cửa sổ VS 2010 kích vào menu File > New > Project …
- Chọn ngôn ngữ C# và kiểu ứng dụng bạn lập trình. Trong trường hợp này bạn chọn Windows Form Application
- Giao diện cửa sổ dự án
- Toolbox: chứa các control cho phép chúng ta kéo thả vào giao diện. Trong ứng dụng này chúng ta sẽ sử dụng các control: Label, TextBox, DateTimePicker, Button, Spliter, Panel, GroupBox
- Solution Explorer: chứa toàn bộ tài nguyên dự án như các file code, các thư viện …
- Properties: chứa các thuộc tính, các sự kiện của control và form
- Ngoài ra còn có các cửa sổ khác như Server Explorer, Error List, Output …, nếu không thấy cửa sổ nào bạn có thể vào menu View để chọn.
- Project ban đầu khởi tạo có Form1.cs là form mặc định, bạn có thể kích chuột phải chọn Rename thành frmMatHang và thực hiện thay đổi các thuộc tính nếu cần thiết.
2. Tạo cơ sở dữ liệu
Lập trình CSDL với .NET có một chuẩn chung với các nguồn cơ sở dữ liệu khác nhau, nó chỉ khác nhau về .NET Data Provider. Trong bài này chúng ta sẽ sử dụng hệ quản trị CSDL SQL Server được cài mặc định khi cài Visual Studio
- Kích chuột phải vào tên Project trong của sổ Solution Explorer > Add > New Item > Service-based Database
- Bạn ấn nút Next và Finish để kết thúc tạo file. Sau đó bạn nhìn thấy có một file QLBanHang.mdf xuất hiện trong cửa sổ Solution Explorer
- Kích đúp vào file này, bạn nhìn thấy nó xuất hiện cửa sổ Server Explorer, chọn tên Database QLBanHang > Tables > kích chuột phải chọn Add New Table, rồi thực hiện tạo bảng với cấu trúc như trên yêu cầu
3. Giao diện thiết kế
- Thiết kế giao diện và đặt các thuộc tính
Phần giao diện | Loại control | Các thuộc tính |
---|---|---|
Cửa sổ chính | Form | Name = frmMatHang Text = Quản lý sản phẩm |
ErrorProvider | Name = errChiTiet | |
(1) | Panel | Dock = Top |
Label | Name = lblTieuDe | |
(2) | Panel | Dock = Bottom |
Button | Name = btnTimKiem Text = &Tìm kiếm |
|
Button | Name = btnThem Text = T&hêm |
|
Button | Name = btnSua Text = &Sửa |
|
Button | Name = btnXoa Text = &Xoá |
|
Button | Name = btnThoat Text = Th&oát |
|
Button | Name = btnTimKiem Text = &Tìm kiếm |
|
(3) | GroupBox | Dock = Left Text = Chi tiết |
Spliter | Dock = Left | |
Label | Text = Mã SP: | |
TextBox | Name = txtMaSP | |
Label | Text = Tên SP: | |
TextBox | Name = txtTenSP | |
Label | Text = Ngày SX: | |
DateTimePicker | Name = dtpNgaySX Format=Short |
|
Label | Text = Ngày HH: | |
DateTimePicker | Name = dtpNgayHH Format=Short |
|
Label | Text = Đơn vị: | |
TextBox | Name = txtDonVi | |
Label | Text = Đơn giá: | |
TextBox | Name = txtDonGia TextAlign = Right |
|
Label | Text = Ghi chú: | |
TextBox | Name = txtGhiChu Multiline = True |
|
Button | Name = btnLuu Text = &Lưu |
|
Button | Name = btnHuy Text = &Huỷ |
|
(4) | GroupBox | Text = Tìm kiếm Dock = Top |
Spliter | Dock = Top | |
Label | Text = Mã SP: | |
TextBox | Name = txtTKMaSP | |
Label | Text = Tên SP: | |
TextBox | Name = txtTKTenSP | |
(5) | GroupBox | Text = Kết quả Dock = Fill |
DataGridView | Name = dgvKetQua |
- Chú ý để thiết kế được giao diện thân thiện với người dùng và các control tự co giãn khi Form thay đổi kích thước cần thiết kế, chú ý kéo các control đúng thứ tự như sau:
- Giao diện phần (1): là phần nhãn tiêu đề, kéo control Panel vào Form và đặt thuộc tính Dock = Top để cho Panel luôn nằm ở trên đầu của Form, sau đó kéo một Label nằm trên Panel này.
- Giao diện phần (2): là phần các nút Tìm kiếm, Thêm … cũng làm tương tự như phần (1), kéo control Panel và đặt thuộc tính Dock = Bottom để Panel này luôn nằm cuối của Form, sau đó mới đặt các Button nằm trên Panel này.
- Giao diện phần (3): là phần chi tiết, kéo control GroupBox vào Form và đặt thuộc tính Dock = Left, sau đó thiết kế các control cho nhập Mã SP, Tên SP … Sau đó ta kéo thêm control Spliter và đặt thuộc tính Dock = Left để cho phép người dùng thay đổi độ rộng giữa phần (3) với phần (4) và (5).
- Giao diện phần (4): là phần tìm kiếm, kéo control GroupBox vào Form và đặt thuộc tính Dock = Top, lúc này nó sẽ nằm ở trên phần còn lại. Sau đó đặt các control cho phép nhập tìm kiếm như Mã SP, Tên SP … Trong phần này ta cũng kéo control Spliter, đặt thuộc tính Dock = Top để cho phép người sử dụng thay đổi độ rộng giữa phần (4) và phần (5)
- Giao diện phần (5): là phần hiển thị dữ liệu, kéo control GroupBox và đặt thuộc tính Dock = Fill, sau đó kéo control DataGridView nằm trong GroupBox này nó sẽ chiếm toàn bộ phần không gian còn lại.
- Viết chương trình chạy trên Windows thì cần tuân theo chuẩn của Windows, ví dụ khi ấn phím Tab trên bàn phím thì con trỏ sẽ chạy từ bên trên -> sang trái -> xuống dưới -> sang phải. Nếu thứ tự bạn kéo control không đúng thì khi ấn phím Tab sẽ nhảy lung tung. Bạn có thể đặt lại bằng cách vào menu View > Tab Order để đặt lại thứ tự Tab trên các control. Sau khi đặt xong quay lại chọn lại menu View > Tab Order để kết thúc.
4. Phần code lập trình các chức năng
- Khai báo .Net Data Provider cho SQL Server
using System.Data.SqlClient;
- Khai báo các biến toàn cục nằm ngay dưới class
namespace QLBanHang
{
public partial class frmMatHang : Form
{
//Khai báo các biến toàn cục
SqlConnection con;//Khai báo đối tượng thực hiện kết nối đến cơ sở dữ liệu
SqlCommand cmd;//Khai báo đối tượng thực hiện các câu lệnh truy vấn
SqlDataAdapter dap;//Khai báo đối tượng gắn kết DataSource với DataSet
DataSet ds;//Đối tượng chứa dữ liệu tại local
public frmMatHang()
{
InitializeComponent();
}
}
}
- Viết sự kiện Form_Load, xảy ra khi form khởi động lên. Chúng ta thực hiện khởi tạo kết nối và nạp dữ liệu lên DataGridView
private void frmMatHang_Load(object sender, EventArgs e)
{
//Tạo đối tượng Connection
con = new SqlConnection();
//Truyền vào chuỗi kết nối tới cơ sở dữ liệu
//Gọi Application.StartupPath để lấy đường dẫn tới thư mục chứa file chạy chương trình
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\QLBanHang.mdf;Integrated Security=True;User Instance=True";
//Gọi phương thức Load dự liệu
LoadDuLieu("Select * from tblMatHang");
//Khi Form mới Load lên thì ẩn các bút Sửa và Xóa
btnSua.Enabled = false;
btnXoa.Enabled = false;
//An groupbox chi tiet
HienChiTiet(false);
}
//Viết một hàm nạp dữ liệu lên DataGrid
private void LoadDuLieu(String sql)
{
//tạo đối tượng DataSet
ds = new DataSet();
//Khởi tạo đối tượng DataAdapter và cung cấp vào câu lệnh SQL và đối tượng Connection
dap = new SqlDataAdapter(sql,con);
//Dùng phương thức Fill của DataAdapter để đổ dữ liệu từ DataSource tới DataSet
dap.Fill(ds);
//Gắn dữ liệu từ DataSet lên DataGridView
dgvKetQua.DataSource = ds.Tables[0];
}
//Phương thức ẩn hiện các control ở groupbox chi tiết
private void HienChiTiet(Boolean hien)
{
txtMaSP.Enabled = hien;
txtTenSP.Enabled = hien;
dtpNgayHH.Enabled = hien;
dtpNgaySX.Enabled = hien;
txtDonVi.Enabled = hien;
txtDonGia.Enabled = hien;
txtGhiChu.Enabled = hien;
//Ẩn hiện 2 nút Lưu và Hủy
btnLuu.Enabled = hien;
btnHuy.Enabled = hien;
}
- Chức năng tìm kiếm, sử dụng sự kiện Click của nút Tìm kiếm
//Chức năng tìm kiếm
private void btnTimKiem_Click(object sender, EventArgs e)
{
//Cập nhật trên nhãn tiêu đề
lblTieuDe.Text = "TÌM KIẾM MẶT HÀNG";
//Cấm nút Sửa và Xóa
btnSua.Enabled = false;
btnXoa.Enabled = false;
//Viet cau lenh SQL cho tim kiem
String sql = "SELECT * FROM tblMatHang";
String dk = "";
//Tim theo MaSP khac rong
if (txtTKMaSP.Text.Trim() != "")
{
dk += " MaSP like '%" + txtTKMaSP.Text + "%'";
}
//kiem tra TenSP va MaSP khac rong
if (txtTKTenSP.Text.Trim() != "" && dk != "")
{
dk += " AND TenSP like N'%" + txtTKTenSP.Text + "%'";
}
//Tim kiem theo TenSP khi MaSP la rong
if (txtTKTenSP.Text.Trim() != "" && dk == "")
{
dk += " TenSP like N'%" + txtTKTenSP.Text + "%'";
}
//Ket hoi dk
if (dk != "")
{
sql += " WHERE" + dk;
}
//Goi phương thức Load dữ liệu kết hợp điều kiện tìm kiếm
LoadDuLieu(sql);
}
- Chức năng Thêm, sử dụng sự kiện Click của nút Thêm
//Sự kiện thêm mới mặt hàng
private void btnThem_Click(object sender, EventArgs e)
{
lblTieuDe.Text = "THÊM MẶT HÀNG";
//Xoa trang GroupBox chi tiết sản phẩm
XoaTrangChiTiet();
//Cam nut sua xoa
btnSua.Enabled = false;
btnXoa.Enabled = false;
//Hiện GroupBox Chi tiết
HienChiTiet(true);
}
- Chức năng Sửa xảy ra khi chọn một bản ghi trên DataGridView. Kích đúp vàp DataGridView, VS sẽ phát sinh tự động sự kiện CellContentClick. Chúng ta lấy giá trị hàng hiện tại thông qua tham số của sự kiện DataGridViewCellEventArgs e trả về qua thuộc tính RowIndex. Sau đó ta viết sự kiện Click của nút Sửa
//Sư kiện khi người dùng chọn một hàng trên DataGridView
private void dgvKetQua_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//Hien thi nut sua
btnSua.Enabled = true;
btnXoa.Enabled = true;
btnThem.Enabled = false;
//Bắt lỗi khi người sử dụng kích linh tinh lên datagrid
try
{
txtMaSP.Text = dgvKetQua[0, e.RowIndex].Value.ToString();
txtTenSP.Text = dgvKetQua[1, e.RowIndex].Value.ToString();
dtpNgaySX.Value = (DateTime)dgvKetQua[2, e.RowIndex].Value;
dtpNgayHH.Value = (DateTime)dgvKetQua[3, e.RowIndex].Value;
txtDonVi.Text = dgvKetQua[4, e.RowIndex].Value.ToString();
txtDonGia.Text = dgvKetQua[5, e.RowIndex].Value.ToString();
txtGhiChu.Text = dgvKetQua[6, e.RowIndex].Value.ToString();
}
catch (Exception ex)
{
}
}
//Sự kiện Click của nút sửa
private void btnSua_Click(object sender, EventArgs e)
{
//Cập nhật tiêu đề
lblTieuDe.Text = "CẬP NHẬT MẶ HÀNG";
//Ẩn hai nút Thêm và Sửa
btnThem.Enabled = false;
btnXoa.Enabled = false;
//Hiện gropbox chi tiết
HienChiTiet(true);
}
- Chức năng Xoá xảy ra khi chọn một bản ghi trên DataGridView. Chúng ta vẫn sử dụng lại sự kiện ở CellContentClick của DataGridView ở phía trên. Sau đó ta viết sự kiện Click của nút Xoá
//Sự kiện Click của nút Xóa
private void btnXoa_Click(object sender, EventArgs e)
{
//Bật Message Box cảnh báo người sử dụng
if (MessageBox.Show("Bạn có chắc chắn xóa mã mặt hàng " + txtMaSP.Text + " không? Nếu có ấn nút Lưu, không thì ấn nút Hủy", "Xóa sản phẩm", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
lblTieuDe.Text = "XÓA MẶT HÀNG";
btnThem.Enabled = false;
btnSua.Enabled = false;
//Hiện gropbox chi tiết
HienChiTiet(true);
}
}
- Chức năng Lưu, chúng ta dựa vào trạng thái Enable của các nút Thêm, Sửa hoặc Xoá để xác nhận trạng thái thực thi câu lệnh SQL
//Sự kiện click vào button Lưu
private void btnLuu_Click(object sender, EventArgs e)
{
string sql = "";
//Kiếm tra nếu kết nối chưa mở thì thực hiện mở kết nối
if (con.State != ConnectionState.Open)
con.Open();
//Chúng ta sử dụng control ErrorProvider để hiển thị lỗi
//Kiểm tra tên sản phầm có bị để trống không
if (txtTenSP.Text.Trim() == "")
{
errChiTiet.SetError(txtTenSP, "Bạn không để trống tên sản phẩm!");
return;
}
else
{
errChiTiet.Clear();
}
//Kiểm tra ngày sản xuất, lỗi nếu người sử dụng nhập vào ngày sản xuất lớn hơn ngày hiện tại
if (dtpNgaySX.Value > DateTime.Now)
{
errChiTiet.SetError(dtpNgaySX, "Ngày sản xuất không hợp lệ!");
return;
}
else
{
errChiTiet.Clear();
}
//Kiểm tra ngày hết hạn xem có lớn hơn ngày sản xuất không
if (dtpNgaySX.Value > DateTime.Now)
{
errChiTiet.SetError(dtpNgaySX, "Ngày sản xuất không hợp lệ!");
return;
}
else
{
errChiTiet.Clear();
}
//Kiểm tra ngày hết hạn xem có lớn hơn ngày sản xuất không
if (dtpNgayHH.Value < dtpNgaySX.Value)
{
errChiTiet.SetError(dtpNgayHH, "Ngay hết hạn nhỏ hơn ngày sản xuất!");
return;
}
else
{
errChiTiet.Clear();
}
//Kiểm tra đơn vị xem có để trống không
if (txtDonVi.Text.Trim() == "")
{
errChiTiet.SetError(txtDonVi, "Bạn không để trống đơn vi!");
return;
}
else
{
errChiTiet.Clear();
}
//Kiểm tra đơn giá
if (txtDonGia.Text.Trim() == "")
{
errChiTiet.SetError(txtDonGia, "Bạn không để trống đơn giá!");
return;
}
else
{
errChiTiet.Clear();
}
//Nếu nút Thêm enable thì thực hiện thêm mới
//Dùng ký tự N' trước mỗi giá trị kiểu text để insert giá trị có dấu tiếng việt vào CSDL được đúng
if (btnThem.Enabled == true) {
//Kiểm tra xem ô nhập MaSP có bị trống không
if (txtMaSP.Text.Trim() == "")
{
errChiTiet.SetError(txtMaSP, "Bạn không để trống mã sản phẩm trường này!");
return;
}
else
{
//Kiểm tra xem mã sản phẩm đã tồn tại chưa đẻ tránh việc insert mới bị lỗi
sql = "Select Count(*) From tblMatHang Where MaSP ='" + txtMaSP.Text + "'";
cmd = new SqlCommand(sql, con);
int val = (int)cmd.ExecuteScalar();
if (val > 0)
{
errChiTiet.SetError(txtMaSP, "Mã sản phẩm trùng trong cơ sở dữ liệu");
return;
}
errChiTiet.Clear();
}
//Insert vao CSDL
sql = "INSERT INTO tblMatHang(MaSP,TenSP,NgaySX,NgayHH,DonVi,DonGia,GhiChu)VALUES (";
sql += "N'" + txtMaSP.Text + "',N'" + txtTenSP.Text + "','" + dtpNgaySX.Value.Date + "','" + dtpNgayHH.Value.Date + "',N'" + txtDonVi.Text + "',N'" + txtDonGia.Text + "',N'" + txtGhiChu.Text + "')";
}
//Nếu nút Sửa enable thì thực hiện cập nhật dữ liệu
if (btnSua.Enabled == true)
{
sql = "Update tblMatHang SET ";
sql += "TenSP = N'" + txtTenSP.Text + "',";
sql += "NgaySX = '" + dtpNgaySX.Value.Date + "',";
sql += "NgayHH = '" + dtpNgayHH.Value.Date + "',";
sql += "DonVi = N'" + txtDonVi.Text + "',";
sql += "DonGia = '" + txtDonGia.Text + "',";
sql += "GhiChu = N'" + txtGhiChu.Text + "' ";
sql += "Where MaSP = N'" + txtMaSP.Text + "'";
}
//Nếu nút Xóa enable thì thực hiện xóa dữ liệu
if (btnXoa.Enabled == true)
{
sql = "Delete From tblMatHang Where MaSP =N'" + txtMaSP.Text + "'";
}
//Thuc thi cau lenh sql
cmd = new SqlCommand(sql, con);
cmd.ExecuteNonQuery();
//Cap nhat lai DataGrid
sql = "Select * from tblMatHang";
LoadDuLieu(sql);
//dong ket noi
con.Close();
//Ẩn hiện các nút phù hợp chức năng
HienChiTiet(false);
btnSua.Enabled = false;
btnXoa.Enabled = false;
}
- Kích vào nút Huỷ để huỷ bỏ công việc đang làm
//Click vào nút Hủy
private void btnHuy_Click(object sender, EventArgs e)
{
//Thiết lập lại các nút như ban đầu
btnXoa.Enabled = false;
btnSua.Enabled = false;
btnThem.Enabled = true;
//xoa trang
XoaTrangChiTiet();
//Cam nhap
HienChiTiet(false);
}
- Kích vào nút Thoát
private void btnThoat_Click(object sender, EventArgs e)
{
//Đóng form
this.Close();
}
Download mã nguồn toàn bộ chương trình
- Chú ý:
- Khi bạn download mã nguồn về, cần chỉnh sửa đường dẫn đến nơi đặt CSDL của bạn. Đây là source code demo, nên tôi để hardcode chuỗi kết nối. Để xây dựng ứng dụng chuyên nghiệp, bạn nêu lưu chữ chuỗi kết nối trong file app.config để tiện thay đổi khi đi triển khai sản phẩm.
- Để nhập dữ liệu văn bản có dấu tiếng việt vào trong CSDL từ giao diện phần mềm, bạn cần thêm ký tự N trước giá trị của mỗi trường trong câu lệnh SQL, như ví dụ trên câu lệnh Insert, tôi đã thêm cho các trường MaSP, TenSP, DonVi, GhiChu.
Thầy chưa viết Hienchitiet() ạ?
Cảm ơne em. Mình cũng đã cung cấp code để các em xem chi tiết. Mình cũng đã cập nhật trên bài viết rồi nhé!
thưa thầy !!!! không có phần report ak ???
Phần report em có thể xem ở đây: https://timoday.edu.vn/tao-bao-cao-dung-control-reportviewer/
em xài visual 2010 nhưng không thể Solution Explorer > Add > New Item > Service-based Database được ! Mong thầy giúp đỡ !
Em có thể cần cài thêm SQL Server 2008 R2 Express theo link sau: https://www.microsoft.com/en-us/download/details.aspx?id=30438
cám ơn thầy ! cho em hỏi thêm nếu nhập vào trùng ID thì số lượng(mặt hàng) của ID đó sẽ cộng thêm, các lệnh như sum, count được viết thế nào ạ ?
Chào em, để làm được như em thì cần kiểm tra xem ID đó đã tồn tại trong CSDL chưa, nếu tồn tại rồi thì em dùng câu lệnh Update để cộng thêm số lượng vào đúng ID đó.
Câu lệnh để kiểm tra: SELECT COUNT(*) FROM ten_bang WHERE ID = id_cua_em.
Nếu có bản ghi thì giá trị trả về sẽ > 0, chứng tỏ ID đó đã tồn tại.
Sau đó em lấy tổng số lượng hiện tại: SELECT SoLuong FROM ten_bang WHERE ID = id_cua_em
Sau cùng dùng câu lệnh Update: UPDATE ten_bang SET SoLuong = so_luong_cu + sl WHERE ID = id_cua_em
tại sao em copy qua máy khác đã cài sql server luôn mà vẫn báo lỗi dữ liệu ,có cách nào để đem qua máy khác để sử dụng không .
EM cám ơn
Em chú ý, khi em copy đi sang máy khác nếu máy của họ cài SQL Server đặt tên khác thì em chạy sẽ bị lỗi.
Giải pháp em có thể lưu chuỗi kết nối trong file config, rồi khi em copy đến máy khác hoặc em triển khai phần mềm đến máy khác em chỉ cần thay đổi cấu hình trong file này là chương trình sẽ chạy, em không cần phải biên dịch lại code nữa.
Dạ em đả làm được rồi ạ ,Em cám ơn nhiều
Bạn cho mình hỏi lưu trong lưu chuỗi kết nối trong file config là làm như thế nào không mình đang cần
Bạn tham khảo bài này có hướng dẫn cách lưu trữ chuỗi kết nối trong file config nhé: https://timoday.edu.vn/phan-4-lap-trinh-co-so-du-lieu-voi-c/#muc6
https://drive.google.com/open?id=1jlMeFn-06uem8QpAusJ39EiwyHJjE_Bd
kiểm tra giúp em ,làm thế nào để đem ứng dụng này qua máy khác để sử dụng .Em cũng mới biết về C# chưa rành lắm .
Cho em hỏi với ạ. Tại sao chọn form khởi động là frmMain mà vẫn không được. Khi nhấn F5 thì vẫn là form khác ạ.
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
Em kiểm tra lại xem biên dịch có bị lỗi gì không? Nếu biên dịch lỗi mà em vẫn cứ chạy thì nó sẽ chạy file biên dịch cũ trước đây.
ko có hàm xoatrangchitiet() ạ
Hàm này đơn giản em. Em có thể viết thêm thủ tục trong code của form chính rồi gọi nó:
private void XoaTrangChiTiet()
{
txtMaSP.Text = “”;
txtTenSP.Text = “”;
dtpNgaySX.Value = DateTime.Now;
…..
}
Mình muốn tìm dữ liệu theo điều kiện: từ ngày tháng năm và giờ, phút đến ngày tháng năm và giờ, phút trong code nút Tìm kiếm để xuất nội dung tìm kiếm được ghi ra file .txt. thì viết thế nào?
thua tay thay co bai quanlyvanban dang the nay khong
Lập trình cho phép nhập vào từ bàn phím thông tin họ tên khách sạn, mã số điện kế, chỉ
số đầu, chỉ số cuối.
Sau đó xuất kết quả ra màn hình như sau:
Họ tên khách hàng:
Mã số điện kế:
Chỉ số đầu:
Chỉ số cuối:
Số tiền phải trả:
Quy ước tính toán:
Nếu 0 < số Kw tiêu thụ đơn giá là 500 đồng/1kw
Nếu 100 < số Kw tiêu thụ đơn giá là 600 đồng/1kw
Nếu 250 < số Kw tiêu thụ đơn giá là 800 đồng/1kw
Nếu 300
đơn giá là 1000 đồng/1kwBài viết rất hay rất dễ hiểu
hello
Thầy ơi cho em hỏi. Để sử dụng này máy có cần cài SQL Server không ạ?
Em cảm ơn, do chưa đọc kỹ ạ 🙂
thầy cho e hỏi là khi muốn thêm 1 lúc nhiều bản ghi mà không phải là mỗi lần chỉ thêm được 1 bản ghi vào nút thêm thì làm thế nào vậy ạ
Có thể làm được em ơi. Lúc này sẽ lập trình để insert trực tiếp trên lưới.
thưa thầy. sự kiện Click nút sửa chỉ là click thôi nhưng làm sao click vào sửa xong có thể lưu xuống gridview ạ!
Khi kích vào nút sửa, mình làm một thủ thuật là Enable = true, còn các nút khác Enable = false.
Trong sự kiện của btnLuu, sẽ check trạng thái Enable của các nút để thực hiện các chức năng Thêm mới, Sửa hoặc Xoá
Thưa thầy, em xài visual 2019, sql server 2019 express nhưng không thể Solution Explorer > Add > New Item > Service-based Database được ! Mong thầy giúp đỡ !
Thông báo lỗi như vậy ạ!
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 – Local Database Runtime error occured. Cannot create an automatic instance.)
Thưa thầy thầy có đường link nào hướng dẫn làm excel xuất hóa đơn ( ví dụ hóa đơn bán hàng ) không ạ?
Đây em: https://timoday.edu.vn/xay-dung-chuong-trinh-quan-ly-ban-hang-bang-c/#47_Form_Hoa_don_ban
Em chào thầy. Thầy giúp em khắc phục lỗi trùng khóa khi thêm dữ liệu mới vào csdl là file access nha. em đã kết nối với csdl được và đã thêm được nhưng chưa bắt nối trùng khóa được. em cám ơn Thầy
Em xem phần //Kiểm tra xem mã sản phẩm đã tồn tại
có hướng dẫn phần kiểm tra lỗi trùng khoá trước khi Insert vào CSDL
Nằm trong bài này luôn phải không Thầy? Em tìm chưa thấy. Hay tại e tệ quá nhìn không ra :((
Nằm trong bài này luôn. Em search trược tiếp trên bài này với từ khoá “Kiểm tra xem mac sản phẩm đã tồn tại”
Dạ em thấy rồi. Em cám ơn Thầy nhiều ạ…
Thầy có kênh youtube không ạ. Cho e xin link ạ
Kênh của mình đây: https://www.youtube.com/c/timoday
Thầy cho em hỏi là em đã làm theo thầy nhưng khi chạy nó lại báo lỗi ở chỗ dap.Fill(ds); là System.Data.SqlClient.SqlException: ‘Login failed for user ‘DESKTOP-VOGR0GJ\BIN’.’
Như vậy là bị sao ạ? Em xin cám ơn.
Báo lỗi này là do tài khoản đăng nhập vào SQL Server không đúng. Chuối kết nối chi tiết của em như thế nào?
Hiện tại em đã chạy được rồi ạ. Em cám ơn thầy.
Chúc mừng em!
Thầy ơi, hiện tại em đang có 2 vấn đề như thế này.
1. Em làm theo giống y như thầy hướng dẫn, nhưng em có hơi khác là ở chỗ đường dẫn. Đường dẫn của em là con.ConnectionString = @”Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\BIN\source\repos\QuanLyHangHoa\QuanLyHangHoa\QLHangHoa.mdf;Integrated Security=True”; Bài của em không có câu lệnh User Instance=True vì nếu em thêm lệnh này vào thì khi F5 chạy sẽ báo lỗi System.Data.SqlClient.SqlException: ‘The user instance login flag is not allowed when connecting to a user instance of SQL Server. The connection will be closed.’
Tại sao bài của em nếu có câu lệnh đó khi chạy lại bị lỗi vậy thầy?
2. Là khi không có câu lệnh User Instance=True, em F5 thì chạy được. Nhưng có vấn đề là khi em click vào nút Thêm thì các ô textbox ở Chi tiết vẫn bị disabled làm cho không nhập được gì. Khi em điền thông tin vào các textbox ở phần Tìm kiếm và click nút Tìm kiếm thì vẫn không trả về các giá trị cần tìm. Mặc dù em đã làm giống y như những gì thầy hướng dẫn rồi đó ạ. Nhờ thầy giải đáp giúp em với ạ. Em xin cám ơn thầy
Vì phiên bản SQL Server của bạn không hỗ trợ User Instance, thuộc tính User Instance mục đích cho phép tạo database từ code lập trình. User Instance chỉ hỗ trợ cho các phiên bản SQL Server Express em nhé.
cho e hoi down mã nguồn về r mở kiểu gì v ạ?