Thứ Tư, 23 tháng 12, 2009

“ORA-01461: can bind a LONG value only for insert into a LONG column” error in NHibernate

“ORA-01461: can bind a LONG value only for insert into a LONG column” happen when try to insert large text (> 4000 Unicode characters) using NHibernate and Oracle.

Following are steps work around to fix the problem:

1. Using Clob or NClob data type

Normally we use VARCHAR2 or NVARCHAR2 for text. But the max length of these data type is 4000. So If we want to store large text which greater than 4000 characters, we must change the data type to CLOB or NCLOB (for Unicode)

2. Using correct connection.driver_class: NHibernate.Driver.OracleDataClientDriver

We were using the NHibernate.Driver.OracleClientDriver which default to Microsoft's Oracle provider (System.Data.OracleClient). We must change the driver_class property to NHibernate.Driver.OracleDataClientDriver

//c.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.OracleClientDriver");
c.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.OracleDataClientDriver");             



 



Or in config file






<property name="connection.driver_class">
        NHibernate.Driver.OracleDataClientDriver
</property>



 



3. Using correct Mapping attributes: type=”AnsiString”


Normally we can use type=”String” default for CLOB/NCLOB. Try to use type=”AnsiString” if two steps above not work.

<property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/>


With three steps above, I solved the problem. Hope this help!



Here are some helpful links



http://msarchitectureadventures.blogspot.com/2009/10/problem-inserting-large-characters.html



http://rextang.net/blogs/past/archive/2005/11/16/2905.aspx



http://nhjira.koah.net/browse/NH-465

Thứ Năm, 10 tháng 12, 2009

Không còn nỗi lo tiếng Việt đối với người dùng SharePoint 2007

Phiên bản SharePoint 2007 đã có bản Language Pack hỗ trợ tiếng Việt từ ngày 20/07/2009. Người dùng Việt Nam chưa cài đặt bản ngôn ngữ tiếng Việt cho SharePoint có thể tải về tại địa chỉ

SharePoint Server 2007 Language Pack  (X86) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=430dabac-146e-4c8b-9338-37569ad373d2

SharePoint Server 2007 Language Pack  (X64) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=0c498ce5-47c2-47ad-9ae7-5a2cd2a81fc7

Windows SharePoint Services 3.0 Language Pack  http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=36ee1bf0-652c-4e38-b247-f29b3eefa048

Windows SharePoint Services 3.0 Language Pack (X64) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=45fa2637-efc0-4ed6-8f47-8a013e9ce9d9

Gói ngôn ngữ tiếng Việt thật sự hữu ích đối với sự phát triển của SharePoint tại Việt Nam, càng mang lại ấn tượng tốt đối với người dùng về sản phẩm này.

Hy vọng phiên bản SharePoint 2010 tới có bản language pack cho tiếng Việt đi kèm luôn trong ngày ra mắt để người dùng SharePoint ở Việt Nam khỏi phải mong mỏi lâu

Thứ Năm, 19 tháng 11, 2009

Reading CSV file by OdbcConnection and C#

CSV là một text file thường được sử dụng để export dữ liệu từ một nguồn CSDL nào đó. Đặc điểm của nó là cấu trúc đơn giản, nhẹ. Tuy nhiên, trong trường hợp người dùng muốn import dữ liệu từ CSV nó sẽ phát sinh một số vấn đề như các ký tự đặc biệt, các dấu xuống dòng,…khiến việc thao tác dữ liệu trên CSV là không chính xác. Bài viết dưới đây hướng dẫn sử dụng OdbcConnection và C# để đọc một CSV một cách chính xác.

1. Chúng ta sử dụng OdbcConnection để kết nối tới CSV file

   1: public static List<GDTData> ReadCSV(string importFolder, string strFileName)
   2:         {
   3:             //string importFolder = @"D:\Windows.old\Work\Hyperlogy";
   4:             //string strFileName = "DN_HAN.CSV";            
   5:             string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};" +
   6:                                 "Dbq=" + importFolder + ";Extensions=csv,txt;";
   7:             List<GDTData> list = new List<GDTData>();
   8:             try
   9:             {
  10:                 OdbcConnection objCSV = new OdbcConnection(strConn);
  11:                 objCSV.Open();
  12:  
  13:                 OdbcCommand oCmd = new OdbcCommand("select * from " + strFileName, objCSV);
  14:                 OdbcDataReader oDR = oCmd.ExecuteReader();
  15:                 int count = 0;
  16:                 while (oDR.Read())
  17:                 {
  18:                     GDTData data = new GDTData();
  19:                     // Do something
  20:                     data.Id = count;
  21:                     data.Cot1 = oDR[0].ToString();
  22:                     data.Cot12 = oDR[11].ToString();
  23:                     list.Add(data);
  24:                     count = count + 1;
  25:                 }
  26:                 oDR.Close();
  27:                 oCmd.Dispose();
  28:                 objCSV.Close();
  29:                 Console.WriteLine(count);               
  30:                 return list;
  31:             }
  32:             catch(Exception ex) {
  33:                 Console.WriteLine(ex.ToString());
  34:                 return list;
  35:             }


