จะรับข้อมูลจาก db ใน c # ได้อย่างไร [ซ้ำ]

Jan 17 2021

ฉันต้องการรับข้อมูลจากฐานข้อมูล sqlite แต่ฉันได้รับข้อผิดพลาดนี้:

System.InvalidCastException: 'แคสต์ที่ระบุไม่ถูกต้อง'

ฉันเปลี่ยนประเภทของข้อมูลในทางที่ไม่ดีหรือไม่?

conn.Open();
string stm = new CustomQueries().GetUsersByName(this.searchedName, this.searchedSurname);

SQLiteCommand cmd = new SQLiteCommand(stm, conn);
SQLiteDataReader rdr = cmd.ExecuteReader();

while (rdr.Read())
{
    this.personResults.Add(new Person(
                    (int)rdr["Id"],
                    (int)rdr["School_id"],
                    (int)rdr["Role_id"],
                    (string)rdr["Name"],
                    (string)rdr["Surname"],
                    (int)rdr["Study_year"],
                    (string)rdr["Identification_number"],
                    (string)rdr["Address"],
                    (string)rdr["Phone"],
                    (string)rdr["Email"],
                    (int)rdr["Age"],
                    (string)rdr["Birth_date"],
                    (string)rdr["Year_letter"]
                    ));
}

conn.Close();

โครงสร้างฐานข้อมูลของฉันเหมือนกับฟิลด์ในโค้ด คอลัมน์เป็นประเภทTextหรือintในฐานข้อมูล - อีกครั้งเหมือนกับพิมพ์ใน ()

แก้ไข> แบบสอบถาม:

 public string GetUsersByName(string name, string surname)
        {
            return "select * from user where name LIKE '%" + name + "%' and surname LIKE '%" + surname + "%'";
        }

โครงสร้างตาราง DB User

คำตอบ

MD.RAKIBHASAN Jan 17 2021 at 17:58

คุณกำลังพยายามแปลงค่าหรือวัตถุเป็นการแสดงสตริงโดยใช้ตัวดำเนินการหล่อ เมื่อคุณรันโปรแกรมคุณจะได้รับ "System.InvalidCastException: ไม่สามารถส่งออบเจ็กต์ประเภท 'System.Int32' เพื่อพิมพ์ 'System.String'

เมธอด ToString () ถูกกำหนดโดยคลาสอ็อบเจ็กต์ดังนั้นจึงถูกสืบทอดหรือถูกแทนที่โดยชนิดที่มีการจัดการทั้งหมด ดังนั้นในที่นี้เราจึงเรียกเมธอด ToString เนื่องจากมันแอบแฝงอินสแตนซ์ประเภทใดก็ได้ในการแสดงสตริง

(int) rdr ["Id"] นี่คือปัญหา คุณสามารถใช้ Convert ToInt32 (rdr ["Id"]) เพื่อแก้ไขปัญหาของคุณ