Không thể chuyển đổi giá trị ngày / giờ của MySQL thành System.DateTime


85

Tôi gặp lỗi này:

Không thể chuyển đổi giá trị ngày / giờ của MySQL thành System.DateTime

trong khi tôi đang cố gắng tìm nạp dữ liệu từ cơ sở dữ liệu MySQL. Tôi có kiểu dữ liệu ngày trong cơ sở dữ liệu MySQL của mình. Nhưng trong khi truy xuất nó vào dữ liệu của tôi, nó gặp lỗi ở trên.

Làm thế nào tôi có thể sửa lỗi này?


Câu trả lời:


51

Nếu tôi google cho "Không thể chuyển đổi giá trị ngày / giờ của MySQL thành System.DateTime", tôi thấy nhiều tham chiếu đến sự cố khi truy cập MySQL từ Visual Studio. Đó có phải là bối cảnh của bạn không?

Một giải pháp được đề xuất là:

Đây không phải là một lỗi mà là hành vi mong đợi. Vui lòng kiểm tra thủ công bên dưới các tùy chọn kết nối và đặt "Allow Zero Datetime" thành true, như trên các hình ảnh đính kèm và lỗi sẽ biến mất.

Tham khảo: http://bugs.mysql.com/bug.php?id=26054


2
Tôi khuyên bạn không nên sử dụng '0000-00-00 00:00:00' làm dữ liệu của bạn trong cột ngày / giờ. Thay vì sử dụng các giá trị ngày tháng thực trong dữ liệu của bạn - nếu bạn đang sử dụng .net. Tuy nhiên, MySQL có thể xử lý bất kỳ ngày nào. Bạn nên quét qua tất cả các giá trị ngày / giờ của mình.
Bimal Poudel

212

Bạn phải thêm Convert Zero Datetime=Truevào chuỗi kết nối của mình, ví dụ:

server=localhost;User Id=root;password=mautauaja;Persist Security Info=True;database=test;Convert Zero Datetime=True

3
Cảm ơn! FYI: Điều này xảy ra trên chuỗi kết nối MySQL - không phải chuỗi kết nối SQL Server.
jp2code

đã tiết kiệm thời gian của tôi. Làm việc như một nét duyên dáng
Null Pointer

+1 - Hoàn hảo! Tôi không có ngày giờ vì khi cột không điền, hãy ghi trên bảng MySQL là ngày giờ bằng không. Tôi thích thay đổi nó từ bây giờ cho 0970-01-01.Thanks bạn rất nhiều
Drako

21

tôi đã thêm cả hai Convert Zero Datetime=True& Allow Zero Datetime=Truevà nó hoạt động tốt


3

Kéo giá trị ngày giờ xuống dưới dạng một chuỗi và thực hiện DateTime.ParseExact(value, "ddd MMM dd hh:mm:ss yyyy", culture, styles);Bạn chỉ cần thiết lập định dạng ngày cho ngày bạn đang trả về từ cơ sở dữ liệu. Nhiều khả năng là nó yyyy-MM-dd HH:mm:ss. Ít nhất là cho tôi.

Kiểm tra ở đây thêm thông tin về DateTime.ParseExact


2

Hãy để MySql chuyển đổi dấu thời gian unix của bạn thành chuỗi. Sử dụng hàm mysql FROM_UNIXTIME (113283901)


2

Tôi cũng gặp phải vấn đề tương tự, và nhận được tên cột và các loại của nó. Sau đó ép kiểu (col_Name as Char) từ tên bảng. Từ cách này, tôi nhận được sự cố là '0000-00-00 00:00:00', sau đó tôi Cập nhật là ngày và giờ hợp lệ, lỗi sẽ biến mất đối với trường hợp của tôi.


1

Bạn có thể làm cho ứng dụng tương thích hoàn toàn với ngày và giờ được sử dụng bởi MySql. Khi ứng dụng chạy trong thời gian chạy, hãy cung cấp mã này. Đầu tiên, hãy chuyển đến Sự kiện ứng dụng. Trong danh sách các công cụ

  1. Đi đến dự án
  2. Thuộc tính dự án
  3. Chọn tab Ứng dụng
  4. Xem sự kiện ứng dụng

Thao tác này sẽ mở một tệp mới. Tệp này chứa mã được sử dụng khi bắt đầu ứng dụng.

Viết mã này vào tệp mới đó:

 Partial Friend Class MyApplication

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        My.Application.ChangeCulture("en")
        My.Application.ChangeUICulture("en")
        My.Application.Culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"
        My.Application.Culture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd"
        My.Application.Culture.DateTimeFormat.LongTimePattern = "HH:mm:ss"
        My.Application.Culture.DateTimeFormat.ShortTimePattern = "HH:mm:ss"
    End Sub


End Class

1

Thay vì thay đổi chuỗi kết nối, bạn có thể sử dụng thuộc IsValidDateTimetính của MySqlDateTimeđối tượng để giúp bạn xác định xem bạn có thể ép kiểu đối tượng dưới dạng không DateTime.

Tôi đã gặp một trường hợp trong đó tôi đang cố gắng tải dữ liệu từ cột "UpdateTime" chỉ được đặt rõ ràng khi có bản cập nhật cho hàng (trái ngược với InsertedTime luôn được đặt). Đối với trường hợp này, tôi đã sử dụng MySqlDataReader.GetMySqlDateTimephương pháp như sau:

using (MySqlDataReader reader = await MySqlHelper.ExecuteReaderAsync(...))
{
    if (await reader.ReadAsync())
    {
        DateTime? updateTime = reader.GetMySqlDateTime("UpdateTime").IsValidDateTime ? (DateTime?)reader["UpdateTime"] : null;
    }
}

0

nếu "allow zero datetime = true" không hoạt động thì hãy sử dụng các lưu ý sau: -

Thêm điều này vào chuỗi kết nối của bạn: "allow zero datetime = no" - điều này làm cho kiểu truyền hoạt động hoàn hảo.


0

Trong báo cáo của Stimulsoft, hãy thêm tham số này vào chuỗi kết nối (nhấp chuột phải vào nguồn dữ liệu-> chỉnh sửa)

Convert Zero Datetime=True;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.