2012年5月14日 星期一

C# - DataGridView 自動對應 DataTable 欄位

沒甚麼特別的,只是覺得測試的時候這個蠻好用的!所以分享一下!


public static void AdjustDataGridViewColumn(DataTable dataTable, DataGridView dataGridView)
{
    dataGridView.Columns.Clear();

    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        DataColumn dc = dataTable.Columns[i];

        DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
        col.Name = dc.ColumnName;
        col.ValueType = typeof(string);
        col.DataPropertyName = dc.ColumnName;
        col.HeaderText = dc.Caption;
        col.Visible = true;
        col.FillWeight = 150;
        dataGridView.Columns.Add(col);
    }
}


C# - DataGridView 控制項的資料行中至少有一行沒有儲存格樣板。


由於在測試一些東西,所以想要一個功能就是下完查詢之後,
DataGridView 可以自動調整成 DataTable 對應的欄位,
但是一直出現這個錯誤訊息!



後來我直接將 DataGridViewColumn 換成 DataGridViewTextBoxColumn 就沒有問題了!

這行不要!


DataGridViewColumn col = new DataGridViewColumn();


換成這行!


DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();


C# - 如何得到 DataTable 某個字串欄位的最大長度?


總之我就是有一個需求,是要把 CSV 檔案直接存入資料庫的新資料表,
所以呢我必須要利用 CSV 檔案產生新的資料表,
大部份的欄位都是直接開 VARCHAR ,
產生新的資料表的這個部份可以用我上一篇講的 SMO 來處理,
但是有一個問題是,我欄位長度要設定多少?
當然我可以直接設定 VARCHAR(200) ,應該行的通,只是很 low ....
我也可以跑回圈找到最長的那一筆資料,不過也是個 low ....
然後我就看到 Linq 裡面有 Max() 可以使用,不過該怎麼用呢?
花了一點時間踹一下,果然可以用,感覺不那麼 low 了....


int max = DataTable. AsEnumerable().Max(r => r.Field<String>(colName).Length);


這樣是不是有高級一點點的感覺?

C# - 操作資料庫的利器 - SQL Server Management Objects (SMO)


前陣子因為要寫 Log 的相關功能,
所以需要程式可以自動產生 Log 的 Table ,
但是無奈 C# 並沒有內建相關的功能可以使用,
然後我又不想自己去解析 sys.object & sys.columns 相關的東西,
雖然已經解析過兩三次了,也有半成品可以使用,
但總是覺得這樣程式寫起來不漂亮,所以不想使用!
然後就一直搜尋是否有比較直覺的方式可以使用,
就在快放棄的時候讓我看到了一篇文章,
Getting started with SQL Server Management Objects (SMO)
裡面有介紹如何使用,我大致看了一下,
便覺得這就是我要找的東西丫!丫!丫!丫!
於是跟著做了一次,使用上果然直覺多了!
馬上就拿來應用在我的程式上了!
下面我就大概講一下如何使用吧!
首先妳的專案要先 reference 幾個東西,
跟文章裡面講得有點不一樣,因為他講的東西我有一樣找不到,

Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended
Microsoft.SqlServer.SqlEnum

文章裡面有解釋各自是甚麼東西,做甚麼用的,請自行參考。

2012年5月4日 星期五

【Excel Data Reader】- OUT!!!


早上又看了另外一個元件【Excel Data Reader】
他網頁的標題是這樣的【Excel Data Reader - Read Excel files in .NET】
Project Description 上面寫有支援到 Excel 2007 ,
不過只到 .Net Framework 2 ?


2012年5月3日 星期四

掰伊~掰伊~~ LinqToExcel !!!


因為 NPOI 不支援 Excel 2007 所以我又跑回來試 LinqToExcel ,
利用 LINQPad 直接來測試,是說點下去沒有東西會出來實在是很難用丫!

anyway 我寫了一小段程式來測試,

void Main()
{
        var fileName = System.IO.Path.Combine(@"C:\ExportData", "data.CSV");
        var excelFile = new LinqToExcel.ExcelQueryFactory(fileName);     
        excelFile.DatabaseEngine = LinqToExcel.Domain.DatabaseEngine.Ace;

        var excel = excelFile.Worksheet<exl>();
        foreach (var element in excel)
        {
                element.Dump();
                "".Dump();
        }
}

// Define other methods and classes here
public class exl
{
        public string no { get; set; }
        public string name { get; set; }
        public string tel { get; set; }
        public string addr { get; set; }
}


重點在於我的電腦是 x64 的,
所以必須加上一行來指定 DatabaseEngine ,

excelFile.DatabaseEngine = LinqToExcel.Domain.DatabaseEngine.Ace

