ไม่สามารถแปลงค่าวันที่ / เวลา MySQL เป็น System.DateTime


86

ฉันได้รับข้อผิดพลาดนี้:

ไม่สามารถแปลงค่าวันที่ / เวลา MySQL เป็น System.DateTime

ในขณะที่ฉันพยายามดึงข้อมูลจากฐานข้อมูล MySQL ฉันมีประเภทข้อมูลวันที่ในฐานข้อมูล MySQL แต่ในขณะที่ดึงข้อมูลลงใน datatable ของฉันได้รับข้อผิดพลาดข้างต้น

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


คำตอบ:


51

ถ้าฉัน Google สำหรับ "ไม่สามารถแปลงค่าวันที่ / เวลา MySQL เป็น System.DateTime" ฉันเห็นการอ้างอิงจำนวนมากเกี่ยวกับปัญหาในการเข้าถึง MySQL จาก Visual Studio นั่นคือบริบทของคุณหรือไม่?

ทางออกหนึ่งที่แนะนำคือ:

นี่ไม่ใช่ข้อบกพร่อง แต่เป็นพฤติกรรมที่คาดหวัง โปรดตรวจสอบด้วยตนเองภายใต้ตัวเลือกการเชื่อมต่อและตั้งค่า "Allow Zero Datetime" เป็น true ดังภาพที่แนบมาข้อผิดพลาดจะหายไป

อ้างอิง: http://bugs.mysql.com/bug.php?id=26054


2
ฉันไม่แนะนำให้ใช้ "0000-00-00 00:00:00" เป็นข้อมูลของคุณในคอลัมน์วันที่ / เวลา แทนที่จะใช้ค่าวันที่จริงในข้อมูลของคุณ - หากคุณใช้. net อย่างไรก็ตาม MySQL สามารถจัดการวันที่ใดก็ได้ คุณควรสแกนค่าวันที่ / เวลาทั้งหมดของคุณ
Bimal Poudel

215

คุณต้องเพิ่มConvert Zero Datetime=Trueในสตริงการเชื่อมต่อของคุณตัวอย่างเช่น:

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

3
ขอบคุณ! FYI: สิ่งนี้เกิดขึ้นกับสตริงการเชื่อมต่อ MySQL ไม่ใช่สตริงการเชื่อมต่อ SQL Server
jp2code

ประหยัดเวลาของฉัน ทำงานอย่างมีเสน่ห์
Null Pointer

+1 - สมบูรณ์แบบ! ฉันมีวันที่เป็นศูนย์เนื่องจากเมื่อคอลัมน์ไม่ได้กรอกข้อมูลบนตาราง MySQL วันที่และเวลาเป็นศูนย์ ฉันชอบเปลี่ยนตั้งแต่ตอนนี้สำหรับ 0970-01-01 ขอบคุณมาก
Drako


3

ดึงค่าวันที่และเวลาลงเป็นสตริงและทำDateTime.ParseExact(value, "ddd MMM dd hh:mm:ss yyyy", culture, styles);คุณเพียงแค่ต้องตั้งค่ารูปแบบวันที่สำหรับวันที่ที่คุณส่งคืนจากฐานข้อมูล yyyy-MM-dd HH:mm:ssส่วนใหญ่มีแนวโน้มที่จะเป็น อย่างน้อยก็คือสำหรับฉัน

ตรวจสอบข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ DateTime.ParseExact



2

ฉันก็ประสบปัญหาเดียวกันและได้รับชื่อคอลัมน์และประเภท จากนั้นแคสต์ (col_Name as Char) จากชื่อตาราง จากวิธีนี้ฉันได้รับปัญหาเป็น "0000-00-00 00:00:00" จากนั้นฉันอัปเดตเป็นวันที่และเวลาที่ถูกต้องข้อผิดพลาดจะหายไปสำหรับกรณีของฉัน


1

คุณสามารถทำให้แอปพลิเคชันเข้ากันได้กับวันที่และเวลาที่ใช้โดย MySql เมื่อแอปพลิเคชันทำงานที่รันไทม์ให้ระบุรหัสนี้ ก่อนอื่นไปที่เหตุการณ์ของแอปพลิเคชัน ในรายการเครื่องมือ

  1. ไปที่โครงการ
  2. คุณสมบัติของโครงการ
  3. เลือกแท็บแอปพลิเคชัน
  4. ดูเหตุการณ์แอปพลิเคชัน

เพื่อเปิดไฟล์ใหม่ ไฟล์นี้มีรหัสที่ใช้เมื่อเริ่มต้นแอปพลิเคชัน

เขียนรหัสนี้ในไฟล์ใหม่:

 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

แทนที่จะเปลี่ยนสตริงการเชื่อมต่อคุณสามารถใช้IsValidDateTimeคุณสมบัติของMySqlDateTimeอ็อบเจ็กต์เพื่อช่วยในการพิจารณาว่าคุณสามารถโยนอ็อบเจกต์เป็นไฟล์DateTime.

ฉันมีสถานการณ์ที่พยายามโหลดข้อมูลจากคอลัมน์ "UpdateTime" ที่ตั้งค่าไว้อย่างชัดเจนเฉพาะเมื่อมีการอัปเดตแถว (ตรงข้ามกับ InsertedTime ที่ตั้งค่าไว้เสมอ) สำหรับกรณีนี้ฉันใช้MySqlDataReader.GetMySqlDateTimeวิธีการดังนี้:

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

0

ถ้า"allow zero datetime = true"ไม่ทำงานให้ใช้การละลายต่อไปนี้: -

เพิ่มสิ่งนี้ลงในสตริงการเชื่อมต่อของคุณ: "allow zero datetime = no"ซึ่งทำให้การส่งประเภททำงานได้อย่างสมบูรณ์


0

ในรายงาน Stimulsoft เพิ่มพารามิเตอร์นี้ลงในสตริงการเชื่อมต่อ (คลิกขวาที่แหล่งข้อมูล -> แก้ไข)

Convert Zero Datetime=True;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.