顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

星期二, 6月 27, 2017

C# DateTime 相減

每次用到都要去 Google,這次決定把他記下來

當兩個 DateTime 要相加減時就需要用到 TimeSpan

DateTime begDate = DateTime.Now;
TimeSpan ts = DateTime.Now - begDate;
string diff = ts.Minutes.ToString() + "分" + ts.Second.ToString() + "秒";

星期一, 3月 27, 2017

.NET FTP library

發現一個還蠻好用的 FTP Library

在 Ftp.dll 很多常用的功能都已經寫好,

尤其是一些遠端的上傳下載整個資料夾的上傳跟下載,

SSL 的部份,還有取得 FTP File or Folder List 的部份,

還可以透過 Hash 來驗證上傳與下載的檔案是否完整,

免費的就很好用了,唯一缺點是上傳的時候有可能 filename 會被 Rename,

所以我上傳就用自己寫的,其他使用到的功能就用他提供的來進行。

下載 Ftp.dll

官網:https://www.limilabs.com/ftp/download

星期五, 10月 30, 2015

編碼轉換


這次遇到西歐語系編碼,系統無法正確儲存,只好寫個小工具來轉換編碼了。

先將檔案內容讀出來,GetEncoding(字碼頁)

string text = System.IO.File.ReadAllText(this.textBox1.Text, System.Text.Encoding.GetEncoding(1252));


然後另存檔案

System.IO.File.WriteAllText(this.textBox1.Text.Replace(".edi", "") + "_Unicode.edi", text);

再用記事本打開檔案就可以看到 WEIß 

大功告成

編碼參考連結:

星期二, 7月 14, 2015

DHL Shipment Validation by C#

公司要導入跟物流的自動交互,如此就可以自動從 ERP 將資料傳到物流的系統,順便直接產生出提單 Label 直接可以貼在箱上。

DHL 提供的範例為 Java 的,只好問 Google 看看大家的經驗了,

經過好幾天的看文件,找範例,問廠商,總算可以順利的印出 Label 了。

string requestText//導入 XML 資料
WebRequest requestRate = HttpWebRequest.Create("https://xmlpitest-ea.dhl.com/XMLShippingServlet");//DHL 的測試環境
requestRate.ContentType = "application/x-www-form-urlencoded";
requestRate.Method = "POST";

using (var stream = requestRate.GetRequestStream())
{
var arrBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(requestText);
stream.Write(arrBytes, 0, arrBytes.Length);

stream.Close();

}



WebResponse responseRate = requestRate.GetResponse();

var respStream = responseRate.GetResponseStream();

var reader = new StreamReader(respStream, System.Text.Encoding.ASCII);

string strResponse = reader.ReadToEnd();

respStream.Close();



XmlDocument xdoc = new XmlDocument();

xdoc.LoadXml(strResponse);



            XmlNodeList list = xdoc.GetElementsByTagName("OutputImage");



if (list.Count > 0)

{

//EPL2 直接傳給印表機進行列印

byte[] bytes = Convert.FromBase64String(list[0].InnerText.ToString());

IntPtr pUnmanagedBytes = new IntPtr(0);

int nLength = bytes.Length;

pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);

Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);

RawPrinterHelper.SendBytesToPrinter("DHL_Label", pUnmanagedBytes, nLength);

Marshal.FreeCoTaskMem(pUnmanagedBytes);

}

這邊會用到一個 Microsoft 網站只有找到 VB.Net 的,但網路上有人已經改成 C# 的 Class

