Để làm được “bài 43 – quản lý đăng ký học phần bằng sms cho các trường đại học”, Tui sẽ cung cấp từng kỹ năng độc lập sau đó quay lại bài 43 các bạn có thể tự làm được một cách dễ dàng.
Trong bài tập 44 này Các bạn sẽ được học:
1) Cách tạo 1 CSDL trong SQL Server
2) Cách viết .net Webservice để tương tác với CSDL
3) Cách thức đưa CSDL và .net webservice lên somee.com
——————————————————————–
1) Cách tạo 1 CSDL trong SQL Server:
– CSDL trong bài tập này sẽ được sử dụng trong hàng loạt các bài tiếp theo
– Tui muốn tạo 1 CSDL tên là dbProductManager với cấu trúc như dưới đây:
–– Hiển nhiên các bạn phải tự tạo được CSDL như trên.
– Bạn có thể dùng bất kỳ Version SQL Server nào cũng được (2005, 2008, 2012…)
– Tui chụp hình cấu trúc cây DB và version mà Tui Demo cho bài tập này như sau:
2) Cách viết .net Webservice để tương tác với CSDL
– Tui sử dụng Visual Studio 2010 để tạo Webservice, bạn có thể dùng 2012, 2013 cũng được không sao.
– Từ menu File/ chọn New/ chọn Website (hoặc nhấn tổ hợp phím Shift +ATL+ N) để tạo một website trong visual studio:
– Màn hình chọn Project xuất hiện: Ta chọn Empty Website như hình dưới đây rồi nhấn nút OK:
– Sau khi bấm OK, ta có giao diện như dưới đây:
– Bây giờ ta tiến hành viết .net webservice để tương tác tới CSDL tạo ở mục số 1 như sau:
– Tui muốn dùng LinQ to SQL để viết code cho lẹ và giúp các bạn dễ hiểu hơn, ta làm như sau:
Từ menu View/ chọn Server Explorer để mở cửa sổ kết nối CSDL như bến dưới đây:
– Trong màn hình Server Explorer/ ta bấm chọn biểu tượng kết nối mà Tui tô vòng tròn màu đỏ.
– Màn hình kết nối được hiển thị ra như dưới đây:
– Tui đánh theo thứ tự từ 1->5:
1) Server name: Nhập tên Server của máy bạn vào đây, trên kia thì máy của tui tên là drthanh.
2) Chọn kiểu Authentication, bạn chọn loại nào cũng được, trên kia tui chọn Windows Authentication.
3) Chọn CSDL, dĩ nhiên ta phải chọn đúng CSDL dbproductmanager.
4) Test connection để kiểm tra xem có kết nối thành công hay không, khi bạn test mà nó ra cửa sổ sau là OK:
5) Bấm OK để chấp nhận Kết nối.
Kết quả như sau:
– Bây giờ ta tiến hành dùng LinQ to SQL để tương tác tới CSDL này như sau:
Bấm chuột phải vào Project website tạo ở bước trên/ chọn Add New Item:
Trong màn hình New Item ta chọn LINQ to SQL Classes như hình dưới đây, đặt tên ProductManager.dbml rồi nhấn nút Add:
– Sau khi bấm nút Add, ta được thông tin như hình dưới:
– Tui đánh dấu hình trên thành 4 vùng : 1,2,3,4.
Vùng 1: là vùng CSDL
Vùng 2: Là vùng ta kéo thả CSDL vào
Vùng 3: là vùng ta kéo thả các Store Procedure vào
Vùng 4: Vùng cấu trúc tập tin, lớp mà ta lập trình.
– Bây giờ ta tiến hành kéo thả CSDL vào vùng số 1 như sau:
+ Đè phím Ctrl + click chuột vào 2 bảng Catalog và Product rồi kéo vào vùng số 2, ta được giao diện:
Ở bước trên, hệ thống đã tự phát sinh các lớp, hàm (CRUD) cho phép chúng ta tương tác tới CSDL một cách dễ dàng. Ở đây nó tự động sinh ra lớp ProductManagerDataContext và các lớp tương ứng với mỗi bảng (tức là có 2 lớp tự động được phát sinh: Catalog và Product). Thông qua các lớp này chúng ta có thể tương tác được với CSDL. Các bạn cần học thêm phần LINQ to SQL ở mục LinQ trong menu lập trình tiên tiến: http://duythanhcse.wordpress.com/lttt/ Tui không có thời gian để nói thêm phần này.
– Tiếp tục tạo Webservice để cung cấp các hàm lấy dữ liệu, ta cũng bấm chuột phải vào Project/ chọn Add new Item để hiển thị màn hình dưới đây:
– Ở màn hình trên ta chọn Web Service, đặt tên cho nó (mywebservice) rồi nhấn nút Add.
– Khi nhấn nút Add, mặc định ta có thông tin của web service như sau:
– Ta tiến hành thêm một số hàm để sử dụng cho bài tập này như sau:
1- Hàm đếm xem có bao nhiêu danh mục trong bảng catalog
2- Hàm trả về danh sách Catalog
3- Hàm trả về thông tin của 1 Catalog theo Id
4- Hàm trả về danh sách Product
5- Hàm trả về danh sách Product theo Catalog Id
6- Hàm trả về thông tin của một Product theo Id
7- Hàm xóa Catalog theo ID
8- Hàm xóa Product theo ID.
9- Xuất tổng tiền của các mặt hàng
Ta lần lượt viết các hàm này như sau:
[code language=”csharp”]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
///
/// Summary description for mywebservice
///
[WebService(Namespace = “http://tranduythanh.com/”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class mywebservice : System.Web.Services.WebService {
ProductManagerDataContext db = null;
public mywebservice () {
//Uncomment the following line if using designed components
//InitializeComponent();
db = new ProductManagerDataContext();
}
[WebMethod]
public string HelloWorld() {
return “Hello World”;
}
//Hàm đếm xem có bao nhiêu danh mục trong bảng catalog
[WebMethod]
public int CountCatalog()
{
return db.Catalogs.Count();
}
//2- Hàm trả về danh sách Catalog
[WebMethod]
public List getListCatalog()
{
List listCate = db.Catalogs.ToList();
foreach (Catalog c in listCate)
c.Products.Clear();
return listCate;
}
//3- Hàm trả về thông tin của 1 Catalog theo Id
[WebMethod]
public Catalog getCatalog(string id)
{
Catalog c=db.Catalogs.FirstOrDefault(x => x.CateId == id);
c.Products.Clear();
return c;
}
//4- Hàm trả về danh sách Product
[WebMethod]
public List getListProduct()
{
List listPro = db.Products.ToList();
foreach (Product p in listPro)
p.Catalog = null;
return listPro;
}
//5- Hàm trả về danh sách Product theo Catalog Id
[WebMethod]
public List getListProductByCatalogId(string id)
{
List listPro=db.Products.Where(x => x.CateId == id).ToList();
foreach(Product p in listPro)
p.Catalog=null;
return listPro;
}
//6- Hàm trả về thông tin của một Product theo Id
[WebMethod]
public Product getProduct(string id)
{
Product p = db.Products.FirstOrDefault(x => x.ProductId == id);
p.Catalog = null;
return p;
}
//7- Hàm xóa Catalog theo ID
[WebMethod]
public bool deleteCatalog(string id)
{
try
{
Catalog cate = getCatalog(id);
db.Catalogs.DeleteOnSubmit(cate);
db.SubmitChanges();
}
catch (Exception ex)
{
return false;
}
return true;
}
//8- Hàm xóa Product theo ID.
[WebMethod]
public bool deleteProduct(string id)
{
try
{
Product p = getProduct(id);
db.Products.DeleteOnSubmit(p);
db.SubmitChanges();
}
catch (Exception ex)
{
return false;
}
return true;
}
//9- Xuất tổng tiền của các mặt hàng
[WebMethod]
public double getToTalMoney()
{
return db.Products.Sum(x => x.TotalMoney).Value;
}
}
[/code]
– Bạn chú ý đoạn code ở trên tui gán =null nhiều chỗ lý do để xử lý việc Loop trong thao tác Webservice, nếu có sự loop (hay đệ quy) thì nó không chấp nhận. Nếu viết bằng Winform hay Webform bình thường thì không sao.
– Ta tiến hành kiểm tra webservice trên máy cục bộ như sau (nhấn F5 để chạy):
bạn Thấy đấy, các hàm được hiển thị ra ở đây. Để test thì bạn chỉ cần bấm vào hàm rồi chọn Invoke là OK. Tui ví dụ chọn hàm CountCatalog và getListCatalog, getListProductByCatalogId:
Mục đích của chúng ta là kết nối từ Android tới Webservice này để tương tác. Bạn có thể cấu hình IIS để chạy trên máy cục bộ, nhưng ở đây TUI muốn hướng dẫn các bạn đưa nó lên Internet (trang Somee) để demo thực tế, tại vì thực tế là nó nằm trên internet. Android chỉ là Client.
3) Cách thức đưa CSDL và .net webservice lên somee.com
– Bước 1: Vào https://somee.com
– Bước 2: Chọn Free .Net hosting như hình dưới đây:
Bấm chọn Learn More để qua bước 3.
Bước 3: Chọn Order để mua gói miễn phí này:
Bước 4: Nhập các thông số cần thiết để tạo tạo tài khoản:
– Bấm Register new user and continue để đăng ký và tiếp tục với màn hình checkout.
Bước 5: – Chọn các thông số rồi bấm Continue, màn hình Create Website sẽ hiển thị ra như bến dưới, ta nhập các thông tin rồi bấm:
Màn hình thông báo thành công hiển thị ra dưới đây:
– Tiếp theo ta tạo CSDL cho trang testdrthanh.somee.com
– Bấm chọn mục Databases ở bên tay trái trên màn hình ở trên:
Màn hình trên nó nút “Create” mà Tui khoanh màu đỏ, ta bấm vào nó. Màn hình tạo CSDL hiển thị ra, ở đây ta nên đặt cùng tên với CSDL mà ta tạo ở máy Client để dễ dàng Backup, Restore .
Sau khi nhập đầy đủ thông tin, bấm chọn “Create empty database”.
sau khi tạo thành công thì ta có màn hình như dưới đây:
Bạn để ý dòng Tui tô xanh lè, đó chính là chuỗi kết nối tới CSDL, bạn có thể copy paste chuỗi này dán vào chuỗi kết nối ở máy Local của bạn thì khi chạy website nó sẽ kết nối tới CSDL ở trên trang somee này.
workstation id=dbproductmanager.mssql.somee.com;packet size=4096;user id=drthanh_SQLLogin_1;pwd=7szjt75abq;data source=dbproductmanager.mssql.somee.com;persist security info=False;initial catalog=dbproductmanager
– testdrthanh.somee.com chính là sub domain mà nó cung cấp cho mình, dựa vào đây để ta lấy thông tin.
– Bây giờ ta tiến hành đưa dữ liệu từ máy Local lên Trang somee, làm như sau:
1- Backup lại CSDL tại máy Local của bạn:
Bấm chuột phải vào CSDL/ chọn Tasks/ Chọn Backup:
Màn hình chọn Backup hiển thị ra như dưới đây, ta tiến hành nhập thông số rồi bấm OK:
Giờ bạn kiểm tra ổ đĩa D:/ xem có tập tin này hay chưa, nếu có tức là đã backup thành công.
2- Đưa file Backup này lên Server somee:
Ta chọn Restore database, rồi chọn “Choose File“, chọn đúng tập tin vừa backup ở trên rồi bấm “Upload the file and restore it“.
Chờ báo thành công là OK:
Để test coi nó có chạy được hay không thì ta chọn mục “New SQL Query” ở màn hình trên, nó sẽ hiển thị ra cửa sổ cho phép ta nhập câu SQL:
– Như hình trên thì đã thành công.
3- Tiếp tục ta đưa Webservice lên somee để Test như sau:
– Dùng Win Zip của hệ điều hành Windows, nén lại source code và đẩy lên server. Dĩ nhiên ta cần sửa chuỗi kết nối lại. Như mục trên Tui đã nói là copy paste chuỗi kết nối :
workstation id=dbproductmanager.mssql.somee.com;packet size=4096;user id=drthanh_SQLLogin_1;pwd=7szjt75abq;data source=dbproductmanager.mssql.somee.com;persist security info=False;initial catalog=dbproductmanager
Thay thế cho chuỗi có sẵn ở máy Local như sau (dĩ nhiên khi bạn tạo thì chuỗi nó phải khác và bạn phải lấy theo chuỗi của bạn):
Trong Project Web Service, mở tập tin Web.config và thay thế bằng chuỗi trên:
– Sau đó tiến hành zip như sau:
– Ở hình trên là ta Ctrl+ A để chọn toàn bộ tập tin và thư mục/sau đó ta bấm chuột phải vào 1 tập tin bất kỳ trong thư mục chứa source code/ chọn Send to / chọn Compressed… như hình bên trên, nó phát sinh ra một file zip chứa toàn bộ source code trong này (ta chọn tập tin nào để bấm chuột phải cũng được).
– Sau khi có file zip, ta quay lại màn hình somee server để đưa source code lên như sau:
1- Chọn File Manager/ cửa sổ hiển thị lên chọn nút Upload như hình bên dưới:
Sau khi chọn nút Upload thì nó xuất hiện cho chúng ta nút Choose File để đưa file từ client lên Server/ ta chọn đúng file zip lúc này rồi bấm Upload and Unzip archives:
– Sau khi bấm Upload and unzip archives thì ta có kết quả như sau:
– Bạn thấy đấy, toàn bộ source code đã được đưa lên server.
– Bây giờ ta tiến hành kiểm tra Webservice có chạy hay không như sau:
http://testdrthanh.somee.com/mywebservice.asmx :
Như vậy là đã thành công, bạn có thể tiến hành kiểm tra từng Service trong này.
Bài tập này Tui đã hướng dẫn chi tiết cách tạo Webservice, cách tạo CSDL, cách đưa dữ liệu lên Server somee, cách sử dụng LinQtoSQL…
Bạn cần thực hành nhiều lần và cố gắng hiểu nó.
Trong bài tập kế tiếp Tui sẽ hướng dẫn các bạn cách dùng Android kết hợp với KSOAP API để lấy dữ liệu từ webservice này.
Bài tập này rất quan trọng, nó rất hữu ích cho các bạn đặc biệt là khi triển khai dự án thực.
Các bạn có thể tải source code và CSDL ở đây, nhớ đổi lại chuỗi kết nối khi thử trên máy tính cá nhân của bạn: http://www.mediafire.com/download/xsuou1aakukrlep/Hoc_Webservice.rar
Chúc các bạn thành công.
bài viết của thầy rất hay
cảm ơn thầy rất nhiều
Thầy ơi cho em hỏi, em viết bằng java, làm sao để kết nối từ java để lấy csdl trên somee.com hả thầy.
Thanks thầy nhiều, giá mà thầy giáo nào cũng nhiệt tình chia sẻ kiến thức như thầy thì thật tuyệt!
Thưa thầy khi nào thầy mới dạy tiếp bài tiếp theo ạ (cách dùng Android kết hợp với KSOAP API để lấy dữ liệu từ webservice này.)
Em xem bài 45, 46
Thưa thầy cho em hỏi phần thầy set null, em vẫn chưa hiểu rõ tại sao phải cần làm như vậy. Em có đọc qua một số tài liệu web service với linq khác nhưng không tìm được phần giống như vậy, nên cũng không tìm được giải thích cặn kẽ…
thưa thầy cho em hỏi, em đã up được rồi, nhưng nó lại báo lỗi
http://wsgiaohang.somee.com/
Bạn thêm cái tên webservice vào nữa.
http://wsgiaohang.somee.com/
Ví dụ: http://wsgiaohang.somee.com/mywebservice.asmx
Bạn thêm cái tên webservice của bạn vào nữa.
Ví dụ: http://wsgiaohang.somee.com/mywebservice.asmx
public List getListCatalog()
{
List listCate = db.Catalogs.ToList();
foreach (Catalog c in listCate)
c.Products.Clear();
return listCate;
}
thầy cho em hỏi nếu bảng Catalog độc lập không liên quan tới Products. thì trong vòng foreach viết cái ji ạ
Độc lập thì bỏ foreach đi nha bạn!
Cảm ơn thầy! Thầy rất nhiệt tình.
qua hay qua nhiet tinh cam on ban rat nhieu
thầy ơi, với java viết web service thì mình sẽ đưa lên thế nào ạ, thầy có thể viết 1 bài sử dụng java để tạo web service soap và đưa lên giống như c# này được không thầy. Hiện em đã viết được web service bởi java với axis2 nhưng em chưa biết đưa server để có thể truy xuất từ trang web hay ứng dụng của mình về thầy ạ.
Em cảm ơn thầy. 😀
Thầy cho em hỏi, thư mục app_code mình chứa gì trong đó vậy Thầy.
Thưa thầy em đã up lên và vào http://www.teswebservice.somee.com/mywebservice.asmx
thì bị lỗi
Server Error in ‘/’ Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.
Requested URL: /mywebservice.asmx
các hình ảnh trong bài viết bị lỗi rồi thầy
em làm tới bước tạo linq to sql thì nó hiện ra bảng báo lỗi Can not find assembly ‘System.Core’.
Thầy ơi có bài về Restful webservice không ạ?
em cảm ơn thầy nhiều !
Em muốn hỏi là nếu trong CSDL mà mình tạo có 1 cột để lưu trữ ảnh ví dụ định dạng image chẳng hạn. Thì làm các phương thức set hoặc get ,getlist ảnh trong myservice sẽ làm như thế nào. Em cảm ơn
em có thể tham khảo:
1) http://stackoverflow.com/questions/9404067/send-an-image-from-android-to-an-asp-net-web-service
2) http://www.codeproject.com/Tips/569532/Submit-Images-to-Web-Service-and-Get-Them-Back
thầy ơi cho em hỏi chút là webservice có áp dụng với SQLite k ạ, nếu được thầy chỉ em một chút cách get, set data được k thầy. Em cảm ơn
thầy ơi cho em hỏi ạ…em sử dụng jsp và mysql nó có hỗ trợ không thầy … em đọc qua hình như some one không hỗ trợ thì phải? em cảm ơn!
Thầy ơi!Mỗi lần mình muốn thêm một phương thức vào web thì lại phải làm lại từ đầu ak?.có cách nào nhanh hơn không a?
đỉnh quá thầy ơi, em yêu thầy.
đây thực sự là một bài em kiếm bấy lâu nay, cực đơn giản, chi tiết, dễ hiểu, ko thừa cũng ko thiếu. tuyệt vời.
chúc thầy mạnh khỏe.
Thầy ơi cho em hỏi.Em làm theo hướng dẫn của thầy đến đoạn Đưa file Backup lên Server somee nhưng nó toàn báo lỗi “The file you selected is not a MS SQL database backup file!” là sao hả thầy?Em tạo file backup đúng như hướng dẫn của thầy không sai tí nào,em cảm ơn thầy!
Bài viết của Thầy rất hữu ích, rất cám ơn thầy
mình upload dữ liệu lên được somme , nhưng k kết nối được đến asp bạn giúp mình được k /
Thầy ơi sao cái bước cuối cùng webservice của e đã đc up lên somee.com rồi nhưng click vào từng method nó lại ko xử lí gì cả mà feedback lại là ” The test form is only available for requests from the local machine”.
Link webservice của em: http://hoangbc.somee.com/WebService.asmx
Mong thầy feedback sớm.
Em dùng WCFClient test để sử dụng (trong chỗ cài đặt Visual)
Thầy ơi thầy hướng dẫn e làm về eclip và CDL dùng Mysql để tạo webservice với ạ.Em cảm ơn thầy
List listCate = db.Catalogs.ToList();
foreach (Catalog c in listCate)
c.Products.Clear();
Và:
List listPro = db.Products.ToList();
foreach (Product p in listPro)
p.Catalog = null;
return listPro;
Có ai hiểu, ý nghĩa 2 vòng lặp foreach để làm gì không?
Em chào thầy ạ! Bài viết rất hay ạ! Thầy cho em hỏi làm làm sao để down một file (ví dụ: a.mp3) từ trên webservices về được ạ! Cái phương thức đó như thế nào ạ!
sau khi em đưa lên thì bị lỗi “HTTP Error 503. The service is unavailable.” ạ. mọi người có ai gỡ lỗi giúp em được không ạ? em cám ơn
Hi em
Cụ thể là em đưa lên đâu? cách đưa có đúng chưa
Em nên chụp cấu trúc thư mục lúc em đưa lên xem có đúng không nhé.
Thầy Thanh.
dạ em đưa lên lại vài lần thì được rồi ạ. Thầy cho em hỏi thêm là nếu em muốn phân quyền cho database trên host (như phân quyền trong sql server management studio thì phải làm sao ạ?
hic.. mấy cái này.. cái nào viết trên visual, cái nào viết trên android studio vậy thầy 🙂
Thầy viết hay qá thầy ơi
Cám ơn em. Chúc em học tốt!
Bài viết rất củ thể, nhưng trên visual studio 2013 thì em viết các phương thức xóa thì dòng lệnh [Tên bảng] a = get[Tên bảng](giá trị truyền vào method); bị lỗi thầy
Tới lúc chỗ kéo thả table thì kéo ko vô thầy ơi..thấy giúp em với.cảm ơn thầy a
bài em bị lỗi thầy ơi ! giúp em vs
Em muốn join 2 bảng lại với nhau thì làm sao vậy ạ?
Được Em, Em nên viết store để lấy ra kết quả join 2 bảng cho tiện
Thầy Thanh
em cảm ơn thầy, em hiểu cách làm rồi ạ. thầy giảng dễ hiểu, nhưng câu nào thầy kêu tự làm em đều làm được hết.
Ok Em
Cám ơn EM
chúc Em học tốt
Thầy Thanh
Em up thành công rồi nhưng nó không hiện nút invoke là sao vậy ạ?