2008年12月17日 星期三

讀取excel的欄位數目(不使用oledb)

讀取excel的欄位數目(不使用oledb)




這次遇到的問題是當excel中欄位數超過255欄時,以前用oledb讀入的方式會產生錯誤,執行到fill(ds)時就會掛掉了,連用try-catch都抓不出錯誤,就直接給我罷工(氣死)!!


經過google後援會一番商討後,終於看到了點希望,就在差點搞掛電腦ㄉ危險下終於ok!! 呼~~~


讓我寫下這可歌可泣ㄉ一面







~step1~


加入參考


1 .NET System.Data.OracleClient.dll


2. COM Microsoft Excel 11.0 Object Library







~step2~


加入namespace


using Excel;


using System.Configuration;


using System.Reflection;


using System.Diagnostics;






~step3~


object missing = Missing.Value;

Excel.ApplicationClass app;

Excel.Workbook book;

Excel.Worksheet sheet;

int excelcount;



app = new ApplicationClass();
try
{
book = app.Workbooks.Open(Files[j],missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing,missing,missing);
}
catch (Exception e)
{
throw e;
}
//得到WorkSheet
sheet = (Excel.Worksheet)book.Sheets.get_Item(1);

//得到使用過的欄位數目
excelcount = sheet.UsedRange.Columns.Count;
book.Close(false,false,false);
app.Workbooks.Close();
app.Quit();

ps:記得application一定要關!! 不然會一直執行!! 無法測試,必須重開機,以上!!

2008年11月11日 星期二

在.net下執行command mode指令

在.net下執行command mode指令


using System;

using System.Diagnostics;



單行指令


public void ExeCommand(string commandline)
{

Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
string strOutput = null;
p.StandardInput.WriteLine(commandline);
p.StandardInput.WriteLine("exit");
strOutput = p.StandardOutput.ReadToEnd();
Console.WriteLine(strOutput);
p.WaitForExit();
p.Close();
}



多行指令


public string ExeCommand(string[] commandTexts)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
string strOutput = null;
try
{
p.Start();
foreach (string item in commandTexts)
{
p.StandardInput.WriteLine(item);
}
p.StandardInput.WriteLine("exit");
strOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
}
catch (Exception e)
{
strOutput = e.Message;
}
return strOutput;
}

coreftp

先安裝coreftp



然後就可以在command mode下使用指令執行



一般ftp模式



下載

"程式執行檔在路徑" -d 遠端ftp address -p 下載檔案放置ㄉ位置

ex:
"c:\program files\coreftp\coreftp.exe" -d ftp://UserId:Password@140.96.149.49/CHT/CHT_IN/*.txt -p c:\fail\


上傳

"程式執行檔在路徑" -u 上傳檔案放置ㄉ位置 -p 遠端ftp address

ex:
"c:\program files\coreftp\coreftp.exe" -u c:\fail\*.txt -p ftp://UserId:Password@140.96.149.49/CHT/CHT_OUT/*.txt


ftp加密模式


下載

"程式執行檔在路徑" -d(下載) 遠端ftp address -site SiteName -p(路徑) 下載檔案放置ㄉ位置


ex:


"c:\program files\coreftp\coreftp.exe" -d ftp://UserId:Password@140.96.149.49/CHT/CHT_IN/*.txt -site CarApprove -p c:\fail\



上傳


"程式執行檔在路徑" -u(上傳) 上傳檔案放置ㄉ位置 -site SiteName -p(路徑) 遠端ftp address


ex:


"c:\program files\coreftp\coreftp.exe" -u c:\fail\*.txt -site CarApprove -p ftp://UserId:Password@140.96.149.49/CHT/CHT_OUT/*.txt



sitename設定如下:





新增一個連結~~~Connection選擇AUTH SSL(加密模式),便於在command mode下使用



在上傳、下載時,指令最後若加上 -delsrc 在上傳、下載動作成功結束時會一併清除檔案來源

其他指令可以參考coreftp網頁及coreftp help

http://www.coreftp.com/docs/web1/Command_Line_FTP.htm

2008年10月7日 星期二

處理字串的方法

在.NET中,使用string、substring、length所取的字數皆為字元數(char),相當於2bytes,所以中、英字母的大小沒有區別。

但匯入文字檔(txt)所取ㄉ字數為位元數(byte),中文=2bytes、英文=1byte,須另行處理,使用substring、length會出現錯誤。

使用上有點不同~~分別列舉如下

ex:

