2009-10-16 33 views
5

Tôi đọc/cập nhật dữ liệu từ MS Access bằng C#. Mã của tôi là:Loại dữ liệu không khớp trong biểu thức tiêu chí | Truy cập, OleDb, C#

public static void UpdateLastLogin(int userid, DateTime logintime) ///logintime = DateTime.Now 
{ 
    string sql = @"UPDATE [Customers] SET [LastLogin]=?"; 
    OleDbParameter[] prms = new OleDbParameter[] { 
    new OleDbParameter("@LastLogin",logintime) 
    }; 
    using (DAL dal = new DAL()) 
    { 
     dal.UpdateRow(sql, false, prms); 
    } 
} 

Khi nói đến Ngày, tôi gặp sự cố. Điều này sẽ ném "Loại dữ liệu không phù hợp trong biểu thức tiêu chí". lỗi. (Tôi đã loại bỏ mệnh đề WHERE để giữ nó đơn giản hơn) Tôi có bị gửi kèm theo [LastLogin] = không? dấu chấm hỏi với dấu nháy đơn, # dấu hiệu .. không giúp được gì. Bất kỳ khách hàng tiềm năng nào về cách xử lý đối tượng DateTime với Access và nhà cung cấp OleDb sẽ được đánh giá cao.

Xin cảm ơn trước.

+0

Các bit mã sẽ được dễ dàng hơn để đọc. nếu bạn định dạng nó là mã bằng cách thụt lề nó 4 không gian –

Trả lời

0

Thứ nhất, không có câu lệnh SQL của bạn nên là:

"UPDATE Customers SET [email protected]" 

Thứ hai, lý do bạn đang nhận được lỗi ngày không phù hợp có thể sẽ đi qua của bạn '?' là thời gian ngày của bạn vào trường LastLogin thay vì tham số logintime thực tế.

+0

Nhưng đây là quyền truy cập .. Tôi nghĩ oleDb không hỗ trợ tên tham số: ( – emre

+0

Tuyên bố trên nên được giả định bạn đang sử dụng OleDbCommand – James

0

có thể thử

DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString() 

thay vào đó, vượt qua nó như String (và có thể kèm theo với # sau đó)

+1

Tôi đã làm .. Nhưng sau đó họ hiển thị chỉ có ngày không phải là thời gian :) – emre

+0

Có thể một chuỗi định dạng được chuyển đến ToString() của DateTime sẽ giúp – emre

+0

chỉnh sửa bài đăng của tôi ... nên hoạt động. Có thể có nhiều cách thanh lịch hơn để làm điều đó, vì điều này có thể phụ thuộc vào các tùy chọn bản địa hóa của bạn mặc dù ... –

0

nên nó không được

"UPDATE Customers SET LastLogin='@LastLogin'" 

Và @LastLogin nên

logintime.ToString("yyyy-MM-dd hh:mm:ss") 

chỉnh sửa Bạn có thể không chỉ toàn bộ nội dung không?

"UPDATE Customers SET LastLogin='" + logintime.ToString("yyyy-MM-dd hh:mm:ss") + "'" 
+0

Bạn có thể nội tuyến toàn bộ điều, có, nhưng tạo sql động là một thói quen xấu để có được vào. Sử dụng tham số là thiết kế tốt hơn và dễ đọc. –

0

Hãy thử thiết lập các "DBTYPE" tài sản của tham số để xác định nó như là một ngày, datetime hoặc datetime2 phù hợp ...

prms[0].DbType = DbType.DateTime; 

Có 7 chữ ký cho OleDbParameter mới() gọi , vì vậy bạn có thể thay đổi cá thể chữ ký, hoặc chỉ làm một cách rõ ràng khi tôi lấy mẫu ở trên vì bạn chỉ có 1 tham số trong trường hợp này.

4

Có sự cố đã biết với OleDb và ngày tháng. Hãy thử làm một cái gì đó như:

OleDbParameter p = parameter as OleDbParameter; 
if (null == p) 
    parameter.DbType = DbType.DateTime; 
else 
    p.OleDbType = OleDbType.Date; 

Hoặc sử dụng chuỗi định dạng rõ ràng:

value.ToString("yyyy-MM-dd hh:mm:ss") 
1

tôi giải quyết này bằng cách sử dụng đoạn mã sau

OleDbCommand cmd = new OleDbCommand(qry, cnn); 
cmd.Parameters.Add("datenow", OleDbType.Date); 
cmd.Parameters["datenow"].Value = DateTime.Now; 
Các vấn đề liên quan