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

2020年5月26日

如何於 C# 使用 POINT 加入 Parameters 的方式



SQL 語法宣方式:

geometry::STGeomFromText('POINT('+ @X +' '+ @Y +')', 4326)

加入 Parameters 的方式

db.Parameters.Add("@X", SqlDbType.VarChar, X);
db.Parameters.Add("@Y", SqlDbType.VarChar, Y);

2020年5月7日

WPF DatePicker 如何 修改為 民國年 顯示。


於 InitializeComponent(); 之後加入:


CultureInfo cui = new CultureInfo("zh-TW", true);
cui.DateTimeFormat.Calendar = new TaiwanCalendar();
Thread.CurrentThread.CurrentCulture = cui;

2019年10月18日

C# 資訊安全 Cross site scripting




   using Microsoft.Security.Application;

   String APPLY_ID = Encoder.HtmlEncode((Request.QueryString["ID"]) ?? "");



   String iHTML = @"<table class='TableStyle01_cont'>
                                <tr bgcolor='#E8E8FF' align='center'>
                                    <th>項次</th>
                                    <th>名稱</th>
                                    <th>資料庫名稱</th>
                                </tr>
                    </table>";
   Literal1.Text = Encoder.HtmlEncode(iHTML);

2019年10月15日

2019年10月14日

C# CompareTo 判斷時間是否過期

 
      // Earlier = -1,
      // Later = 1,
      // TheSame = 0

     DateTime EXPIRE_END_DATE = DateTime.Parse("2019-10-14 01:00:00");
     if (EXPIRE_END_DATE.CompareTo(DateTime.Now) < 0 )
     {
             // "已過期!!" 
             
     }else if (EXPIRE_END_DATE.CompareTo(DateTime.Now) == 0 )
     {
             // "日期時間一樣" 
             
     }else if (EXPIRE_END_DATE.CompareTo(DateTime.Now) > 0 )
     {
             // "未過期!!" 
             
     }

2019年9月27日

都加了 using System.Configuration ,還是找不到 ConfigurationManager


如題,當我使用下面語法時,ConfigurationManager 是找不到這個類別的,我也加了 using System.Configuration。

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString);

以下是解決方法:

       滑鼠右鍵 >> 加入參考 >> 搜尋「system.configuration」>> 確定 >> 出現在參考的清單裡。

滑鼠右鍵,加入參考

搜尋「system.configuration」

出現在參考的清單裡

2019年9月26日

C# Geometry 轉 Encoded Polyline Algorithm

因為,在開發 Google Map 時,在套疊資料較大的 Geometry 時,往往都會花比較多時間才能顯示於開發的 Google Map 上,而 Google 也提供了新的演算法,讓開發者在套圖的時候能更快速。

