Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Specified cast is not valid. khi truyên giá trị null từ database

  1. #1
    Ngày gia nhập
    04 2012
    Bài viết
    14

    Mặc định Specified cast is not valid. khi truyên giá trị null từ database

    Chào các bạn.
    Mình đang làm thử project theo mô hình 3 tầng
    Nhưng khi tào lớp checkin trong Entities thì phải truyền giá trì null vào kiểu int hay string từ database
    cụ thể như sau:

    Visual C# Code:
    1.     class Checkin
    2.     {
    3.         public int _ID;
    4.         public string _Rollno;
    5.         public DateTime _Created_Date;
    6.         public string _Created_User;
    7.         public int _Warehouse_Id_In;
    8.         public int _Warehouse_Id_Out;
    9.         public string _Rollno_Out;
    10.         public string _Notes;
    11.         public Checkin(DataRow row)
    12.         {
    13.             this._ID = (int)row["ID"];
    14.             this._Rollno = (string)row["Rollno"];
    15.             this._Created_Date = (DateTime)row["Created_Date"];
    16.             this._Created_User = (string)row["Created_User"];
    17.             this._Warehouse_Id_In = (int)row["Warehouse_Id_In"];
    18.  
    19.             object Warehouse_Id_Out=row["Warehouse_Id_Out"];
    20.             this._Warehouse_Id_Out = (int)Warehouse_Id_Out;//bao loi Specified cast is not valid
    21.             object Rollno_Out=row["Rollno_Out"];
    22.             this._Rollno_Out =  (string)Rollno_Out;//Specified cast is not valid
    23.  
    24.             //if(Warehouse_Id_Out!=null){
    25.             //}
    26.             //if(Rollno_Out!=null){
    27.             //}
    28.             this._Notes = (string)row["Notes"];
    29.         }
    30. }
    Warehouse_Id_Out,Rollno_Out cho phép để trống trong csdl
    Không được sửa CSDL
    Vậy phải làm sao giờ các bạn

    Thanks for help
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    01 2010
    Bài viết
    306

    Với null thì làm thế này
    Visual C# Code:
    1.             string result
    2.             if(row["column"] == DBNull.Value)
    3.                 result = null;
    4.             else result = row["column"].ToString();

  3. #3
    Ngày gia nhập
    04 2012
    Bài viết
    14

    Thanks Sounj. T đã làm được.
    Nhưng T lại nghỉ ra vấn đề nữa là làm sao thêm null vào trong database bằng kiểu int được?

  4. #4
    Ngày gia nhập
    01 2010
    Bài viết
    306

    .NET có định nghĩa 1 kiểu struct gọi là Nullable<T> dùng cho trường hợp này. C# cho phép bạn khai báo nó với từ khóa thuận tiện dạng int? , double? DateTime?. ( tên kiểu cơ bản thêm dấu ? phía sau ). Còn bản chất nó là gì thì bạn kiếm sách đọc thêm nhé

  5. #5
    Ngày gia nhập
    04 2012
    Bài viết
    14

    nhưng khi truyền vào C# là null tức
    int? a=null;
    đừa vào câu lênh sql thì nó không hiểu
    //Incorrect syntax near ','.
    Visual C# Code:
    1.         public bool InsertYen(string rollno, DateTime created_Date, string Created_User, int Warehouse_Id_In, int? Warehouse_Id_Out, string Rollno_Out, string Notes)
    2.         {
    3.             //int? a = null;
    4.             Warehouse_Id_Out = null;
    5.             string sql = "insert into checkin values('" + rollno + "','" + created_Date + "',N'" + Created_User + "','" + Warehouse_Id_In + "'," + Warehouse_Id_Out + ",N'" + Rollno_Out + "','" + Notes + "')";//,'"++"'
    6.             int count = db.ExecuteNonQuery(sql);
    7.             return count > 0;
    8.         }//

    Nhưng khi thay null bằng chuổi "null" thì câu lệnh mới nhận được
    Đã được chỉnh sửa lần cuối bởi ghost_god331 : 21-01-2014 lúc 09:17 PM. Lý do: Visual C# Code không hiểu

  6. #6
    Ngày gia nhập
    01 2010
    Bài viết
    306

    Mặc định Specified cast is not valid. khi truyên giá trị null từ database

    C# là C#, T-SQL là T-SQL. Bạn muốn dùng C# để dựng câu truy vấn thì đương nhiên phải giải quyết được những rắc rối kèm theo

    Bạn ko nên nối chuỗi để tạo câu truy vấn như thế, cách này vừa khó, vừa mệt, vừa dễ dính sql injection
    Bạn nên dùng Parameters để làm việc này
    http://diendan.congdongcviet.com/threads/t201843::cach-truy-van-datetime-trong-csharp.cpp?p=649135#post649135

    Cách dùng chi tiết thì seach google, rất là nhiều

  7. #7
    Ngày gia nhập
    04 2012
    Bài viết
    14

    Thanks ban Sounj t sẽ tìm hiểu!

  8. #8
    Ngày gia nhập
    03 2012
    Bài viết
    31

    Theo mình thì trong CDSL bạn cho phép field là null và ngoài C# bạn không truyền nó vào thì mặc định CDSL sẽ tự gán nó là null

  9. #9
    Ngày gia nhập
    04 2012
    Bài viết
    14

    Trích dẫn Nguyên bản được gửi bởi Sounj Xem bài viết
    C# là C#, T-SQL là T-SQL. Bạn muốn dùng C# để dựng câu truy vấn thì đương nhiên phải giải quyết được những rắc rối kèm theo

    Bạn ko nên nối chuỗi để tạo câu truy vấn như thế, cách này vừa khó, vừa mệt, vừa dễ dính sql injection
    Bạn nên dùng Parameters để làm việc này
    http://diendan.congdongcviet.com/threads/t201843::cach-truy-van-datetime-trong-csharp.cpp?p=649135#post649135

    Cách dùng chi tiết thì seach google, rất là nhiều
    Vẫn bị lổi khi truyền vào null, nhưng khi truyền vào 1 thì đựoc
    Parameterized Query '(@rollno nvarchar(9),@created_Date datetime,@Created_User nvarch' expects parameter @Warehouse_Id_Out, which was not supplied.

    Visual C# Code:
    1.         public int InsertCh(string rollno, DateTime created_Date, string Created_User, int Warehouse_Id_In, int? Warehouse_Id_Out, string Rollno_Out, string Notes)
    2.         {
    3.             open();
    4.             string sql = "insert into checkin values(@rollno,@created_Date,@Created_User,@Warehouse_Id_In,@Warehouse_Id_Out,@Rollno_Out,@Notes)";//,'"++"'
    5.             cmd = conn.CreateCommand();
    6.             cmd.CommandText = sql;
    7.             cmd.Parameters.Add("@rollno",rollno);//cmd.Parameters.Add("",);
    8.             cmd.Parameters.Add("@created_Date",created_Date);
    9.             cmd.Parameters.Add("@Created_User",Created_User);
    10.             cmd.Parameters.Add("@Warehouse_Id_In",Warehouse_Id_In);
    11.             cmd.Parameters.Add("@Warehouse_Id_Out",Warehouse_Id_Out);
    12.             cmd.Parameters.Add("@Rollno_Out",Rollno_Out);
    13.             cmd.Parameters.Add("@Notes",Notes);
    14.             return cmd.ExecuteNonQuery();
    15.         }

    Code:
    InsertCh("WH01-I-02", dt, "yen", 1, 1, "", "thich");//them vao duoc
    InsertCh("WH01-I-02", dt, "yen", 1, null, "", "thich");//bi loi
    - - - Bài viết đã được cập nhật thêm ngày 22-01-2014 lúc 03:43 PM - - -

    Trích dẫn Nguyên bản được gửi bởi nhokzer0 Xem bài viết
    Theo mình thì trong CDSL bạn cho phép field là null và ngoài C# bạn không truyền nó vào thì mặc định CDSL sẽ tự gán nó là null
    không truyền vào thì nó mặt định là 0, còn nếu mặt định là null thì thêm vào không được.
    tại vị khi thêm vào là 1 lớp có các thuộc tính. mà thuộc tính nó là int.
    Nếu dùng string sql thì phải xét điều kiện null thì thêm chuổi là "null" ngược lại thì là số kiểu int bình thường của mình,zay thì nó mới được.

  10. #10
    Ngày gia nhập
    01 2010
    Bài viết
    306

    Oáp
    Nghiên cứu tiếp đi, có thế mà cũng hỏi . Cái Add Parameter nó có 1 mớ override. Chỉ định kiểu rõ ràng cho nó, gán bằng null ko được thì thử gán bằng DbNull.Value ..v.....v...

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection%28v=v s.110%29.aspx
    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter%28v=vs.110%29.a spx

    Cái Add 2 tham số mà bạn dùng là phiên bản lỗi thời rồi nhé, xài phiên bản khác đi

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn