Tớ có một cái assignment là làm một từ điển anh-việt. Giờ đang làm phần nhập từ mới. Tớ có nghĩ ra giải thuật sau: [SPOIL]- Nhập từ tiếng anh và nghĩa tiếng việt +) Sau đó bắt đầu kiểm tra xem từ đó đã có hay chưa: - Dùng một vòng lặp để ghi toàn bộ file vào một mảng. - Dùng strstr để kiểm tra xem có từ tiếng anh vừa nhập trong mảng hay không. Nếu có thì hỏi xem có muốn thêm nghĩa tiếng việt hay không. Có thì di chuyển con trỏ về cuối từ tiếng anh và fputs nghĩa tiếng việt rồi fprintf thêm dấu phẩy để phân cách với nghĩa cũ. Không thì return. Nếu không có từ đó thì tiếp tục thực hiện chương trình là fputs cả từ tiếng anh và nghĩa tiếng việt vào cùng một vòng trong file văn bản.[/SPOIL] Nhưng có vấn đề xảy ra là giờ cái bước kiểm tra xem từ tiếng anh đã có hay chưa thì nó chả bao giờ báo là đã có rồi cả. Toàn bỏ qua rồi thực thi ghi luôn từ tiếng anh và nghĩa tiếng việt vào. Ai xem hộ tớ với:( [SPOIL] Mã: #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> struct tudien{ char english[15]; char vietnam[50]; }; void main() { struct tudien tumoi; char *l, *cha; char ch, addflag; char temp[1]; FILE *fp; cha=(char*)malloc(sizeof(char)); //Tao file neu chua co file trong may fp = fopen("D:\Tudien.dat", "a+"); if (fp == NULL) { printf("Khong the mo File"); getch(); return; } fclose(fp); //Nhap tu printf("Nhap tu moi tieng anh:"); gets(tumoi.english); printf("Nhap tu moi tieng viet:"); gets(tumoi.vietnam); //Mo file de kiem tra da co tu do hay chua fp = fopen("D:\Tudien.dat", "a+"); if (fp == NULL) { printf("Khong the mo File"); getch(); return; } do{ ch=fgetc(fp); temp[1]=ch; strcat(cha,temp); }while(ch!=EOF); l = strstr(cha,tumoi.english); if (l!=NULL) { printf("Da co tu nay.\nCo muon them nghia tieng viet hay khong?\nY = Yes, N = No - "); scanf("%c", &addflag); if (addflag == 'Y') { fseek(fp,sizeof(tumoi.english),SEEK_CUR); fputs(tumoi.vietnam, fp); fprintf(fp,","); printf("Ket thuc chuong trinh."); getch(); return; } else if(addflag == 'N') { printf("Ket thuc chuong trinh."); getch(); return; } } fclose(fp); //Mo file de ghi tu moi vao fp = fopen("D:\Tudien.dat", "a+"); if (fp == NULL) { printf("Khong the mo File"); getch(); return; } fputs(tumoi.english, fp); fputs(tumoi.vietnam, fp); fprintf(fp, "\n"); fclose(fp); printf("Ket thuc chuong trinh."); getch(); } [/SPOIL]
Tớ đã xem qua cách làm như vầy rồi,nhưng tớ muốn lấy dữ liệu ở database lên luôn kia(lấy 1 cái rồi dựa trên position đó để tìm những cái tương ứng còn lại.)
Đọc cái code xong muốn...,chẳng ghi chú thích gì cả,phải paste vào mà debug mới xong... Thứ nhất là hàm này: Mã: do{ ch=fgetc(fp); temp[1]=ch; strcat(cha,temp); }while(ch!=EOF); Đọc mãi mới hiểu hàm trên,hóa ra là đọc từng kí tự rồi ghép lại,xong lấy từ ghép lại vào tra ... Gì mà khổ vậy,trong C có hàm fgets() nó lấy luôn cả một dòng ký tự luôn mà,fgetc nó chỉ lấy có một kí tự,phải tốn cả vòng lặp. Thứ 2 là: kể từ dòng l != NULL trở xuống ,chỉ thấy có kiểm tra một kí tự thôi. Trong khi từ điển,vd muốn tra một từ thì nó tra hết cả từ điển luôn,nên phải để trong một vòng lặp chứ. Làm như già dê thì nó sẽ ra thế này: vd file input có 3 dòng: english yes no Mình nhập từ yes vào,nó sẽ kiểm tra với từ english,ko phải thì kết thúc luôn cả chương trình,thay vì tiếp tục lặp kiểm tra các từ còn lại.
Đoạn code login tớ tham khảo thế này Mã: Private Sub Button_Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Login.Click Dim connection As New SqlClient.SqlConnection Dim command As New SqlClient.SqlCommand Dim adapter As New SqlClient.SqlDataAdapter Dim dataset As New DataSet connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True" command.CommandText = "select * from [accounts] where username = '" & TextBox_Username.Text & "' and password = '" & TextBox_Password.Text & "';" connection.Open() command.Connection = connection adapter.SelectCommand = command [COLOR="Red"]adapter.Fill(dataset, "0")[/COLOR] Dim count = dataset.Tables(0).Rows.Count If count > 0 Then Form2.Show() Me.Hide() Else : MsgBox("Failed") End If Có 1 đoạn tớ xem mà k hiểu(dòng màu đỏ).Giờ tớ muốn dựa trên đoạn code ở trên để làm 1 chức năng tìm kiếm ví dụ như nhập username vào thì nó báo pass.vậy tớ phải làm sao?Tớ chả biết cách nào để móc record từ dataset ra hết Y__Y
Sau khi DataAdapter thực hiện một SELECT query thì nó sẽ đọc ra một tập hợp các record là RecordSet nếu câu truy vấn đúng. Lúc này dòng màu đỏ thực hiện hàm Fill để đổ RecordSet mà DataAdapter đọc được khi nãy vào trong một DataSet. Một DataSet là tập hợp của nhiều DataTable. DataTable thì giống như một tập con của bảng mà ta truy vấn tới. Nó chứa tất cả các cột mà ta đã truy vấn. + adapter.Fill(dataset, "0") ' Đổ vào DataTable có tên là "0" của biến dataset - Muốn lấy record từ DataSet thì thực hiện như: DataSet.Table("tên DataTable").Rows(Vị trí của row).Item("Tên cột") DataSet.Table(thứ tự của DataTable).Rows(Vị trí của row).Item(thứ tự cột) VD: string pwd = dataset.Table(0).Rows(0).Item("password") + Ngoài ra còn có thể đổ trực tiếp vào DataTable mà không cần qua DataSet nếu chỉ dùng một bảng. Dim dt As DataTable ' Khai báo biến DataTable adapter.Fill(dt) ' Đổ vào DataTable string pwd = dt.Rows(0).Item("password") ' Lấy password dòng đầu tiên Hoặc Dim dt As DataTable Dim dr As DataRow adapter.Fill(dt) dr = dt.Rows(0); string pwd = dr.Item("password") Xem thêm về System.Data hay ADO.NET [1][2]
Thì có 2 kiểu tham số truyền vào để lấy DataTable trong DataSet là: + Thứ tự của nó trong DataSet (1 DataSet có nhiều DataTable) + Tên của DataTable mà mình đã Fill từ DataAdapter vào DataSet Dùng thứ tự nếu mình biết chính xác thứ tự của các DataTable trong DataSet. Nhưng thường khuyên nên dùng tên của DataTable để lấy thông tin chính xác hơn.
ở đây có ai biết hoặc có link dạy về nguyên lý kết nối khi làm những game có hệ thống multiplay ko....chả là định làm cái game cờ caro onlan 2 máy mà ko biết làm thế nào để kết nối cả :(
Tớ lại hỏi tiếp ^__^.Làm sao để thực hiện insert,update và delete dựa theo cơ cấu code ở trên vậy?Mình có làm theo các oleadapter nhưng nếu dùng trong SOL server thì đẩy dữ liệu lên đc,nhưng dùng mdf thì lại k thể,update xong tắt mở lại nó k có. Ví dụ như vầy,như code ở trên,tớ search username để ra pass và permission.Giờ tớ muốn sau khi search username có thể update lại permission.Hoặc insert thêm cái mới
Nếu dùng DataAdapter để thực hiện Insert/Update/Delete thì nó chỉ thực hiện hành động thay đổi đó lên DataTable của DataSet mà thôi. Vì nó chỉ là Adapter giữa application và DB cho nên cần thêm một bước nữa để cập nhật những thay đổi từ DataTable lên DB bằng cách gọi VD: adapter.Update(dataset,"tên DataTable") Lúc này OLEDBAdapter sẽ thực hiện những thay đổi lên file Access. Ngoài ra có thể dùng đối tượng OleDbCommand để thực hiện: Lưu ý: Thực hiện tất cả thao tác với hệ quản trị CSDL cần cho vào bên trong Try Catch để dễ bắt lỗi. Sau khi thực hiện xong một hành động nếu không còn sử dụng đến thì nên close DataAdapter, Connection để giải phóng kết nối và bộ nhớ. Nếu cậu thật sự muốn làm thì phải chịu khó search. Keyword để search về lập trình mạng thì "Socket Programming" in "ngôn ngữ sử dụng" hay "Networking Programming", "TCP Programming", "UDP Programming" VD: "Socket Programming" in C++ Ebook [1][2]
Dùng SqlCommandBuilder là gọn nhẹ nhất, chỉ cần truyền vào câu lệnh SELECT là nó tự build ra cho mình lệnh update. Chú này đang học Q7 ở NIIT à, nhìn code quen quen
Có thể minh họa cho mình k^__^ Hỗ trợ dùm mình 1 chút nhé,viết tới đây roài tịt ngòi rùi Y__Y Mã: Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim connection As New SqlClient.SqlConnection Dim command As New SqlClient.SqlCommand Dim adapter As New SqlClient.SqlDataAdapter Dim dataset As New DataSet connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True" command.CommandText = "UPDATE accounts SET permission=" & pertextbox.Text & " WHERE username=" & usertextbox.Text & "';" connection.Open() command.Connection = connection adapter.SelectCommand = command 'viet gi bi gio hix hix End Sub
Minh họa: có 1 lưới hiển thị danh sách phòng ban trong 1 cty, 1 button thực hiện chức năng thêm mới 1 phòng ban, 1 button lưu dữ liệu Mã: Public Class frmQuanLiPhongBan Dim m_connection As New SqlConnection Dim m_dataAdapterPhongBan As New SqlDataAdapter Dim m_dsPhongBanNhanVien As New DataSetPhongBanNhanVien Dim m_bindingSourcePhongBan As New BindingSource Private Sub frmQuanLiPhongBan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load m_connection = ConnectionManager.getConnection() 'Gắn command cho bảng PhongBan Dim m_commandPhongBan As New SqlCommand m_commandPhongBan.Connection = m_connection m_commandPhongBan.CommandText = "SELECT * FROM PhongBan" m_commandPhongBan.CommandType = CommandType.Text m_dataAdapterPhongBan.SelectCommand = m_commandPhongBan m_dataAdapterPhongBan.Fill(m_dsPhongBanNhanVien.PhongBan) [B]Dim m_commandBuilder As New SqlCommandBuilder(m_dataAdapterPhongBan)[/B] 'Đổ dữ liệu lên DataGrid m_bindingSourcePhongBan.DataSource = m_dsPhongBanNhanVien.PhongBan bindAllData() gridPhongBan.DataSource = m_bindingSourcePhongBan Private Sub bindAllData() 'Bind dữ liệu PhongBan txtPhongBan.DataBindings.Add(New Binding("Text", m_bindingSourcePhongBan, "TenPhongBan")) txtGhiChu.DataBindings.Add(New Binding("Text", m_bindingSourcePhongBan, "GhiChu")) End Sub Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click 'Thêm một phòng ban mới OnAdd() End Sub Private Sub btnLuu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLuu.Click OnSave() End Sub End Class BindingSource đóng vai trò trung gian quản lí dữ liệu giữa DataSet và DataGriew. Dùng SqlCommandBuilder chỉ cần truyền tham số là SqlDataAdapter sau khi SqlDataAdapter được khai báo là nó tự build cho mình những lệnh khác. Mã: Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim connection As New SqlClient.SqlConnection Dim command As New SqlClient.SqlCommand Dim adapter As New SqlClient.SqlDataAdapter Dim dataset As New DataSet connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True" command.CommandText = "UPDATE accounts SET permission=" & pertextbox.Text & " WHERE username=" & usertextbox.Text & "';" connection.Open() command.Connection = connection adapter.SelectCommand = command 'viet gi bi gio hix hix End Sub Thiếu cái lệnh update Mã: adapter.update(dataset.tenbang)
sao khi tớ thêm cái lệnh update như vầy Mã: adapter.Update(dataset.Tables("accounts")) nó báo Value cannot be null. Parameter name: dataTable Nếu đc Dream cho tớ xin cái file vb của ví dụ phía phòng ban phía trên nhé,xin lỗi nếu đòi hỏi quá đáng
dataset, chấm xong ghi tên bảng muốn update trực tiếp luôn chứ đừng ghi kiểu đó lỡ mai mốt dataset có thay đổi gì thì khó sửa lắm. VD: Mã: adapter.Update(dataset.accounts)