而我依照這個演算法,寫了 C# Asp.net 版本,首先,NuGet 的 套件管理器主控台,安裝 Install-Package Geolocation -Version 1.1.1。安裝完成後,就可以在 Bin 資料夾看到 Geolocation.dll 檔。然後,using 到你的專案上。


 

        using Geolocation;


        List points = new List();
        Coordinate coordinate = new Coordinate();

        coordinate.Latitude = 38.5;
        coordinate.Longitude = -120.2;
        points.Add(coordinate);


        Response.Write("38.5 -120.2 ->" + Encode(points) + "
");

    
    //解密
    public static List Decodee(string polylineString)
    {
        List list = new List();
        var polylineChars = polylineString.ToCharArray();
        var index = 0;
        var currentLat = 0;
        var currentLng = 0;

        while (index < polylineChars.Length)
        {
            var sum = 0;
            var shifter = 0;
            int nextFiveBits;
            do
            {
                nextFiveBits = polylineChars[index++] - 63;
                sum |= (nextFiveBits & 31) << shifter;
                shifter += 5;
            } while (nextFiveBits >= 32 && index < polylineChars.Length);

            if (index >= polylineChars.Length)
                break;

            currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);

            sum = 0;
            shifter = 0;
            do
            {
                nextFiveBits = polylineChars[index++] - 63;
                sum |= (nextFiveBits & 31) << shifter;
                shifter += 5;
            } while (nextFiveBits >= 32 && index < polylineChars.Length);

            if (index >= polylineChars.Length && nextFiveBits >= 32)
                break;

            currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);

            Coordinate coordinate = new Coordinate();
            coordinate.Latitude = Convert.ToDouble(currentLat) / 1E5;
            coordinate.Longitude = Convert.ToDouble(currentLng) / 1E5;
            list.Add(coordinate);
        }

        return list;
    }

    //加密
    public static string Encode(List points)
    {
        var str = new StringBuilder();

        var encodeDiff = (Action)(diff => {
            int shifted = diff << 1;
            if (diff < 0)
                shifted = ~shifted;
            int rem = shifted;
            while (rem >= 0x20)
            {
                str.Append((char)((0x20 | (rem & 0x1f)) + 63));
                rem >>= 5;
            }
            str.Append((char)(rem + 63));
        });

        int lastLat = 0;
        int lastLng = 0;
        foreach (var point in points)
        {
            int lat = (int)Math.Round(point.Latitude * 1E5);
            int lng = (int)Math.Round(point.Longitude * 1E5);
            encodeDiff(lat - lastLat);
            encodeDiff(lng - lastLng);
            lastLat = lat;
            lastLng = lng;
        }
        return str.ToString();
    }

比對後結果,感覺,Google Map Platform 網頁上第二和三筆是有問題的,不知道為什麼?

2019年9月20日

MySQL、MSSQL 連線方式及如何使用DataTable取得資料 for C#


    using MySql.Data.MySqlClient;
    using System.Data;


    DataTable dt = new DataTable();
    MySqlConnection conn = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MISConnection"].ConnectionString);
    conn.Open();

          using (MySqlCommand cmd = new MySqlCommand())
          {
               string CmdText = @"select * from basic where PK=@PK";

               cmd.Parameters.AddWithValue("@PK", PK);
               cmd.Connection = conn;
               cmd.CommandText = CmdText;
               
               MySqlDataReader myData = cmd.ExecuteReader();

               if (myData.HasRows)
               {
                    dt.Load(myData);
               }
          }

    conn.Close();

      
      using System.Data;
      using System.Data.SqlClient;

      SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString);
      cn.Open();
      String PK = "1";
      DataTable dt = new DataTable();
 
      string _sql = @"select * from basic where PK=@PK";
      using (SqlCommand cmd = new SqlCommand(_sql, cn))
      {
           cmd.Parameters.Clear();
           cmd.Parameters.AddWithValue("@PK", PK);
           //cmd.ExecuteNonQuery();
           using (SqlDataAdapter da = new SqlDataAdapter(cmd))
           {
               dt.BeginLoadData();
               da.Fill(dt);
           }

      }
        
        cn.Close();

2019年9月17日

C# 如何 Excel 轉成 DataTable ?