找了很久,也許是因為用 LINQPad 的關係,
因為網頁上的範例只寫了

excelFile.DatabaseEngine = DatabaseEngine.Ace

導致 LINQPad 一直有錯誤,說是 DatabaseEngine 沒有甚麼OOXX的....
搞了我好久,最後還是回到 VS2008 上面去才比較快找到原因,
最後終於可以跑出來了!

但是我還想試 LinqToExcel 一個功能,

    var excel = excelFile.Worksheet<exl>()
                .Where(d=>d.name=="Frankie");


沒想到這個時候又跳出了 OLE DB 的錯誤了!



找了半天, excel 沒有類似 DatabaseEngine 的屬性可以設定,
所以 LinqToExcel 就到此結束啦!枉費我這麼看好妳~~~


C# 讀寫 Excel 的另類選擇 - NPOI




這是一個不需要靠 OLE DB 或 COM 的方式可以直接讀寫 Excel 的元件,
可以參考這篇【在 Server 端存取 Excel 檔案的利器:NPOI Library】;
的確,當我們想把自動轉入資料的程式放在 Server 端的時候,
通常會遇到的問題就是 Server 沒有安裝 Excel !
這是一個多麼令人尷尬的事情丫!

那 NPOI 是甚麼東西呢?直接擷取網頁這一段來說明:


POI 專案本身是處理 Office 檔案的函式庫,包含 WordExcelPowerPointOutlookVisioPublisher 等檔案,這些檔案都有一個共通的特性,就是它們都是微軟發展的 OLE Compound Document(複合文件),以 OLE Structured Storage(結構化儲存)格式儲存在檔案中,OLE 規範(以及處理 OLE API 呼叫等)對一般的開發人員來說是有相當的難度,因此利用 Excel 本身的物件模型是最容易的一件事。但 POI 專案並沒有使用到 Excel 的任何東西,它直接深入 OLE Compound Document 格式內去存取資料,也可以直接控制到各種儲存格的資訊(顏色,儲存格格式與樣式等),並將它物件導向化,外部開發人員只需要利用 POI 提供的屬性就可以控制 Office 格式的檔案資料。


FileDialog.Filter 屬性怎麼寫


每次都忘記都要找,所以直接貼上來,
其實只是內建的說明而已 XD


Text files (*.txt)|*.txt|All files (*.*)|*.*
Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*
Excel files (*.xls)|*.xls|All files (*.*)|*.*

private void button1_Click(object sender, System.EventArgs e)
{
    Stream myStream = null;
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    openFileDialog1.InitialDirectory = "c:\\" ;
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
    openFileDialog1.FilterIndex = 2 ;
    openFileDialog1.RestoreDirectory = true ;

    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        try
        {
            if ((myStream = openFileDialog1.OpenFile()) != null)
            {
                using (myStream)
                {
                    // Insert code to read the stream here.
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
        }
    }
}


2012年5月2日 星期三

LINQPad 使用 Linq 的好幫手

網路世界真是連來連去的,
因為找 NPOI 而找到 LinqToExcel ,
又因為 LinqToExcel 找到 LINQPad,
看了一下感覺不錯(又不錯!),所以馬上下載來用看看!
先看看這篇介紹吧!【LINQPad 有在用LINQ不可或缺的好工具

接下來開始使用囉!
也是因為我要踹 LinqToExcel 的關係啦!
先去官網 LINQPad 將 LINQPad download 下來吧!



看到那個標題真的有同感~~~哈哈!
有兩種程式可以下載,一種是要安裝的、一種是可以直接執行的!
我是先抓 Standalone Executable 來測試啦!

LinqToExcel

今天在找讀取 Excel 的相關東西,
簡單的說就是不要透過 OLE 跟 COM 來讀取,
原本找到一個 NPOI 的東西,
在找 NPOI 的相關資料的時候又找到了這個 LinqToExcel ,
看了一下別人的介紹【讀取 Excel 你還在用 NPOI 嗎?快來試試 LinqToExcel】,
感覺還蠻不錯的,決定就是它了!
所以馬上按圖索驥開始來試用它!

中間也試用了一下 LINQPad ,
不過在用的途中出現了一個訊息,
讓我不得不放棄它丫!



但是我不死心,我幻想其實是 LINQPad 的關係,
所以上了 LinqToExcel 網站查看看。



官網:linqtoexcel
Source code:https://github.com/paulyoder/LinqToExcel

因為跟我的需求的前提不符合,所以就只好放棄啦!
不然我覺得應該是不錯的東西才對!
有需要的人,然後又不反對用 OLEDB 的話可以試試看喔!