public class RawPrinterHelper
  {
    // Structure and API declarions:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class DOCINFOA
    {
      [MarshalAs(UnmanagedType.LPStr)]
      public string pDocName;
      [MarshalAs(UnmanagedType.LPStr)]
      public string pOutputFile;
      [MarshalAs(UnmanagedType.LPStr)]
      public string pDataType;
    }
    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

    [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool ClosePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

    [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool EndPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

    // SendBytesToPrinter()
    // When the function is given a printer name and an unmanaged array
    // of bytes, the function sends those bytes to the print queue.
    // Returns true on success, false on failure.
    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
      Int32 dwError = 0, dwWritten = 0;
      IntPtr hPrinter = new IntPtr(0);
      DOCINFOA di = new DOCINFOA();
      bool bSuccess = false; // Assume failure unless you specifically succeed.

      di.pDocName = "My C#.NET RAW Document";
      di.pDataType = "RAW";

      // Open the printer.
      if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
      {
        // Start a document.
        if (StartDocPrinter(hPrinter, 1, di))
        {
          // Start a page.
          if (StartPagePrinter(hPrinter))
          {
            // Write your bytes.
            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
            EndPagePrinter(hPrinter);
          }
          EndDocPrinter(hPrinter);
        }
        ClosePrinter(hPrinter);
      }
      // If you did not succeed, GetLastError may give more information
      // about why not.
      if (bSuccess == false)
      {
        dwError = Marshal.GetLastWin32Error();
      }
      return bSuccess;
    }
    public static bool SendMemoryToPrinter(string szPrinterName, MemoryStream ms)
    {
      BinaryReader br = new BinaryReader(ms);
      Byte[] bytes = new Byte[ms.Length];
      bool bSuccess = false;
      IntPtr pUnmanagedBytes = new IntPtr(0);
      int nLength;

      nLength = Convert.ToInt32(ms.Length);
      bytes = br.ReadBytes(nLength);
      pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
      Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
      bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
      Marshal.FreeCoTaskMem(pUnmanagedBytes);
      return bSuccess;
    }
    public static bool SendFileToPrinter(string szPrinterName, string szFileName)
    {
      // Open the file.
      FileStream fs = new FileStream(szFileName, FileMode.Open);
      // Create a BinaryReader on the file.
      BinaryReader br = new BinaryReader(fs);
      // Dim an array of bytes big enough to hold the file's contents.
      Byte[] bytes = new Byte[fs.Length];
      bool bSuccess = false;
      // Your unmanaged pointer.
      IntPtr pUnmanagedBytes = new IntPtr(0);
      int nLength;

      nLength = Convert.ToInt32(fs.Length);
      // Read the contents of the file into the array.
      bytes = br.ReadBytes(nLength);
      // Allocate some unmanaged memory for those bytes.
      pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
      // Copy the managed byte array into the unmanaged array.
      Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
      // Send the unmanaged bytes to the printer.
      bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
      // Free the unmanaged memory that you allocated earlier.
      Marshal.FreeCoTaskMem(pUnmanagedBytes);
      return bSuccess;
    }
    public static bool SendStringToPrinter(string szPrinterName, string szString)
    {
      IntPtr pBytes;
      Int32 dwCount;
      // How many characters are in the string?
      dwCount = szString.Length;
      // Assume that the printer is expecting ANSI text, and then convert
      // the string to ANSI text.
      pBytes = Marshal.StringToCoTaskMemAnsi(szString);
      // Send the converted ANSI string to the printer.
      SendBytesToPrinter(szPrinterName, pBytes, dwCount);
      Marshal.FreeCoTaskMem(pBytes);
      return true;
    }
  }

星期二, 8月 31, 2010

ASP.NET Using Transaction

最近越來越常用到同時要更新多個Table的功能,本來想偷懶的用SqlDataSource來解決就好了,
可是隨著SQL語法的越來越複雜,已經不能這樣做了,而SqlDataSource預設也不支援Transaction的功能,在網路上找了很多個SqlDataSource結合Transaction的用法,結果沒有一個真的可以用的,真是奇怪,只好乖乖的回來使用SqlConnection來做了,而為了預防SQL injection,我又特別喜歡用傳參數的方式來,結果我的程式就變的行數特別多了!

string strSQL = @"INSERT INTO [drug_list] ([Center], [RandomNo], [DrugCode], [IsUsed], [IsDrugActive], [DrugExpiredDate], [CheckInDate], [IsDrugExpired], [UpdateUser], [UpdateTime]) VALUES(@Center, @RandomNo, @DrugCode, @IsUsed, @IsDrugActive, @DrugExpiredDate, @CheckInDate, @IsDrugExpired, @UpdateUser, GETDATE());
DECLARE @ID int;
SELECT @ID=[idx] FROM [drug_list] WHERE [Center]=@Center AND [RandomNo]=@RandomNo;
INSERT INTO [drug_List_AT] ([idx],[Center], [RandomNo], [DrugCode], [IsUsed], [IsDrugActive], [DrugExpiredDate], [CheckInDate], [IsDrugExpired], [UpdateUser], [UpdateTime]) VALUES(@ID, @Center, @RandomNo, @DrugCode, @IsUsed, @IsDrugActive, @DrugExpiredDate, @CheckInDate, @IsDrugExpired, @UpdateUser, GETDATE());";
SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
connection.Open();
SqlTransaction sqlTx = connection.BeginTransaction();
SqlCommand command = new SqlCommand(strSQL, connection);
command.Transaction = sqlTx;
try
{
command.Parameters.Add("Center", Request.QueryString["Site"].ToString());
command.Parameters.Add("RandomNo", this.txtRandomNo.Text);
command.Parameters.Add("DrugCode", this.txtPackageNo.Text);
command.Parameters.Add("IsUsed", "0");
command.Parameters.Add("IsDrugActive", "0");
command.Parameters.Add("DrugExpiredDate", this.txtExpiredDate.Text);
command.Parameters.Add("IsDrugExpired", "0");
command.Parameters.Add("UpdateUser", Session["UserID"].ToString());
command.Parameters.Add("CheckInDate", this.txtCheckInDate.Text);
command.ExecuteNonQuery();
sqlTx.Commit();
Response.Write("Save Successfully.");
}
catch
{
sqlTx.Rollback();
Response.Write("Save Failed");
}
finally
{
connection.Close();
connection.Dispose();
sqlTx.Dispose();
command.Dispose();
}

放個範例在這邊,預防我忘記了還可以快點找到參考的