在同一資料夾下,可以這樣讀取 .xls

    DataTable dt = new DataTable();
    string filename = Server.MapPath(@"test.xls");
    dt = ConvertExcelToDataTable(filename);

    public static DataTable ConvertExcelToDataTable(string FileName)
    {
        System.Data.DataTable dtResult = null;
        int totalSheet = 0; //No of sheets on excel file  
        using (OleDbConnection objConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;';"))
        {
            objConn.Open();
            OleDbCommand cmd = new OleDbCommand();
            OleDbDataAdapter oleda = new OleDbDataAdapter();
            DataSet ds = new DataSet();
            System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            string sheetName = string.Empty;
            if (dt != null)
            {
                var tempDataTable = (from dataRow in dt.AsEnumerable()
                                     where !dataRow["TABLE_NAME"].ToString().Contains("FilterDatabase")
                                     select dataRow).CopyToDataTable();
                dt = tempDataTable;
                totalSheet = dt.Rows.Count;
                sheetName = dt.Rows[0]["TABLE_NAME"].ToString();
            }
            cmd.Connection = objConn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
            oleda = new OleDbDataAdapter(cmd);
            oleda.Fill(ds, "excelData");
            dtResult = ds.Tables["excelData"];
            objConn.Close();
            return dtResult; //Returning Dattable  
        }
    }

2019年9月2日

C# JSON、XML、CSV 轉換成 DataTable 使用 WebClient 取得資料。

範例連接檔,需自行修改「紅色字」部分:

CSV檔:
https://societydata.taichung.gov.tw/System/DataSetDownload.aspx?idf=387120000J-000027&folder=RFXQ40397EQFQ49011&datadate=2015-07-01&format=CSV

JSON檔:
https://societydata.taichung.gov.tw/System/DataSetDownload.aspx?idf=387120000J-000027&folder=RFXQ40397EQFQ49011&datadate=2015-01-01&format=JSON

XML檔:
https://societydata.taichung.gov.tw/System/DataSetDownload.aspx?idf=387120000J-000027&folder=RFXQ40397EQFQ49011&datadate=2015-07-01&format=XML

這個範例只能用在「JSON、XML」為一層的狀態下。因為,JSON、XML可以很多層進行資料的編寫。

using System;
using System.Linq;
using System.Text;
using System.Web;
using System.Data;
using System.Xml;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

string s = "";
        DataTable dt = new DataTable();
        using (WebClient wc = new WebClient())
        {
            try
            {
                wc.Encoding = Encoding.UTF8;
                string url = "https://societydata.taichung.gov.tw/System/DataSetDownload.aspx?idf=387120000J-000027&folder=RFXQ40397EQFQ49011&datadate=2015-07-01&format=CSV";

                byte[] b = wc.DownloadData(url);
                s = Encoding.UTF8.GetString(b);

                dt = CsvStringToDataTable(s);
                //dt = JsonStringToDataTable(s);
                //dt = XmlStringToDataTable(s);
            }
            catch (WebException ex)
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write(ex.Message.ToString());
            }
        }
        context.Response.ContentType = "text/plain";
        context.Response.Write("資料數量:" + dt.Rows.Count);



============  function
    /// <summary>
    /// Json To DataTable
    /// </summary>
    /// <param name="json"></param>
    /// <returns></returns>
    public DataTable JsonStringToDataTable(string s)
    {
        var jsonLinq = JObject.Parse(s);
        var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
        var trgArray = new JArray();
        foreach (JObject row in srcArray.Children<JObject>())
        {
            var cleanRow = new JObject();
            foreach (JProperty column in row.Properties())
            {
                if (column.Value is JValue)
                {
                    cleanRow.Add(column.Name, column.Value);
                }
            }

            trgArray.Add(cleanRow);
        }

        return JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
    }

    /// <summary>
    /// XML To DataTable
    /// </summary>
    /// <param name="Xmlstring"></param>
    /// <returns></returns>
    public DataTable XmlStringToDataTable(string s)
    {

        XmlDocument Xmldoc = new XmlDocument();
        Xmldoc.LoadXml(s);
        XmlReader Xmlreader = XmlReader.Create(new System.IO.StringReader(Xmldoc.OuterXml));
        DataSet ds = new DataSet();
        ds.ReadXml(Xmlreader);
        DataTable dt = ds.Tables[0];
        return dt;
    }

    /// <summary>
    /// CSV To DataTable
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static DataTable CsvStringToDataTable(string s)
    {
        DataTable dt = new DataTable();

        string[] tableData = s.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        var col = from cl in tableData[0].Split(",".ToCharArray())
                  select new DataColumn(cl);
        dt.Columns.AddRange(col.ToArray());

        (from st in tableData.Skip(1)
         select dt.Rows.Add(st.Split(",".ToCharArray()))).ToList();
        return dt;
    }

