Class CSDL chung cho SQL Server và MS Access

Bộ sưu tập các thư viện hỗ trợ sẳn cho Visual Basic .NET và C#

Các điều hành viên: tungcan5diop, QUANITGROBEST

Nội quy chuyên mục
1. Gửi bài viết tại đây, Tester sẽ chuyển vào trong nếu bài viết đạt yêu cầu.
2. Gửi bài theo mẫu qui định: viewtopic.php?f=2&t=5
[ten][/ten]
[loai][/loai]
[ngonngu][/ngonngu]
[tacgia][/tacgia]
[chucnang][/chucnang]
[end][/end]
Đăng trả lời
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Gồm có 2 class là AppConfig class đễ thay đỗi thông tin trong Application Configuration (exe.config) và Database class có những chức năng đễ thao tác CSDL.
Tập tin đính kèm
DemoApplication.zip
(26.04 KiB) Đã tải về 675 lần
Hình đại diện của thành viên
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: Thứ 4 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 27 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by tungcan5diop »

lỗi bạn ơi, chắc là do ko xét quyền của Win hay của SQL rồi.
Tập tin đính kèm
001.JPG
001.JPG (25.84 KiB) Đã xem 8547 lần
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Đó là quyền cũa win cho nên bạn phãi uncheck checkbox Integrated Security và điền vào user name và password ỡ dưới mới được.
Hình đại diện của thành viên
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: Thứ 4 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 27 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by tungcan5diop »

sau khi đăng nhập thành công thì báo lỗi như trên, tắt đi mở lai, cũng lỗi như trên.
Tập tin đính kèm
002.JPG
002.JPG (7.74 KiB) Đã xem 8528 lần
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Customers là table trong Northwind database, trường hợp không dùng database đó thì vào form1 thay thế customers thành tên table nào đó trong database cũa bạn.
binkute
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 57
Ngày tham gia: Thứ 3 15/01/2013 8:01 pm
Has thanked: 10 times
Been thanked: 3 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by binkute »

Trong sever explorer thì mình đã kết nối được với CSDL, nhưng trong demo của bạn mình vẫn nhập thông số đó nhưng cứ báo lỗi ko kết nối. hic
Là sao bạn nhỉ
chimokato
Bài viết: 1
Ngày tham gia: Thứ 3 19/03/2013 2:22 am

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by chimokato »

Trước tiên cảm ơn bạn đã đóng góp 1 class rất hay và bổ ích. Tuy nhiên bạn nên kiểm tra lại Function ExecuteReader vì tôi thấy nó không thể trả về kiểu dbDataReader ngay cả khi đổi lại như sau:
Public Function ExecuteReader(ByVal commandText As String) As DbDataReader
Dim reader As DbDataReader = Nothing
Using connection As DbConnection = dbProviderFactory.CreateConnection()
connection.ConnectionString = Me.ConnectionString
Using cmd As DbCommand = connection.CreateCommand()
connection.Open()
cmd.CommandText = commandText
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ' Đã đổi thành closeConnection
End Using
End Using
Return reader
End Function
Hình như vấn đề này không làm được hay sao ấy! Nếu có thể bạn vui lòng chỉnh sửa lại nha!

Thanks!
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Bạn sữa lại function đó như sau:
  1. Public Function ExecuteReader(ByVal commandText As String) As DbDataReader
  2.         Dim reader As DbDataReader = Nothing
  3.         Using cmd As DbCommand = Me.Connection.CreateCommand()
  4.             cmd.CommandText = commandText
  5.             Me.Connection.Open()
  6.             reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
  7.         End Using
  8.         Return reader
  9.     End Function
Hình đại diện của thành viên
QUANITGROBEST
Thành viên trung thành
Thành viên trung thành
Bài viết: 227
Ngày tham gia: Thứ 5 11/10/2012 9:47 am
Đến từ: Thái Bình
Has thanked: 74 times
Been thanked: 23 times
Tiếp xúc:

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by QUANITGROBEST »

