PDA

View Full Version : [Q] Lỗi khi kết nối đến CSDL



White_Rose
26-02-2003, 17:17
Khi tạo một connection trong ASP.NET, WR nhận được thông báo lỗi là file đó đã mở khi gọi myConnection.Open(); (sử dụng System.Data.OleDb) hoặc không có quyền truy xuât mặc dù cũng với đoạn lệnh đó, nếu viết trên WinForm thì lại hoạt động tốt (nghĩa là lỗi không phải là do chương trình). Ai có thể mách cho mình biết nguyên nhân là do đâu không?

Ali33n40Girls
26-02-2003, 17:28
Khi bạn connect bằng ASP.NET thì được đặt trong một môi trường do IIS quản lý, và chịu ảnh hưởng của các settings về security, do đó, đôi khi bạn không thể connect được tới Database do không có quyền truy xuất. Khác với khi bạn connect bằng WinForm, chương trình của bạn có toàn quyền truy xuất tới hệ thống hay Database nếu bạn chạy chương trình với account Windows có đầy đủ quyền hạn!

xbacala
26-02-2003, 18:30
Bạn sửa ConnectionString dùng user của database thay vì dùng user của Windows.

Khi bạn thiết kế trong mội trường .NET, ASP.NET dùng user bạn đang logon vào Windows để kết nối với CSDL, thường là user có quyền Admin nên mọi việc OK. Tuy nhiên, khi tực thi, ASP.NET thực thi trong IIS nên nó chạy trên danh nghĩa của user IUSR_<MachineName>. User này thường không được phép truy cập CSDL.

White_Rose
26-02-2003, 19:48
Hi!
Vậy muốn chỉnh lại thì làm thế nào vậy? Cũng với đoạn code đó, trên máy bạn mình thì nó báo lỗi như trên nhưng trên máy mình thì lại chạy ngon lành (cả hai máy đều dùng Windows 2000 Advance Server, cùng mới cài <1 tháng và cài cùng một bộ VS.NET). Trên máy cậu bạn, dù để file mdb ở đâu vẫn có lỗi đó còn trên máy WR thì dù để ở đâu nó vẫn kết nối ngon lành.
Khác nhau duy nhất là máy mình để password đăng nhập vào Windows là trắng (blank) còn trên máy cậu ta thì có set. Phải chăng cậu ta phải dùng password đó để khai báo permission (nghe hơi vô lý vì lúc login là Administrator rồi còn gì???)
Mình thử với OleDb (dùng Access) nên không có khai báo Username/Password để kết nối. Đoạn code để test như sau:


private void Button1_Click(object sender, System.EventArgs e)
{
OleDbConnection Conn = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=D:\Inetpub\wwwroot\VNSC\general_db.mdb");
Conn.Open();
OleDbCommand mc = new OleDbCommand(
"SELECT * FROM WRPS_GUESTBOOK", Conn);
OleDbDataReader dr = mc.ExecuteReader();
dr.Read();
Response.Write(dr["gb_id"]);
dr.Close();
Conn.Close();
}

xbacala
26-02-2003, 22:20
À bạn dùng MS Access thì khác. Bạn vào Properties của các file .mdb, cho phép Everyone là full control các file .mdb đó là OK.

White_Rose
26-02-2003, 23:28
File đó vừa create new xong, chưa hề set permission gì xong. Ai cũng có quyền truy xuất hết mà :(

xbacala
27-02-2003, 22:44
Ai không quan trọng, vần đề là cái user có tên là IUSR_<MachineName> phải truy xuất được.

Chính xác câu báo lỗi là gì ?

White_Rose
28-02-2003, 00:23
Vấn đề không liên quan đến user đâu, là do thiết lập permission của thư mục / ổ đĩa đó.
Nếu chuyển file đó sang ổ C (FAT32)----> Kết nối được (ban đầu test toàn ở ổ D (NTFS))
Mình dùng máy ở nhà nên không bị lỗi :( để 1,2 hôm nữa qua nhà nó copy về.

xbacala
28-02-2003, 08:44
Bạn lầm to rồi !

Tại sao FAT32 chạy được?
Vì FAT32 là hệ thống file không có sercurity. Do đó, bất kỳ user nào trên máy đều có thể toàn quyền trên tất cả các file trong hệ thống. Do đó, dĩ nhiên là cái user IUSR_<MachineName> đọc được.

Tại sao NTFS không được ?
NTFS là hê thống file hỗ trợ security rất tốt, rất nhiều quyền được phân bổ cho các đồi tượng trong hệ thống (kể cả file và folder). Thông thường, cái user IUSR_<MachineName> không có quyền đọc/ghi các file và thư mục chứa file MDB của bạn, và thế là các ứng dụng ASP.NET của bạn bị báo lỗi khi truy cập DB của Access vì khi truy cập Db của Access, nó phải tạo ra 1 cái file chứa thông tin lock .ldb

Nếu bạn không tin, bạn tạo 1 cái thư mục, copy file MDB vào đó, cho All User toàn quyền (Full Control) truy cập thư mục đó (nhớ chọn Inherit Permission), tui chắc chắn là nó sẽ chạy được.

Thử hỏi một ứng dụng chạy trên Windows 2000 mà dùng FAT32 thì còn có ý nghĩa gì nữa !