2019年8月29日

C# HTML 轉 PDF 使用 SelectPdf

       因為需要做一個在C#使用 HTML 轉 Pdf 的功能找了好多工具,如 iTextSharp、IronPdf...等,但我發現另一個不錯用的工具 SelectPDF,重點是他有詳細的使用說明文件程式碼 

https://selectpdf.com/demo/   

https://selectpdf.com/demo/convert-html-code-to-pdf.aspx 

,可以支援我想要的 HTML To Pdf,而且還需要支援中文。








       

        如果使用呢?可以在方案總管按右鍵選擇 管理NuGet套件」,在 瀏覽搜尋 「SelectPDF」 ,因為,我是要HtmlToPdf功能,所以,我只安裝了「Select.HtmlToPdf」 ,安裝成功後,就可以在Bin資料夾看到一個dlldep檔。




程式碼:

using SelectPdf;


string iHtml = "寫入HTML";//看您想寫什麼HTML

string fileNameWithOutExtention = Guid.NewGuid().ToString();

 HtmlToPdf converter = new HtmlToPdf();

 PdfDocument doc = converter.ConvertHtmlString(iHtml);
 doc.Save(@"D:\" + fileNameWithOutExtention + @".pdf"); //假設要把檔案存在 D 糟

 // close pdf document 
 doc.Close();


就是這麼簡單。



2019年7月31日

C# 使用 DataTable 轉 Json 資料量太大發生 「已發生類型 'System.OutOfMemoryException' 的例外狀況。」


使用 DataTable 轉 Json 資料量太大發生 「已發生類型 'System.OutOfMemoryException' 的例外狀況。」


程式碼:
using Newtonsoft.Json;

DataTable dt = ReadCSV(@"D:\test.csv");
File.WriteAllText(@"D:\test.json", JsonConvert.SerializeObject(dt));







沒效能的解決方式:

Visual Studio >> 工具 >>  選項  >> 專案和方案  >> Web 專案  >> 將 64 位元版本的 IIS Express 用於網站和專案 >> 打勾。







參考資料:https://blog.darkthread.net/blog/json-big-object/

2018年10月11日

C# 坐標系統轉換,以 EPSG:26985 轉 EPSG:4326 為例

我打算使用 Proj4 來進行坐標系統轉換。
首先,要找到 26985 和 4326 坐標系統的 Proj4


26985 Proj4:
+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs


4326 Proj4:
+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs


然後,參考這篇的寫法,但有個小地方要修改請加上 @
string proj4_ed50 = @"+proj=longlat
       +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +no_defs";
string proj4_rdnew = @"+proj=sterea +lat_0=52.15616055555555
       +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel
       +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs";



參考資料:

2018年9月26日

PostgreSQL 連線,存取資料方式。使用 C# WinFrom


NuGet 安裝 Npgsql。 (圖1)

圖1



        NuGet 安裝 Npgsql。(圖2)


圖2


安裝成功後,「參考」會有 Npgsql(圖3)
圖3

使用 ConfigurationManager 需加入 System.configuration 至「參考」 (圖4)

圖4


======= 程式範例 回傳 DataTable

       public static DataTable Npgsql_Data(String sql)
       {
           //參考資料
           //https://www.npgsql.org/doc/index.html
           String connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

           DataTable dt = new DataTable();
           using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(connstr))
           {
               conn.Open();
               using (var cmd = new Npgsql.NpgsqlCommand())
               {
                   cmd.Connection = conn;
                   cmd.CommandText = sql;
                   //執行不Query的方式
                   //cmd.ExecuteNonQuery();
                   Npgsql.NpgsqlDataReader dr = cmd.ExecuteReader();
                   dt.Load(dr);
               }
           }

           return dt;

       }