2. Với method trên hoàn toàn chúng ta đã đọc được csv file. Tuy nhiên, kết quả cho thấy, hàng đầu tiên của file CSV sẽ không được đọc ra. Đó là bởi vì OdbcConnection hiểu rằng hàng đầu tiên đó là Header. Để khắc phục điều này chúng ta cần tạo ra một file schema.ini đặt cùng thư mục với file CSV với nội dụng như sau:






[DN_HAN.CSV]
ColNameHeader = False
Format = CSVDelimited
CharacterSet = ANSI


Chúng ta có thể thực hiện tự động điều này bằng code






   1: public static void WriteIni(string folderUrl, string fileName)
   2:        {
   3:            StringBuilder sb = new StringBuilder();
   4:            sb.Append("[" + fileName + "]\n");
   5:            sb.Append("ColNameHeader = False\n");
   6:            sb.Append("Format = CSVDelimited\n");
   7:            sb.Append("CharacterSet = ANSI");
   8:            StreamWriter log = new StreamWriter(folderUrl+"\\schema.ini", false);
   9:            log.Write(sb.ToString());
  10:            log.Close();
  11:        }  


3. Cuối cùng khi sử dụng, chúng ta sẽ call method để sinh ra file schema.ini trước như sau






   1: string importFolder = @"D:\Windows.old\Work\Hyperlogy";
   2: string strFileName = "DN_HAN.CSV";
   3: WriteIni(importFolder, strFileName);    //Write Schema.ini
   4: List<GDTData> list = ReadCSV(importFolder, strFileName);
   5: ...


Chúc các bạn thành công.

Chủ Nhật, 27 tháng 9, 2009

Vocabulary Reminder: Phần mềm học từ vựng miễn phí, nhỏ gọn của người Việt

A21319952F68E79E_554_0[1]  

Vocabulary Reminder là một phần mềm trợ giúp cho việc học ngoại ngữ của mỗi người.

- Xuất phát từ yêu cầu thực tế là nhu cầu học ngoại ngữ, trong đó có từ vựng. Chúng ta thường học từ vựng bằng cách viết ra những mẩu giấy nhỏ hoặc viết lên bảng. Hoặc với những người hay sử dụng máy tính thì sử dụng sticknote trên Desktop. Tuy nhiên điều đó đem lại khá nhiều bất tiện.

- Từ yêu trên, tôi đã có ý tưởng thiết kế một phần mềm phục vụ cho việc học từ vựng này. Xét thấy các thông báo trên thanh trạng thái của Windows rất hữu hiệu cho việc ghi nhớ. Chẳng hạn như khi Laptop của chúng ta hết pin, hệ thống sẽ có một thông báo nhỏ trên khay hệ thống để nhắc nhở. Tôi đã tận dụng ý tưởng này để thiết kế ra phần mềm học ngoại ngữ nhọn gọn mà tiện dụng.

A21319952F68E79E_554_1[1]

- Các chức năng chính của phần mềm bao gồm:

+ Cho phép người sử dụng quản lý từ cần học (Thêm, sửa xóa.

+ Cho phép người dùng phóng to thu nhỏ ứng dụng tùy thuộc vào kích cỡ và độ phân giả màn hình

+ Hệ thống xuất hiện các từ vựng trên khay hệ thống một cách tuần tự.

+ Hệ thống lưu giữ những từ đang học cho những lần sử dụng tiếp theo

- Ngoài chức năng học từ vựng, mọi người có thể sử dụng phần mềm này để ghi nhớ những việc cần làm, hoặc mọi thứ có nhu cầu ghi nhớ, nhắc nhở.

- Phần mềm được phát triển trên nền tảng .NET Framework do đó, để sử dụng được phần mềm, các bạn cần cài đặt .NET Framework 3.5 SP1. Đây là một ứng dụng thực tế nho nhỏ mà tôi đã tận dụng các công nghệ hiện có của Microsoft .NET. Các kỹ thuật được sử dụng chủ yếu trong phần mềm này là WPF XAML, WPF Data Binding, LINQ to XML và ClickOnce. Các bạn có thể tự phát triển phần mềm tương tự theo mục đích sử dụng của bạn mà không mất quá nhiều thời gian. Thời gian để tôi hoàn thiện ứng dụng này là trọn một ngày cuối tuần. Tuy vậy tôi rất happy vì nó mang lại hiệu quả đáng kể.

Cài đặt và sử dụng:

Các bạn có thể download phần mềm để cài đặt tại địa chỉ http://cid-a21319952f68e79e.skydrive.live.com/self.aspx/.Public/WPF/EnglishVocabularyReminder%5E_v1.0.rar

Chương trình tương thích với Windows 7, Windows Vista, Windows XP.

Sau khi download các bạn giải nén, và sử dụng file Setup.exe để cài đặt

A21319952F68E79E_554_2[1]

Sau khi quá trình cài đặt hoàn tất các bạn có thể sử dụng phần mềm trong Start Menu

A21319952F68E79E_554_3[1] A21319952F68E79E_554_4[1]

Sau đó các bạn click vào biểu tượng của ứng dụng trên khay hệ thống để cập nhật từ vựng. Sau khi cập nhật xong đóng cửa xổ lại để Reminder bắt đầu hoạt động

Để thoát chương trình chúng ta phải chuột vào biểu tượng của chương trình trên khay hệ thống và chọn Exit

A21319952F68E79E_554_5[1]

Chúc các bạn vui với chương trình và không quên phản hồi nếu có bất cứ ý kiến gì về chương trình.

Mọi ý kiến xin liên hệ

A21319952F68E79E_554_6[1]

Comments

LE QUANG TU - 9/28/2009 11:25:02 AM
rat hay ,em rat can hoi ma hoi truoc chang tim dau ra ,de nghi bac phat trien them mot vai tinh nang cho hot hon he he
Tony Trinh - 10/3/2009 8:43:10 PM
Em co thu xai qua phan mem cho he thong. luc dau em add khoang 5 tu vung. no chay rat tot. roi em quyet dinh add vao them 100 tu nua. khi no chay duoc khoang 1 phut thi bao loi unhandle j do. ma em doc ko ki nua. khi em nhan yes. thi tu dong chuong trinh bi xoa khoi computer luon. chi con lai muc help trong start bar thoi. em xai windows 7. hic. em bo cong ra add 100 tu vung. h ko con j het. mong anh coi lai de khac phuc cho nhung nguoi su dung khac
Quang Nguyen Ba - 10/5/2009 4:54:49 PM
Hello Trinh
Cám ơn Trinh đã quan tâm đến chương trình. Dưới đây là bản cập nhật của chương trình. Chạy ổn định hơn.
http://cid-a21319952f68e79e.skydrive.live.com/self.aspx/.Public/Vocabulary%20Reminder/EnglishVocabularyReminder%5E_v1.0.0.1.rar
Nếu có vấn đề gì phát sinh, mong các bạn note lại kỹ nguồn gốc phát sinh và có kèm ảnh để mình cập nhật
Tý Bùi Văn Nhâm - 10/6/2009 9:36:42 PM
Chào anh!
Tôi cũng đang nghiên cứu lỉnh vực này tôi đang gặp một trường hợp muốn tham khảo anh. Tôi muốn chuyển kiểu hiển thị ngày trong DataPicker sang dạng dd/MM/yyyy thì phải làm như thế nào? Hi vọng nhận được sự giúp đở.
Phú Phùng - 10/16/2009 11:43:29 AM
Rất hữu ích đấy anh Quang ! ^_^. Anh cập nhật thêm 1 số tính năng nữa thì tuyệt.VD như mình có thể save các từ củ ra 1 file nào đó để tiện việc xem lại...
Quang Nguyen Ba - 11/20/2009 10:35:21 AM
Phú, các từ mới được tự động lưu vào một file xml, mình có thể copy ra được và tái sử dụng. Tham khảo thêm các comment trên msdnvietnam.net nhé
loi - 3/13/2010 5:35:34 PM
THANKS VERY MUCH

Thứ Bảy, 19 tháng 9, 2009

WCF và tính tương thích với ASP.NET

Một sự khác biệt to lớn giữa các Web Services truyền thống ASMX và WCF Services là khả năng kích hoạt của chúng. Với WCF các services có thể được kích hoạt thông qua các giao thức ngoài HTTP như net.tcp, net.pipe hoặc WAS (Windows Activation Service). Trong khi ASMX service chỉ có thể được kích hoạt thông qua HTTP, và do đó nó liên kết chặt chẽ với ASP.NET HTTP pipeline. Điều này khiến cho các WCF services trở nên khá linh hoạt và động lập trong quá trình triển khai. Chúng có thể được deploy ở IIS, Windows Services hoặc các host tự tạo. Ngay cả khi WCF service được triển khai trên môi trường IIS, bên trong một ASP.NET application thì nó cũng không phụ thuộc vào các features của ASP.NET. Chúng ta dễ dàng nhận thấy rằng, các features trong ASP.NET như:

  • Authentication
  • Url/File authorization
  • Impersonation
  • Session state
  • Request cache
  • Globalization
  • Custom HttpModules

    Các features này thuộc về các thư viện HTTP:

  • System.Web.HttpApplication
  • System.Web.HttpContext

    Các features này sẽ không có khả năng sử dụng nếu như chúng ta không thiết lập ASP.NET Compatible Mode cho WCF. Khi đó, với HttpContext, đối tượng Current là luôn luôn null trong WCF. Để sử dụng các features này trong WCF, chúng ta cấu hình ASP.NET Compatible mode cho WCF. WCF cung cấp khả năng hỗ trợ ASMX thông qua các phương thức hosting khác nhau

    • Mixed Transports Mode
    • ASP.NET compatibility mode

    Để thiết lập ASP.NET Compatible Mode, chúng ta tham khảo hướng dẫn trên MSDN:

    http://msdn.microsoft.com/en-us/library/aa702682.aspx

    Reference: ASP.NET Compatibility Mode

  • Thứ Sáu, 11 tháng 9, 2009

    Xây dựng Report với Microsoft Reporting: MicrosoftReportViewer, Client Report Definition .rdlc

    Một trong những yêu cầu thường gặp khi xây dựng một phần mềm hoặc website ứng dụng đó là Report. Report có thể được thể hiện trên nhiều dạng khác nhau như danh sách, biểu đồ,…Đồng thời các Report phải được xuất ra các định dạng cơ bản như PDF, Excel, CVS,…Do đó nó cũng đòi hỏi yêu cầu về mặt thiết kế. Có nhiều công cụ lựa chọn để xây dựng Report như ActiveReport, Microsoft Report,…Tôi thích Microsoft Report vì nó mạng lại sự tiện dụng, sức mạnh và linh hoạt.

    Microsoft Reporting cung cấp sẵn cho chúng ta các template để thiết kế report như Crystal Report, Report Wizard, Report, đó là các client report definition files. Chúng ta sử dụng chúng để thiết kế, binding và tính toán cho report.

    A21319952F68E79E_536_0[1]

    Các client report definition này được hiển thị trên WinForms hoặc WebForms thông qua các container có sẵn như MicrosoftReportViewer với đầy đủ các công cụ cần thiết cho việc dàn trang, tìm kiếm, export…rất thuận tiện. Bộ thư việc của Microsoft Reporting cũng hết sức đơn giản bao gồm Microsoft.ReportViewer.Common.dll, Microsoft.ReportViewer.WinForms.dll nếu dùng WinForms và Microsoft.ReportViewer.WebForms.dll nếu dùng cho Web.

    A21319952F68E79E_536_1[1]

    Ngoài ra Microsoft Reporting cũng hỗ trợ rất nhiều nguồn data khác như như MS SQL, MS Access, Oracle, WebServives, XML, và đặc biệt quan trọng đó là Object Data Source.

      A21319952F68E79E_536_2[1]

    Một số tips khi sử dụng Microsoft Reporting.

    - Nested Object Binding: Thông thường chúng ta binding sử dụng các Properties của Object. Một vài trường hợp các Properties lại là một object khác. Khi đó chúng ta sử dụng Binding syntax: =Fields!Sales.Value.Customer.Name.

    public class CustomerInfo
    {
        public string Name {get; set;}
    }
     
    public class ProductSales
    {
        public CustomerInfo Customer {get; set;}
    }
     
    public class Product
    {
        public ProductSales Sales {get; set;}
    }







    - Collection Object Binding: Trong trường hợp chúng ta cần binding cho một Collections, ví dụ như một Order với nhiều Products. Khi đó chúng ta sử dụng Subreport để thiết kế report kiểu này. Chúng ta thiết kế 2 Report



    OrderReport: chứa một Subreport control. Control này bind lấy Product report và define một parameter như Id của Order để truyền đi khi load subreport



    ProductReport: Khai báo một parameter để nhận Order id khi load.



    Chúng ta implement SubreportProcessing Event để load subreport. Ở đó chúng ta nhận OrderId thông qua string orderId = e.Parameters[0].Values[0].ToString();



    và Add data source cho Subreport e.DataSources.Add(new ReportDataSource("SUBREPORT_DATA_SOURCENAME", GetDataSource(orderId )));



    - Ẩn hiện Column: Chúng ta sử dụng thuộc tính Visibility để control để quyết định việc ẩn hiện column phụ thuộc vào tham số



    A21319952F68E79E_536_3[1]



    - Export to PDF hoặc Excel programmatically:






    private void generateREPORT(string outputFormat)
            {
                Warning[] warnings = null;
                String[] streamids = null;
                String mimeType = null;
                String encoding = null;
                String extension = null;
                Byte[] bytes = null;
                if (outputFormat == "PDF")
                {
                    bytes = reportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);
                }
                else
                {
                    bytes = reportViewer.LocalReport.Render("Excel", null, out mimeType, out encoding, out extension, out streamids, out warnings);
                }
     
                Response.ContentType = mimeType;
                Response.Clear();
                if (outputFormat == "PDF")
                {
                    Response.AddHeader("Content-Disposition", "attachment; filename=RGP_TOTAL.pdf");
                }
                else
                {
                    Response.AddHeader("Content-Disposition", "attachment; filename=RGP_TOTAL.xls");
                }
                Response.BinaryWrite(bytes);
                Response.End();
            }


    - Landscape Report: mặc định report được xuất ra dưới dạng Portrait (Height lớn hơn (greater) Width). Để xuất report ra dạng Landscape, chúng ta chọn Reports –> Report Properties… Trong Layout tab, thiết lập Width > Height là ok



    - Auto Serial Numeber (No.): Thông thường các Report thường dưới dạng Grid với các Rows. Để thiết lập số thứ tự cho từng row (Row No.) chúng ta sử dụng function sau: =RowNumber(Nothing)



    Và rất nhiều các kỹ thuật khác.



    Chúc các bạn thành công khi sử dụng Microsoft Reporting

    Thứ Năm, 20 tháng 8, 2009

    InfoPath: Duplicate Attribute error

    “The formula contains one or more errors.
    Duplicate attribute”

    I got it when trying to add ,xsl as Data Connections to InfoPath then add new Rules to controls. Following this guide. It’s resolved the problem

    http://www.softobject.com/sites/Blog/Lists/Posts/Post.aspx?ID=4

    DUPLICATE ATTRIBUTE ERROR:

    This happens when a XSL file is added to the form as 2ndary data source.  The namespace in the XSL conflicts what's in Form's ns. 

    RESOLUTION:

    Do not add XSL as 2ndary data source.  Instead add it as form's Resource File.  Change your code that might be doing the XSLT transform to load the XSL manually.  This fixes it as charm!

    Work around code instead of havinf XSL as a secondary data source

    WITH XSL AS SECONDARY DATA SOURCE, YOU COULD HAVE DONE SOMETHING LIKE THIS:

    custom.HTMLDocument.body.innerHTML = thisXDocument.DOM.transformNode(thisXDocument.GetDOM("SummaryReport"));


    NOW SINCE THAT CAUSES NAMESPACE CONFUSION/CONFLICT, DO THE XSLT LIKE THIS:






    IXMLDOMDocument XSLTFileDOM = thisXDocument.CreateDOM(); 
    XSLTFileDOM.async = false; 
    XSLTFileDOM.validateOnParse = false; 
    XSLTFileDOM.load("SummaryReport.xslt"); 
    custom.HTMLDocument.body.innerHTML = thisXDocument.DOM.transformNode(XSLTFileDOM);



    -DANIEL





    It work for JScript. But C#, I don’t get the solution yet.



    Comments








    Quang Nguyen Ba - 8/21/2009 8:52:30 AM
    After asking someone over Internet. I found the solution for it. Following the guide from Jimmy http://www.infopathdev.com/forums/p/1641/46072.aspx, It work well. Here are complete codes for implementing transformation from from Resource Files






       1: XslCompiledTransform trans = new XslCompiledTransform();
       2: Stream xslTemplate = this.Template.OpenFileFromPackage("DNTN_Temp.xsl");
       3: XmlReader xslTemplateReader = XmlReader.Create(xslTemplate);
       4: trans.Load(xslTemplateReader);
       5: XmlTextWriter myWriter = new XmlTextWriter(resumeFile + "\\" + filename, null);
       6: trans.Transform(this.MainDataSource.CreateNavigator(), null, myWriter);
       7: myWriter.Close();