Hiện mình đang làm 1 dự án trên wwinform VB.net, chuối kết nối hiện tại mình code cứng như vầy trong file app.config
  1. <add name="connect" connectionString="Data Source=192.168.2.160\SQL2K8;database=GROBEST_DB2;User ID=sa;Password=*Ab123456;" providerName="System.Data.SqlClient"/>


Nếu như vậy khi người dùng thay đổi server chứa CSDL mình phải bung code ra sửa lại file kết nối build lại source và cài đặt lại, như vậy phức tạp quá, bây jo mình muốn tạo 1 form kết nối cho người dùng nhập vào các thông số kết nối lên các textbox và cập nhập lại mỗi khi thay đổi, nhưng chưa biết làm như thế nào, có phải tạo lại file kết nối lưu trong 1 file xml hay là phải như thế nào mình cũng đang làm mà chưa ra, bạn nào làm rồi hoặc có ý tưởng share cho mình tham khảo, đang cần làm ngay
thank u các mem đã quan tâm
đang bí vấn đề này chưa ra, các mod đừng xoá bài đăng nha
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Trong cái demo trên khi không connect được với database thì nó sẽ hiện ra cái form đễ điền vào server, database, user và password rồi nó sẽ sữa lại đường dẫn đó luôn. Nên test bằng cách chạy bằng executable thay vì chạy trong visual studio.
Hình đại diện của thành viên
QUANITGROBEST
Thành viên trung thành
Thành viên trung thành
Bài viết: 227
Ngày tham gia: Thứ 5 11/10/2012 9:47 am
Đến từ: Thái Bình
Has thanked: 74 times
Been thanked: 23 times
Tiếp xúc:

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by QUANITGROBEST »

mình hiểu ý bạn nói, khi chương trình chạy ko thấy DB nó sẽ show lên form1 cho ngừoi dùng chọn kết nối, khi chọn kết nối thành công sẽ show lên dữ liệu của table tương ứng trong CSDL, nhưng nó lại ko lưu lại đường dẫn mà người dùng chọn(mình ko thấy trong app.config hoặc DemoApplication.exe.config)
mih có tham khảo 1 đoạn code trên mạng
Here is the original App.config file:

[xml]<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Setting1" value="1" />
<add key="Setting2" value="2" />
</appSettings>
</configuration>[/xml]

Here is the code sample to modify the application settings value:

  1. XmlDocument xmlDoc = new XmlDocument();
  2.  
  3. xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
  4.  
  5. foreach (XmlElement element in xmlDoc.DocumentElement)
  6. {
  7.     if (element.Name.Equals("appSettings"))
  8.     {
  9.         foreach (XmlNode node in element.ChildNodes)
  10.         {
  11.             if (node.Attributes[0].Value.Equals("Setting1"))
  12.             {
  13.                 node.Attributes[1].Value = "New Value";
  14.             }
  15.         }
  16.     }
  17. }
  18.  
  19. xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
  20.  
  21. ConfigurationManager.RefreshSection("appSettings");


nhưng khi chạy thì bao lỗi
Unable to cast object of type 'System.Xml.XmlComment' to type 'System.Xml.XmlElement'.

ngay trong vòng lặp, đang làm vấn đề này mãi, đau đầu quá...
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Cái demo trên viết bằng VB.NET, nếu trong VS thì những giá trị đó ỡ Project Properties -> Settings và khi ỡ runtime thì nó nằm trong application.exe.config.
Còn nếu mà muốn thay đỗi những giá trị cũa AppSettings như trên cũa bạn và viết theo C# thì viết như sau:
  1. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  2. AppSettingsSection app = config.AppSettings;
  3. int value = int.Parse(app.Settings["Setting1"].Value);      //lấy giá trị cũa Setting1
  4. app.Settings["Setting1"].Value = (value + 1).ToString();  //lưu vào giá trị mới
  5. config.Save(ConfigurationSaveMode.Modified);