======= 程式範例 回傳 bool

       public static bool Npgsql_Data(String sql,String id,String value,String point)
       {
           bool success = false;
           //https://www.npgsql.org/doc/index.html
           String connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

           DataTable dt = new DataTable();
           using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(connstr))
           {
               conn.Open();
               using (var cmd = new Npgsql.NpgsqlCommand())
               {
                   cmd.Connection = conn;
                   cmd.CommandText = sql;
                   cmd.Parameters.AddWithValue("id", id);
                   cmd.Parameters.AddWithValue("value", value);
                   cmd.Parameters.AddWithValue("point", point);
                   if(cmd.ExecuteNonQuery() > 0)
                   {
                       success = true;
                   }else
                   {
                       success = false;
                   }
                   
               }
               
           }
           return success;
       }

2017年12月6日

C# 如何建立 WebService 利用取得的 XML 檔案後,傳發成XML送出,以 Open Data 資料為例!

範例: https://data.gov.tw/dataset/68186

通常,我們抓到的資料可能是下載實體檔的狀態。

但如果您希望做個 WebService 給別人直接讀取接收回來的字串該怎麼做?

如果,XML檔,有中文字又該怎麼讓它不會有亂碼呢?




        /// <summary>
        /// 讀取 url 檔案並轉成 String
        /// </summary>
        /// <param name="url">Open Data url</param>
        /// <returns></returns>
        public static String ReadXmlFile(String url)
        {

            var request = WebRequest.Create(url) as HttpWebRequest;
            var response = request.GetResponse();

            Stream receiveStream = response.GetResponseStream();
            StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

            var result = readStream.ReadToEnd();
            return result;

        }


2014年5月29日

AJAX - Send a Request To a Server example

====================  javascript =======================
function createXMLHttpRequest() {
     try { return new XMLHttpRequest(); } catch (e) { }
     try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { }
     try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { }
           alert("XMLHttpRequest not supported");
         return null;
}


var xmlHttpReq = createXMLHttpRequest();
xmlHttpReq.open("GET", "http://...網址?CIDS="+pics, false);
xmlHttpReq.send(null);
if (xmlHttpReq.responseText == "1")
{
    
}
====================  ashx =======================
using System;
using System.Web;

public class SaveReleasePic : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
            context.Response.ContentType = "text/plain";
            context.Response.Write("1");
      
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

2014年5月3日

DataTable 轉 Json,利用ashx回傳入HTML5 C#

在寫 HTML5 時,因為,需要利用 ashx 回傳 Json 字串,但如果自已寫一個 function 是不是太不方便了?

ASP.NET,其實有一個 Newtonsoft.Json.dll 可以使用,但您的VS 2010、2012也許是沒有這個dll檔案,但我建立可以利用 NuGet 來下載

但NuGet又是如何安裝?我覺得可以參考以下的連結

http://blog.miniasp.com/post/2011/05/17/Useful-Visual-Studio-2010-tool-NuGet-Package-Manager.aspx

安裝完後,可以打開 工具 >> NuGet 套件管理員 >> 套件管理器主控台



打開「主控台」後,會出現下圖:



請在 PM> 後面輸入

Install-Package Newtonsoft.Json

這樣您的 Bin 就會自動加入 Newtonsoft.Json.dll

接下來,就可以利用下面的範例:回傳至 HTML5 Client 端

using System;
using System.Web;

/*Json.NET相關的命名空間,請使用NuGet*/
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class GetKS_TOWN : IHttpHandler {
 
    public void ProcessRequest (HttpContext context) {
        DBTools dbtools = new DBTools();
        System.Data.DataTable getLandName = dbtools.GetKS_TOWN();

        //將DataTable轉成JSON字串
        string str_json = JsonConvert.SerializeObject(getLandName, Formatting.Indented);

        context.Response.ContentType = "text/plain";
        context.Response.Write(str_json);
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

以上,試試看吧!