วิธีแก้ String must be exactly one character long

 

 
Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

 

วิธีแก้ String must be exactly one character long

 

วันนี้ผู้เขียนขอแทรกเรื่องที่ไม่เกี่ยวกับโพสต่อเนื่องอื่นๆ (ช่วงนี้กำลังโพสเนื้อหาบางส่วนในหนังสือ เรียนรู้ด้วยตนเอง DataBase – Query – T-SQL – Stored Procedure ให้ท่านอ่านฟรี) ด้วยเรื่องวิธีแก้ไขเออเรอร์ที่เกิดตอนคอมไพล์ที่ผู้เขียนพบในวันนี้ เกลือกว่าท่านเจอปัญหาอย่างเดียวกันแล้วท่านบังเอิญ Google มาพบเข้าอาจช่วยแก้ปัญหาได้

ข้อความที่เป็นชื่อตอนคือเออเรอร์เมสเซจ (Error Message ย่อ EM) ที่โปรแกรม Visual Studio 2008 (VS2008) แสดงเมื่อผู้เขียนรันโปรแกรม โค้ดส่วนที่เกิด EM คือเมธอดนี้

private void GetRowsFromDatabase(int projectID)
{
    LoySQLtoLINQDataContext myDB = new LoySQLtoLINQDataContext();
    var readSec1 =
        from r in myDB.Section1s
        where r.ProjectID == projectID && r.SectionID == 1
        orderby r.TopicOrder
        select r;
    string a, b, c, d, e, f;
    foreach (var v in readSec1)
    {
        this.projectID = v.ProjectID.ToString();
        a = v.TopicOrder.ToString();
        b = v.Comment.ToString();
        c = v.Name.ToString();
        d = v.Size.ToString();
        e = v.TopicType.ToString();
        f = v.Mandatory.ToString();
        string[] s = { a, b, c, d, e, f };
        myList.Add(s);
    }
}  

นี่คือเมธอดภาษา C# ทำหน้าที่คิวรีข้อมูลจากตารางมาใส่ไว้ในลิงค์ลิสต์ เมื่อคอมไพล์ VS2008 แสดง EM ในบรรทัด foreach ซึ่งก่อนหน้านี้เคยทำงานได้อย่างปรกติ เรื่องนี้ทำให้ผู้เขียนงงอยู่พักใหญ่ สืบสาวราวเรื่องพบว่าสาเหตุเกิดจากผู้เขียนแก้ไขโครงสร้างของตาราง แต่ลืมแก้ O/RM โดยผู้เขียนมีตารางหน้าตาดังนี้

     
 

ตารางนี้มีแปดคอลัมน์ แต่ละคอลัมน์ทำหน้าที่เก็บข้อมูลอะไรไม่ใช่ประเด็น จุดสำคัญคือผู้เขียนเปลี่ยนชนิดข้อมูลของคอลัมน์ ไปเป็น String โดยไม่ได้คิดมาก

คำว่า Int และ String คือชนิดข้อมูลของคอลัมน์ เดิมผู้เขียนกำหนดให้คอลัมน์ Mandatory เป็น varchar(1) และภายหลังเปลี่ยนเป็น vchar(10) ส่วน Desinger จึงคิดว่าคอลัมน์นี้เป็น Char(1) ทั้งๆ ที่ตอนนี้เป็น String แล้ว

ตาราง Setction1    
     

 

ปัญหานี้เกิดจากผู้เขียน Drop ตารางแล้ว Create ใหม่ด้วย SQL2008 Management Studio แต่ VS2008 มันไม่ยอมรับรู้การเปลี่ยนแปลงนี้ วิธีแก้ก็ง่ายนิดเดียวคือเปิดตัวช่วยออกแบบ O/RM ลบตารางเดิมออก แล้วลากตารางใหม่ใส่เข้าไป (ความจริงก็ตารางเดิมแต่แก้ไขแล้ว)  วิธีแก้อีกแบบคือเปิดไฟล์ .designer.cs หาแอตทริบิวต์ของคอลัมน์ Mandatory ซึ่งจะมีหน้าตาดังนี้

[Column(Storage="_Mandatory", DbType="VarChar(1)")]

 

ปัญหาคือตรงนี้แหละครับ ถ้าเปลี่ยนเป็น Varchar(10) เสียก็จบ

 

Advertisements