Hình đại diện của thành viên
QUANITGROBEST
Thành viên trung thành
Thành viên trung thành
Bài viết: 227
Ngày tham gia: Thứ 5 11/10/2012 9:47 am
Đến từ: Thái Bình
Has thanked: 74 times
Been thanked: 23 times
Tiếp xúc:

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by QUANITGROBEST »

cám ơn FlyingFox, bạn rất nhiệt tình, nhưng cho mình hỏi thêm mình có chút thắc mắc
chương trình mình code bằng vb.net nên khi tìm kiếm trên mạng thì vb hoặc C# đều được(có thể convert quan nhau), đoạn code bạn đưa mình convert qua VB.net và chỉnh sửa lại file app cho đúng với chương trình mình đang viết.
  1.   Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
  2.         Dim app As AppSettingsSection = config.AppSettings
  3.         Dim value As String = app.Settings("Server").Value ' Vì là chuỗi nên mình đổi lại
  4.         'lấy giá trị cũa Server và gán vào giá trị mới
  5.         app.Settings("Server").Value = "New server"
  6.         'lưu vào giá trị mới
  7.         config.Save(ConfigurationSaveMode.Modified)

khi mình chạy ở chế độ debug thì dữ liệu file app có thay đổi (trong file Grobest.vshost.exe.Config, project mình là Grobest), nhưng khi mình chạy chương trình thực hiện thì nó lại ko thay đổi kết quả(ko thấy thay đổi được cập nhập trong Grobest.exe.config), ko biết vì sao, khi tạo file appconfig
mình thao tác trực tiếp trên file app.config ko thông qua project properties -> seting, đây là nội dung file app.config
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <appSettings>
  4.     <add key="Server" value="serverq\192.168.2.160"/>
  5.     <add key="Database" value="Grobest"/>
  6.     <add key="Username" value="sa"/>
  7.     <add key="Password" value="*Ab123456"/>
  8.   </appSettings>
  9. </configuration>
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Mình có tạo demo bằng VB.NET với code trên cũa bạn rồi chạy exe ỡ trong folder debug thì thấy nó có thay đỗi giá trị ỡ trong file *.exe.config được mà.
Tập tin đính kèm
DemoApplication.zip
(58.28 KiB) Đã tải về 371 lần
Hình đại diện của thành viên
QUANITGROBEST
Thành viên trung thành
Thành viên trung thành
Bài viết: 227
Ngày tham gia: Thứ 5 11/10/2012 9:47 am
Đến từ: Thái Bình
Has thanked: 74 times
Been thanked: 23 times
Tiếp xúc:

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by QUANITGROBEST »

mình test lại và làm được rồi, mình hiểu rồi bạn ah, khi chạy trên VS thì ko thay đổi do nó đọc kết nối từ file app.config, khi build ra file exe mình chạy file thực thi exe đó nó sẽ ghi dữ liệu trên file *.exe.config và nó lấy thông tin kết nối từ đây, mình cứ thắc mắc mãi sao nó ko thay đổi file app.config, bây jo mới hiểu
hi cám ơn FlyingFox nhiều nha
thinh18tt
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 167
Ngày tham gia: Thứ 3 18/05/2010 11:49 pm
Has thanked: 7 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by thinh18tt »

Thắc mắc:
Mình mới làm quen với vb.net, trước kia mình chỉ dùng vb6 thôi, nên trong Class của bạn, mình thấy có nhiều Sub có 2 Sub giống hệt nhau, chỉ khác tham số. Bạn có thể giải thích cho mình hiểu được không?
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Class CSDL chung cho SQL Server và MS Access

Gửi bài by FlyingFox »

Cái đó gọi là Overloading, ví dụ như tính diện tích hình vuông hoặc hình chữ nhật thì với hình vuông thì chĩ cần biết một cạnh thôi, còn hình chữ nhật thì cần tới 2 cạnh. Do đó khi viết function tính diện tích thì viết là

  1. Public Function DienTich (width As Double, height As Double) As Double
  2.     Return width * height
  3. End Function
  4.  
  5. Public Function DienTich (width As Double) As Double
  6.     Return DienTich(width, width);
  7. End Function
Đăng trả lời

Quay về