<Ⅰ>字元數(char)寫法


string aa = "an中文txt"; 
int iCount = aa.Length();

string sChinese = aa.substring(aa, 2, 2);

 

iCount = 7

sChinese = "中文"

 

<Ⅱ>位元數(byte)寫法   
string aa = "an中文txt";

int iCount = System.Text.Encoding.Default.GetByteCount(aa);


byte[] bString = System.Text.Encoding.Default.GetBytes(aa);


string sChinese = System.Text.Encoding.Default.GetString(bString, 2, 2);


 


iCount = 9


sChinese = "中"  

  

2008年8月7日 星期四

interface
一般來說javascript只能單一繼承,沒辦法像c++可以使用多重繼承。
為了可以讓javascript擁有類似多重繼承的功能,所以使用interface。
interface跟 abstract class的差別
interface就如同字面意義"介面",像是主機板上面的PCI插槽,而PCI插槽可以插上顯示卡、音效卡、網路卡(相當於class),
藉由PCI來連接主機板跟顯示卡、音效卡間的作用。
abstract class相當於最基本的四邊形,而長方形、菱形、正方形、平行四邊形都繼承四邊形的特性,也有各自的特性。

2008年8月4日 星期一

重要ㄉ小老鼠

重要ㄉ小老鼠

原程式如下:
if(txtTop.Text.Trim() == "" txtTestDateStart.Text.Trim() == "" !CheckInt(txtTop.Text.Trim()))
{
if(txtTestDateStart.Text.Trim() == "")
{
ErrorMessage += "請輸入測試日期n";
}
if(txtTop.Text.Trim() == "")
{
ErrorMessage += "請輸入顯示TOP資料n";
}
else
{
ErrorMessage += "顯示TOP資料只能為>0的整數n";
}
String scriptString1 = string.Format(@"
<script language=JavaScript>
<!-- begin
alert('{0}')
//end -->
</script>
",ErrorMessage);
this.RegisterStartupScript("s",scriptString1);
修改後:
if(txtTop.Text.Trim() == "" txtTestDateStart.Text.Trim() == "" !CheckInt(txtTop.Text.Trim()))
{
if(txtTestDateStart.Text.Trim() == "")
{
ErrorMessage += @"請輸入測試日期n";
}
if(txtTop.Text.Trim() == "")
{
ErrorMessage += @"請輸入顯示TOP資料n";
}
else
{
ErrorMessage += @"顯示TOP資料只能為>0的整數n";
}
String scriptString1 = string.Format(@"
<script language=JavaScript>
<!-- begin
alert('{0}')
//end -->
</script>
",ErrorMessage);
this.RegisterStartupScript("s",scriptString1);
差別在ErrorMessage後的"@",不使用時會造成javascript結尾錯誤
很機車ㄉ錯誤~~差點去買乖乖來拜了>"<

2008年8月1日 星期五

自動在windows執行 每天刪除n天前的檔案

'自動化檔案維護管理程式
'天數
daysAgo = 7

'路徑
dirPath = "C:\\Temp2"

'副檔名
extName = ".txt"

';;;;;程式開始;;;;;
Set fs = CreateObject("Scripting.FileSystemObject")
Set w = WScript.CreateObject("WScript.Shell")

Set f = fs.GetFolder(dirPath)
Set fc = f.Files

dateBefore = Now() - daysAgo

For Each ff in fc
fileName = ff.Name
fileDate = ff.DateLastModified

If Right(fileName, Len(extName)) = extName And fileDate < dateBefore Then
fs.DeleteFile(dirPath & "\\" & fileName)
End If
Next

----------------------分格線-----------------------------------------
用途:自動在windows執行 每天刪除n天前的檔案
Step1:複製分格線以上ㄉ文字 貼在txt檔然後副檔名改成vbs
Step2:在windows的工作排程上使用該檔

後記:
上面是網路上找到ㄉ
試用後真ㄉ可以ㄝ!!
神奇ㄉVBS!!
有需要ㄉ可以參考看看!!
如果有直接使用command mode就可以完成ㄉ指令
也可以回覆我~~
3Q

2008年7月23日 星期三

windows下自動上傳檔案到FTP

傳輸單個檔案
一、先用記事本編輯一個檔案(ftp.txt)
open ip_address(hostname) /*要連接的ftp*/
userid /*登入id*/
password /*登入pw*/
binary /*以二進制傳送文件,可選項*/
cd remote_directory_path /*ftp上的資料夾路徑*/
put local_filename remote_filename /*將local端的檔案上傳到ftp*/(單一檔案)
get remote_filename local_filename /*將ftp上的檔案下載到local端*/(單一檔案)
bye /*離開ftp*/

二、執行
<Ⅰ>直接在command mode下輸入ftp -s:ftp.txt
<Ⅱ>製成一個批次檔(bat),內容為 ftp -s:ftp.txt,然後排入工作排程!!即可自動執行
ps:批次檔跟txt檔需在同一個資料夾,批次檔命名可以特別些,勿與系統批次檔同名
傳輸多個檔案
一、先用記事本編輯一個檔案(ftp.txt)
open ip_address(hostname) /*要連接的ftp*/
userid /*登入id*/
password /*登入pw*/
prompt /*忽略對話窗,預設回答on*/
cd remote_directory_path /*ftp上的資料夾路徑*/
mput local_directory_pathfile_name /*將local端路徑資料夾的檔案上傳到ftp*/(多個檔案)
mget *.* /*將ftp資料夾路徑的檔案下載到ftp.txt放置的資料夾*/
bye /*離開ftp*/

二、執行
<Ⅰ>直接在command mode下輸入ftp -s:ftp.txt
<Ⅱ>製成一個批次檔(bat),內容為 ftp -s:ftp.txt,然後排入工作排程!!即可自動執行
ps:批次檔跟txt檔需在同一個資料夾,批次檔命名可以特別些,勿與系統批次檔同名

2008年7月3日 星期四

2003升級2005時,關於ActiveReport的修正

2003升級2005時,關於ActiveReport的修正
1.在專案的主資料夾下新增一個資料夾(App_GlobalResources)。
2.複製所有副檔名為resx的ActiveReport檔案到剛剛新增的App_GlobalResources資料夾下。


3.選擇ActiveReport中副檔名為cs的檔案,選擇為設計模式

4.改變其中某一屬性的屬性值(ex:TextBox1.value),然後再改回原來值

5.逐一執行步驟3、4直到所有報表都執行完。
6.建置專案。

ps:
剛開始打開cs檔選擇設計模式時如果只能看到line元件,其他元件看不到時,可以試著點選resx的檔案,

新增一列 column1:string column2:your TextBoxId
然後再打開cs檔選擇設計模式時即可看見其他元件。

2008年6月26日 星期四

Language Integrated Query (LINQ)

Language Integrated Query (LINQ)

整合性查詢語言

美國微軟副總Somasegar

LINQ消除不同資料領域不協調阻力的突破性科技,例如在查詢XML、關連式資料庫或物件時,透過LINQ技術,程式開發人員不需要學習個別不同的查詢語法;另外一般SQL必須在執行完成後才可以檢查出錯誤 ,LINQ在編譯過程中即可檢查錯誤

一、

、以C#示範新增、刪除、修改、查詢

查詢:

SQL語法:

Select Supplier_name,Supplier_product,SupplierInfo_phone1

from Supplier

join SupplierInfo on Supplier_name = SupplierInfo_name

where Supplier_name = ‘閔碩電腦’ Order by Supplier_id

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext(); //LinQ to SQL類別

var bcshahuo = from b in ddb.Supplier

join o in ddb.SupplierInfo      //join Table

on b.Supplier_name equals o.SupplierInfo_name //join 條件

where b.Supplier_name == "閔碩電腦" //where 條件

select new { b.Supplier_name, b.Supplier_product,o.SupplierInfo_phone1};//欄位

ps:var 為C#3.0後才有的關鍵字,需初始化,亦可根據後面的判斷句自動判斷產生該類型,但初始化後只能儲存該類型

新増:

SQL語法:

Insert into SupplierInfo (SupplierInfo_name, SupplierInfo_human) values (test, test)

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo s1 = new SupplierInfo

{

SupplierInfo_id = new int(),

SupplierInfo_name = "test",

SupplierInfo_human = "test"

};

ddb.SupplierInfo.InsertOnSubmit(s1);//InsertOnSubmit來包住命令

ddb.SubmitChanges(); //DataContext的方法,執行適當的命令來實作資料庫的變更

ps. DataContext類別, 表示 LINQ to SQL 架構的主要進入點

刪除:

SQL語法:

delete SupplierInfo where SupplierInfo_id = (select top 1 SupplierInfo_id from SupplierInfo where SupplierInfo_name like 'test%')

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo supplierinfo = ddb.SupplierInfo.First(b => b.SupplierInfo_name.StartsWith("test"));

ddb.SupplierInfo.DeleteOnSubmit(supplierinfo); //DeleteOnSubmit來包住命令

ddb.SubmitChanges();

修改:

SQL語法:

Update supplierinfo set SupplierInfo_human= Hana where SupplierInfo_id = (select top 1 SupplierInfo_id from SupplierInfo where SupplierInfo_name like 'test %')

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo supplierinfo = ddb.SupplierInfo.First(b => b.SupplierInfo_name.StartsWith("test"));

supplierinfo.SupplierInfo_human = "Hana";

ddb.SubmitChanges();// 這裡就不用再包住命令 直接執行

LinQ To SQL其他說明

1. 動態的Linq to Sql說明----看操作

2. LinQ在對sql做指令動作時,限制有點過於嚴謹,比如連結的資料表沒有PKEY的話,是會發生錯誤的

3. 在對SQL欄位動作時,SQL資料型態跟LINQ的資料型態轉換上也是的嚴謹,因此要對應下面這張圖來設定他的資料型態

SQL Data Type

Linq to SQL .NET Data Type

tinyint

System.Nullable<byte>

smallint

System.Nullable<short>

int

System.Nullable<int>

bigint

System.Nullable<long>

float

System.Nullable<double>

real

System.Nullable<float>

smallmoney

System.Nullable<decimal>

money

System.Nullable<decimal>

numeric(6, 2)

System.Nullable<decimal>

numeric(12, 2)

System.Nullable<decimal>

numeric(18, 2)

System.Nullable<decimal>

xml

System.Xml.Linq.XElement

image

System.Data.Linq.Binary

binary, varbinary

System.Data.Linq.Binary

bit

System.Nullable<bool>

datetime

System.Nullable<system.datetime>

timestamp

System.Data.Linq.Binary

uniqueidentifier

System.Nullable<system.guid>

varchar, char, text, ntext

System.String

<資料來源>

四、LINQ to 物件

運算處理後的結果

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

select Convert.ToInt32(n)+1;

//SQL寫法

select Convert(int,n)+1

from numbers

where條件

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

where Convert.ToInt32(n) > 5

select Convert.ToInt32(n);

//SQL 寫法

select n

from numbers

where Convert.ToInt32(n) > 5

排序

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

orderby Convert.ToInt32(n) descending

select Convert.ToInt32(n);

//SQL 寫法

select n

from numbers

order by Convert.ToInt32(n) desc

Group By

string[] strings = TextBox2.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in strings

//orderby n

group n by n.Substring(0, 1) into Groups

select Groups ;

String Intoutput = "";

foreach(var Groups in strLinQ)

{

Intoutput += "開始字母為:" + Groups.Key+"<br>";

foreach (string i in Groups)

{

Intoutput += i + ",";

}

Intoutput += "<br>";

}

Label4.Text = Intoutput;

//SQL寫法

select substring(n,1,1) as bb, case when aa like '%'+substring(n,1,1)+'%'

then aa end as aa

from strings

Distinct

//LINQ寫法

var strLinQ =

from n in numbers.Distinct()

select Convert.ToInt32(n);

var strLinQ = numbers.Distinct();

//SQL寫法

select distinct * from numbers

n

//LINQ寫法

var strLinQ = strings.Take(n);

//SQL寫法

select Top n * from strings

忽略前n

//LINQ寫法

var strLinQ = strings.Skip(n);

彙總函數

//LINQ寫法

var strLinQ = numbers.Count();

var strLinQ = numbers.Sum();

var strLinQ = numbers.Min();

var strLinQ = numbers.Max();

var strLinQ = numbers.Average();

、參考資料

1. LINQ學習手冊..蔡學鏞譯 碁峰出版 ………已經是公司資產了,大家好好利用他好嗎

2. http://blog.miniasp.com/ ………這個人也很勵害,但他的文章大部份來算對以下二個來源的學習

3. http://weblogs.asp.net/scottgu/default.aspx ………微軟.net部門總經理Scott Guthrie的部落格..勵害的傢伙

4. http://www.asp.net/learn/linq-videos/    …….直接可以下載demo的影片,很詳細大家看看

5. 線上MSDN             ……. 當然還有微軟的幫助

2008年2月15日 星期五

TextBox

/*在密碼模式下顯示讀入的資料*/

//html 中宣告
TextBox ID="aa" TextMode="Password" Runat="server

//程式中
aa.Text = "Password";
aa.Attributes.Add("value",aa.Text);