2022年10月27日 星期四

常用T-SQL語法

 --若有大批新增或修改資料,建議執行更新統計資料和更新資料列計數,以避免查詢資料會有效能緩慢的問題

--參考資料網站http://msdn.microsoft.com/en-us/library/ms174384.aspx

--更新單一桶資料庫統計資料

USE 資料庫名稱;

GO

EXEC sp_updatestats;

GO

--參考資料網站http://msdn.microsoft.com/en-us/library/ms187348.aspx

--更新單一資料表統計資料

USE 資料庫名稱;

GO

UPDATE STATISTICS 資料表名稱;

GO


--參考資料網站http://msdn.microsoft.com/en-us/library/ms188414.aspx

--參考資料網站http://msdn.microsoft.com/zh-tw/library/ms188414.aspx

--更新單一資料庫中所有物件的資料列計數(Updating page or row counts or both for all objects in the current database)

USE 資料庫名稱;

GO

DBCC UPDATEUSAGE (0);

GO

--更新某一資料表的資料列計數(Updating page or row count information for a table)

USE 資料庫名稱;

GO

DBCC UPDATEUSAGE ('資料庫名稱','資料表名稱');

GO

--更新某一資料表的索引頁面或資料列計數,可透過EXEC sp_help '資料表名稱';取得索引名稱

USE 資料庫名稱;

GO

DBCC UPDATEUSAGE ('資料庫名稱','資料表名稱','索引名稱');

GO


 


--顯示或變更目前伺服器執行個體的全域組態設定

sp_configure 'show advanced options',1;--設定顯示進階選項,預設為 0

GO

RECONFIGURE WITH OVERRIDE;--使用RECONFIGURE使系統使用新的設定值,當使用 RECONFIGURE WITH OVERRIDE 時,請特別小心。

GO

--RECONFIGURE 和 RECONFIGURE WITH OVERRIDE 都會使用每個組態選項。

--不過,基本 RECONFIGURE 陳述式會拒絕在合理範圍之外或可能造成選項衝突的任何選項值。

--例如,如果 recovery interval 值超出 60 分鐘,或 affinity mask 值與 affinity I/O mask 值重疊,RECONFIGURE 就會產生錯誤。

--相對地,RECONFIGURE WITH OVERRIDE 會接受任何資料類型正確的選項值,且會強迫利用指定的值來重設組態。


sp_configure 'max degree of parallelism',8;--設定執行單一陳述式所要採用8個處理器。

GO

RECONFIGURE WITH OVERRIDE;--使用RECONFIGURE使系統使用新的設定值,當使用 RECONFIGURE WITH OVERRIDE 時,請特別小心。

GO

--若要讓伺服器判斷平行處理原則的最大程度,請將此選項設定為 0 (預設值)。

--將平行處理原則的最大程度設定為 0 就會允許 SQL Server 使用所有可用的處理器 (最多 64 個處理器)。

--若要抑制平行計畫的產生,請將 max degree of parallelism 設成 1。

--將這個值設成大於 1 的數字 (最大值 64),則會限制單一查詢執行所使用的最大處理器個數。

--如果指定的數值大於可用的處理器數目,就會使用可用處理器的實際數目。

--如果電腦只有一個處理器,則會忽略 max degree of parallelism 值。

--您可以在查詢陳述式中指定 MAXDOP 查詢提示,藉以覆寫查詢中的 max degree of parallelism 值。


--檢查資料結構(check the database structure)

USE 資料庫名稱;

GO

DBCC CHECKFILEGROUP;

GO

DBCC CHECKALLOC;

GO

DBCC CHECKTABLE ('資料表名稱'); --Checks the integrity of all the pages and structures that make up the table or indexed view

GO

DBCC CHECKDB('資料庫名稱')--To perform DBCC CHECKTABLE on every table in the database, use DBCC CHECKDB.

GO


--顯示統計資訊內容

DBCC SHOW_STATISTICS('資料表名稱','統計資訊名稱');

GO

-- 或

DBCC SHOW_STATISTICS('資料表名稱',統計資訊名稱);

GO

--備註:如何取得統計資訊名稱

--統計資訊名稱包含索引鍵和主鍵名稱,還有系統預設資料表統計資訊

--假如一個資料表myTable有索引鍵IX_indexkey001、資料主鍵PK_primary001

--那麼要顯示IX_indexkey001的統計資訊可執行DBCC SHOW_STATISTICS('myTable','IX_indexkey001');


 


--刪除統計資訊

DROP STATISTICS 資料表名稱.統計資訊名稱;

GO


--顯示資料庫資訊

EXEC SP_HELPDB; --列出資料庫Instance中所有資料庫的資訊

GO

EXEC SP_HELPDB 資料庫名稱; --指令資料庫名稱可以獲得單一資料庫詳細資料

GO

EXEC SP_DATABASES; --顯示資料庫Instance中所有資料庫的使用磁碟空間大小

GO


--使用SP_SPACEUSED顯示資料列的數目、所保留的磁碟空間和資料表所用的磁碟空間、索引檢視,

--或目前資料庫中的 Service Broker 佇列,或顯示整個資料庫所保留和使用的磁碟空間。

--當您卸除或重建大型索引時,或卸除或截斷大型資料表時,

--Database Engine 會延遲取消配置實際的頁面及其相關聯鎖定,直到認可交易之後。

--延遲的卸除作業並不會立即釋出已配置的空間。

--因此,在卸除或截斷大型物件之後,sp_spaceused 立即傳回的值不一定能反映實際可用的磁碟空間。

--參考資料網站http://msdn.microsoft.com/zh-tw/library/ms188776.aspx

USE 資料庫名稱;

GO

EXEC SP_SPACEUSED;--顯示目前資料庫所用的磁碟空間

GO

EXEC SP_SPACEUSED '資料表';--顯示目前資料表所用的磁碟空間

GO

EXEC SP_SPACEUSED @updateusage = N'TRUE';--指出應該執行 DBCC UPDATEUSAGE 來更新空間使用方式資訊

GO


--顯示資料庫相關資訊

SELECT * FROM master.dbo.sysdatabases;--列出所有資料庫

GO

SELECT * FROM master.dbo.sysxlogins;--列出所有登入帳戶,只適用於SQLServer 2000

GO

SELECT * FROM master.dbo.sysprocesses;--列出目前Instance中的連線資訊

GO

SELECT * FROM master.dbo.sysservers;--列出目前每個連結或已註冊的遠端伺服器,各包含一個資料列,以及含有一個資料列代表 server_id = 0 的本機伺服器。

GO

SELECT * FROM master.dbo.sysconfigures; --列出SQL Server Instance設定,同執行sp_configure相同

GO

EXEC sp_configure --同執行 SELECT * FROM sysconfigures

GO

--查詢使用者自定資料庫

SELECT name AS 'DATABASENAME' FROM master.dbo.sysdatabases

WHERE name NOT IN ('master','model','msdb','tempdb','distrbution')

ORDER BY 1;

GO


--顯示單一資料庫的資訊,在每一桶資料庫中皆有下列系統資料表

SELECT * FROM sysfiles;--顯示該桶資料庫資料檔與交易紀錄檔案資訊,詳細資訊可使用EXEC SP_HELPDB 資料庫名稱;

GO

SELECT * FROM sysfilegroups;--顯示該桶資料庫的檔案群組

GO

SELECT * FROM sysobjects;--顯示該桶資料庫裏面所有物件,如資料表、檢視表、預儲程序、使用者自定函式

GO

SELECT * FROM syscolumns;--顯示該桶資料庫所有資料表的欄位

GO

SELECT * FROM sysindexes;--顯示該桶資料庫所有Index

GO

SELECT * FROM sysusers;--顯示該桶資料庫的使用者

GO

--當下連線資料庫的使用者權限

SELECT * FROM syspermissions;--顯示該桶資料庫的使用者權限

GO


--顯示資料庫物件資訊

--參考資料網站http://msdn.microsoft.com/en-us/library/ms187335.aspx

EXEC sp_help;--列出所有資料庫物件

GO

--列出資料表的資訊

USE 資料庫名稱;

GO

EXEC sp_help '資料表名稱';

GO


----[以下指令SQL SERVER 2005 以上版本才可以使用]----

SELECT * FROM sys.databases;--列出Instance中所有使用者自定的資料庫metadata,SQLServer 2005版本以上適用

GO

SELECT * FROM sys.sysdatabases;--列出Instance中所有系統資料庫metadata,SQLServer 2005版本以上適用

GO


 


--估計執行壓縮後,資料表的大小

EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, 'ROW' ;--估計 Production.WorkOrderRouting 資料表的大小 (如果使用 ROW 壓縮來將它壓縮)。

GO

EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, 'PAGE' ;--估計 Production.WorkOrderRouting 資料表的大小 (如果使用 PAGE 壓縮來將它壓縮)。

GO


 


--壓縮資料表

ALTER TABLE Production.WorkOrderRouting REBUILD WITH (DATA_COMPRESSION=ROW);--使用ROW壓縮Production.WorkOrderRouting資料表(Enable row compression on the Production.WorkOrderRouting table)

GO

ALTER TABLE Production.WorkOrderRouting REBUILD WITH (DATA_COMPRESSION=PAGE);--使用PAGE壓縮Production.WorkOrderRouting資料表(Enable page compression on the Production.WorkOrderRouting table)

GO


 



--The following example returns information for all tables and indexes within the instance of SQL Server. Executing this query requires VIEW SERVER STATE permission.

SELECT * FROM sys.dm_db_index_operational_stats(DB_ID(N'QuantamCorp'), OBJECT_ID(N'QuantamCorp.Production.WorkOrderRouting'), NULL, NULL);--回傳QuantamCorp.Production.WorkOrderRouting資料表的資料表與索引資訊

GO

SELECT * FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL);--回傳所有資料表與索引資訊(Returning information for all tables and indexes)

GO


 


--參考資料網站http://technet.microsoft.com/zh-tw/library/ms176013.aspx

--針對 SQL Server 上經過驗證的各個工作階段傳回一個資料列。

--sys.dm_exec_sessionssys.dm_exec_sessions 是伺服器範圍檢視表,

--會顯示所有作用中使用者連接和內部工作的相關資訊。

--這個資訊包含用戶版本、用戶程式名稱、用戶登錄時間、登錄使用者、目前工作階段設定、還有更多。

--使用 sys.dm_exec_sessions 來首先檢視目前系統載入及定義感興趣的工作階段,

--然後以使用其他動態管理檢視或動態管理函式來學習更多關於工作階段的資訊。

--sys.dm_exec_connections、sys.dm_exec_sessions 和 sys.dm_exec_requests 動態管理檢視對應到 sys.sysprocesses 系統資料表。

SELECT * FROM sys.dm_exec_sessions;--回傳各個工作階段

GO


--參考資料網站http://technet.microsoft.com/zh-tw/library/ms181509

--傳回有關與這個 SQL Server 執行個體建立之連接及每一個連接之詳細資料的資訊。

SELECT * FROM sys.dm_exec_connections;--回傳執行個體建立之連接及每一個連接之詳細資料的資訊

GO


--參考資料網站http://technet.microsoft.com/zh-tw/library/ms177648

--傳回在 SQL Server 內部執行之每個要求的相關資訊。

SELECT * FROM sys.dm_exec_requests;--回傳內部執行之每個要求的相關資訊

GO


--參考資料網站http://technet.microsoft.com/zh-tw/library/ms181929

--傳回 SQL 陳述式的文字以及前五項查詢的平均 CPU 時間。

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],

SUBSTRING(st.text, (qs.statement_start_offset/2)+1,

((CASE qs.statement_end_offset

WHEN -1 THEN DATALENGTH(st.text)

ELSE qs.statement_end_offset

END - qs.statement_start_offset)/2) + 1) AS statement_text

FROM sys.dm_exec_query_stats AS qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

ORDER BY total_worker_time/execution_count DESC;

GO

--傳回以批次方式執行的 SQL 查詢之文字並提供有關這些查詢的統計資訊。

SELECT s2.dbid,

s1.sql_handle,

(SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,

((CASE WHEN statement_end_offset = -1

THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)

ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement,

execution_count,plan_generation_num,last_execution_time,

total_worker_time,last_worker_time,min_worker_time,

max_worker_time,total_physical_reads,last_physical_reads,

min_physical_reads,max_physical_reads,total_logical_writes,

last_logical_writes,min_logical_writes,max_logical_writes

FROM sys.dm_exec_query_stats AS s1

CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2

WHERE s2.objectid is null

ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset;

GO


--參考資料網站http://technet.microsoft.com/zh-tw/library/ms189741

--傳回平均 CPU 時間之前五項查詢的相關資訊。 此範例會根據查詢雜湊彙總查詢,讓邏輯上相同的查詢能夠依據其累計資源耗用量進行分組。

USE AdventureWorks2012;

GO

SELECT TOP 5 query_stats.query_hash AS "Query Hash",

SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",

MIN(query_stats.statement_text) AS "Statement Text"

FROM

(SELECT QS.*,

SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,

((CASE statement_end_offset

WHEN -1 THEN DATALENGTH(ST.text)

ELSE QS.statement_end_offset END

- QS.statement_start_offset)/2) + 1) AS statement_text

FROM sys.dm_exec_query_stats AS QS

CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats

GROUP BY query_stats.query_hash

ORDER BY 2 DESC;

GO

--傳回查詢的資料列計數彙總資訊 (資料列總數、最小資料列數目、最大資料列數目及上次傳回的資料列數目)。

SELECT qs.execution_count,

SUBSTRING(qt.text,qs.statement_start_offset/2 +1,

(CASE WHEN qs.statement_end_offset = -1

THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2

ELSE qs.statement_end_offset end -

qs.statement_start_offset

)/2

) AS query_text,

qt.dbid, dbname= DB_NAME (qt.dbid), qt.objectid,

qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows

FROM sys.dm_exec_query_stats AS qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt

WHERE qt.text like '%SELECT%'

ORDER BY qs.execution_count DESC;

GO


--參考資料網站http://technet.microsoft.com/zh-tw/library/cc280701

--傳回平均經過時間所識別之前 10 項預存程序的相關資訊。

SELECT TOP 10 d.object_id, d.database_id, OBJECT_NAME(object_id, database_id) 'proc name',

d.cached_time, d.last_execution_time, d.total_elapsed_time, d.total_elapsed_time/d.execution_count AS [avg_elapsed_time],

d.last_elapsed_time, d.execution_count

FROM sys.dm_exec_procedure_stats AS d

ORDER BY [total_worker_time] DESC;

GO


--設定資料庫自動更新統計資訊、建立統計資訊、更新統計資訊為非同步更新(Enable auto update statistics, auto create statistics, and auto update statistics async)

ALTER DATABASE 資料庫名稱 SET AUTO_UPDATE_STATISTICS ON,

AUTO_CREATE_STATISTICS ON,

AUTO_UPDATE_STATISTICS_ASYNC ON;

GO


--縮減資料庫檔案大小(shrink a file and a database)

--利用將資料庫設為簡易模式來壓縮資料記錄檔(Truncate the log by changing the database recovery model to SIMPLE.)

ALTER DATABASE 資料庫名稱 SET RECOVERY SIMPLE;

GO

DBCC SHRINKFILE (QuantamCorp_Log,1);--指定記錄檔壓縮截斷到1MB的檔案大小(Shrink the truncated log file to 1 MB.)

GO

ALTER DATABASE QuantamCorp SET RECOVERY FULL;--將資料庫設為完整模式 (Reset the database recovery model.)

GO


 


USE QuantamCorp;

GO

SELECT file_id, name FROM sys.database_files;--取出資料庫檔案代碼與名稱

GO

DBCC SHRINKFILE (1,TRUNCATEONLY);

GO

DBCC SHRINKDATABASE (QuantamCorp,TRUNCATEONLY);

GO


--列出資料表

USE 資料庫名稱;

SELECT * FROM INFORMATION_SCHEMA.TABLES;

GO

SELECT * FROM sys.syslogins;--列出所有登入帳戶,只適用於SQLServer 2005以上版本

GO

2022年10月3日 星期一

vb.net form 覆蓋工作列

Me.Top = 0

Me.Left = 0

Me.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height

Me.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width

2022年9月26日 星期一

vbnet Newtonsoft.Json DataTable 互轉

 序列化:

Dim dataSet As dataSet = New DataSet("dataSet")

dataSet.[Namespace] = "NetFrameWork"

Dim table As New DataTable()

Dim idColumn As New DataColumn("id", GetType(Integer))

idColumn.AutoIncrement = True

Dim itemColumn As New DataColumn("item")

table.Columns.Add(idColumn)

table.Columns.Add(itemColumn)

dataSet.Tables.Add(table)

Dim i As Integer = 0

While i < 2

Dim newRow As DataRow = table.NewRow()

newRow("item") = "item " + i

table.Rows.Add(newRow)

i += 1

End While

dataSet.AcceptChanges()

Dim json As String = JsonConvert.SerializeObject(dataSet, Formatting.Indented)


反序列:

Dim json As String = IO.File.ReadAllText(HttpContext.Current.Server.MapPath("~/Data.json"))

Dim dt As New System.Data.DataTable

dt = Newtonsoft.Json.JsonConvert.DeserializeObject(Of DataTable)(json)


2022年9月13日 星期二

蝦皮超商單列印

 蝦皮超商單列印


依據平台單號,自動列印:

五大超商的出貨單:萊爾富,OK,蝦皮OK,7-11,全家


採用標籤機 : ZDesigner GT800-300dpi EPL

紙張大小 : 10x15  

邊界: 左,右,上,下--> 0,0,0,0


目前系統能:依據蝦皮產出的Excel自動匯入系統

1.客戶資料

2.訂單作業

3.檢貨作業 (自動產出下單的訂單的撿貨單,進行撿貨作業)

4.出貨作業 (依撿貨單打包封箱貼超商單(退貨取消訂單)

5.確定出貨寄出轉歷史出貨作業 (供備查)


未來將打造全新:蝦皮專用ERP系統

目標:

採用全新自動讀取蝦皮賣場的訂單

只要在ERP系統內操作,即可異動蝦皮平台的訂單

不需再2邊忙,只需要1邊忙即可完全出貨並寄出


歡迎有興趣的,請電洽或LINE [池龍工作室]







2022年9月7日 星期三

VS2019 視窗設計界面不見,解決方法

 VS2019 視窗設計界面不見,解決方法

最近開始碰到從未遇過的問題(如下圖)







這樣根本無法打開視窗界面來設計

解決方式

將打開的VB 程式檔,全選後剪下(清空)後,存檔






再貼回去原本的程式碼,再[存檔]並關掉 form1.vb檔

此實專案內的form1圖示已變更[視窗設計]圖示

表示可以正常了




2022年8月28日 星期日

form not movable

 form not movable


public partial class Form1 : Form

{

    Point defaultLocation;


    public Form1()

    {

        InitializeComponent();

        defaultLocation = this.Location;

    }


    private void Form1_Move(object sender, EventArgs e)

    {

        this.Location = defaultLocation;

    }

}


2022年8月24日 星期三

Printing a Bit map image to pos printer via comport

 Printing a Bit map image to pos printer via comport in C# [closed]

--

private void button1_Click(object sender, EventArgs e)

{

 SerialPort port = new SerialPort("com6", 9100, Parity.None, 8, StopBits.One);

 port.Open();

 ASCIIEncoding ascii = new ASCIIEncoding();

 port.Write(ascii.GetString(new byte[] { 28, 112, 1, 0})); //Printing the Above uploaded Logo

 port.WriteLine("Your Text");

 port.Close();

}


--

或另外的方法:


 public string GetLogo()

    {

        string logo = "";

        if (!File.Exists(@"C:\bitmap.bmp"))

            return null;

         BitmapData data = GetBitmapData(@"C:\bitmap.bmp");

         BitArray dots = data.Dots;

         byte[] width = BitConverter.GetBytes(data.Width);


         int offset = 0;

         MemoryStream stream = new MemoryStream();

         BinaryWriter bw = new BinaryWriter(stream);


         bw.Write((char)0x1B);

         bw.Write('@');


         bw.Write((char)0x1B);

         bw.Write('3');

         bw.Write((byte)24);


         while (offset < data.Height)

         {

             bw.Write((char)0x1B);

             bw.Write('*');         // bit-image mode

             bw.Write((byte)33);    // 24-dot double-density

             bw.Write(width[0]);  // width low byte

             bw.Write(width[1]);  // width high byte


             for (int x = 0; x < data.Width; ++x)

             {

                 for (int k = 0; k < 3; ++k)

                 {

                     byte slice = 0;

                     for (int b = 0; b < 8; ++b)

                     {

                         int y = (((offset / 8) + k) * 8) + b;

                         // Calculate the location of the pixel we want in the bit array.

                         // It'll be at (y * width) + x.

                         int i = (y * data.Width) + x;


                         // If the image is shorter than 24 dots, pad with zero.

                         bool v = false;

                         if (i < dots.Length)

                         {

                             v = dots[i];

                         }

                         slice |= (byte)((v ? 1 : 0) << (7 - b));

                     }


                     bw.Write(slice);

                 }

             }

             offset += 24;

             bw.Write((char)0x0A);

         }

         // Restore the line spacing to the default of 30 dots.

         bw.Write((char)0x1B);

         bw.Write('3');

         bw.Write((byte)30);


         bw.Flush();

         byte[] bytes = stream.ToArray();

         return logo + Encoding.Default.GetString(bytes);

    }


    public BitmapData GetBitmapData(string bmpFileName)

    {

        using (var bitmap = (Bitmap)Bitmap.FromFile(bmpFileName))

        {

            var threshold = 127;

            var index = 0;

            double multiplier = 570; // this depends on your printer model. for Beiyang you should use 1000

            double scale = (double)(multiplier/(double)bitmap.Width);

            int xheight = (int)(bitmap.Height * scale);

            int xwidth = (int)(bitmap.Width * scale);

            var dimensions = xwidth * xheight;

            var dots = new BitArray(dimensions);


            for (var y = 0; y < xheight; y++)

            {

                for (var x = 0; x < xwidth; x++)

                {

                    var _x = (int)(x / scale);

                    var _y = (int)(y / scale);

                    var color = bitmap.GetPixel(_x, _y);

                    var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);

                    dots[index] = (luminance < threshold);

                    index++;

                }

            }


            return new BitmapData()

            {

                Dots = dots,

                Height = (int)(bitmap.Height*scale),

                Width = (int)(bitmap.Width*scale)

            };

        }

    }


    public class BitmapData

    {

        public BitArray Dots

        {

            get;

            set;

        }


        public int Height

        {

            get;

            set;

        }


        public int Width

        {

            get;

            set;

        }

    }

2022年8月1日 星期一

條件判斷:排除中文,只抓英文數字

 --抓英文或數字(過濾中文和符號)


Select * From [TableName] Where [ColumnName1] Not Like '%[^A-Za-z0-9]%'


其實單就這方面看起來,就淺顯易懂了

[^A-Za-z0-9] <==這部分就是所謂的不等於A-Za-z0-9的字元

此時再加個Not就是所謂的"不等於的不等於" 就是代表資料只能有A-Za-z0-9的字元

XML的建立與讀取

'建立XML

Imports System.Xml

'建立XML

Private Sub CreateXML()

Dim xdoc As XmlDocument

Dim xElement As XmlElement

Dim xChildElement As XmlElement

Dim xElement2 As XmlElement

Dim xChildElement2 As XmlElement

Try

'建立一個 XmlDocument 物件並加入 Declaration

xdoc = New XmlDocument

xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "UTF-8", "yes"))

'建立根節點物件並加入 XmlDocument 中 (第0層)

xElement = xdoc.CreateElement("sections")

'在sections寫入一個屬性

xElement.SetAttribute("data_name", "部門人員資訊")

xdoc.AppendChild(xElement)

'在sections下寫入一個節點名稱為section(第1層)

xChildElement = xdoc.CreateElement("section")

xChildElement.SetAttribute("department", "人資部")

xChildElement.SetAttribute("department_code", "2200")

xElement.AppendChild(xChildElement)

'第2層節點

xElement2 = xdoc.CreateElement("users")

xChildElement.AppendChild(xElement2)

'第3層節點

xChildElement2 = xdoc.CreateElement("user")

xChildElement2.SetAttribute("Name", "孫小美")

xChildElement2.SetAttribute("Year", "16")

xChildElement2.SetAttribute("Sex", "女")

xElement2.AppendChild(xChildElement2)

'在sections下寫入一個節點名稱為section(第1層)

xChildElement = xdoc.CreateElement("section")

xChildElement.SetAttribute("department", "資訊部")

xChildElement.SetAttribute("department_code", "3100")

xElement.AppendChild(xChildElement)

'第2層節點

xElement2 = xdoc.CreateElement("users")

xChildElement.AppendChild(xElement2)

'第3層節點

xChildElement2 = xdoc.CreateElement("user")

xChildElement2.SetAttribute("Name", "張寶成")

xChildElement2.SetAttribute("Year", "23")

xChildElement2.SetAttribute("Sex", "男")

xElement2.AppendChild(xChildElement2)

xChildElement2 = xdoc.CreateElement("user")

xChildElement2.SetAttribute("Name", "蕭瀟瀟")

xChildElement2.SetAttribute("Year", "26")

xChildElement2.SetAttribute("Sex", "男")

xElement2.AppendChild(xChildElement2)

xdoc.Save("C:\Users\Desktop\XML_Create.xml")

Catch ex As Exception

MessageBox.Show(ex.Message & System.Environment.NewLine & ex.StackTrace)

End Try

End Sub

其中XML的內容在生成後長成這樣

==================================================

<?xml version="1.0"encoding="UTF-8"standalone="yes"?>

<sections data_name="部門人員資訊">

  <section department="人資部"department_code="2200">

    <users>

      <user Name="孫小美" Year="16"Sex="女" />

    </users>

  </section>

  <section department="資訊部"department_code="3100">

    <users>

      <user Name="張寶成"Year="23"Sex="男" />

      <user Name="蕭瀟瀟"Year="26"Sex="男" />

    </users>

  </section>

</sections>

==================================================

'讀取XML

Private Sub LoadXML()

Dim xdoc As XmlDocument = New XmlDocument

Dim xRoot As XmlNode

Dim xNodeList As XmlNodeList

Dim xNodeTemp As XmlNode

Dim xUsersNode As XmlNode

Dim xUserNodeList As XmlNodeList

Dim xUserNode As XmlNode

Dim xElement As XmlElement

Try

'讀取XML

xdoc.Load("C:\Users\Desktop\XML_Create.xml")

xRoot = CType(xdoc.DocumentElement, XmlNode)

'選擇section

xNodeList = xRoot.SelectNodes("section[@department!='' and @department_code='3100']")

For intI As Integer = 0 To xNodeList.Count - 1

xNodeTemp = xNodeList.Item(intI)

'取得節點[users]

xUsersNode = xNodeTemp.SelectSingleNode("users")

'取得[user]Name有值的節點

xUserNodeList = xUsersNode.SelectNodes("user[@Name!='']")

For intJ As Integer = 0 To xUserNodeList.Count - 1

xUserNode = xUserNodeList.Item(intJ)

xElement = CType(xUserNode, XmlElement)

Console.Write("姓名:" & xElement.GetAttribute("Name"))

Console.WriteLine()

Console.Write("年齡:" & xElement.GetAttribute("Year"))

Console.WriteLine()

Console.Write("性別:" & xElement.GetAttribute("Sex"))

Console.WriteLine()

Next

Next

Catch ex As Exception

MessageBox.Show(ex.Message & System.Environment.NewLine & ex.StackTrace)

End Try

End Sub


2022年7月21日 星期四

MS-SQL 格式化匯入和匯出資料的檔案 (SQL Server)

 參考來源:格式化匯入和匯出資料的檔案 (SQL Server)

---

*建立格式檔案*


建立非 XML 格式檔案

bcp TestDatabase.dbo.myFirstImport format nul -c -f D:\BCP\myFirstImport.fmt -t, -T


建立 XML 格式檔案

bcp TestDatabase.dbo.myFirstImport format nul -c -x -f D:\BCP\myFirstImport.xml -t, -T



*使用格式檔案大量匯入資料*


使用 bcp 和非 XML 格式檔案

REM Truncate table (for testing)

SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.MyFirstImport;"


REM Import data

bcp TestDatabase.dbo.myFirstImport IN D:\BCP\myFirstImport.bcp -f D:\BCP\myFirstImport.fmt -T


REM Review results

SQLCMD -Q "SELECT * FROM TestDatabase.dbo.MyFirstImport"



使用 bcp 和 XML 格式檔案

REM Truncate table (for testing)

SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.MyFirstImport;"


REM Import data

bcp TestDatabase.dbo.myFirstImport IN D:\BCP\myFirstImport.bcp -f D:\BCP\myFirstImport.xml -T


REM Review results

SQLCMD -Q "SELECT * FROM TestDatabase.dbo.MyFirstImport;"


MS-SQL 觀察目前Update及Scan比例和壓縮

 觀察目前Update及Scan比例:

SELECT

    o.name AS [Table_Name]

    ,x.name AS [Index_Name]

    ,i.partition_number AS [Partition]

    ,i.index_id AS [Index_ID]

    ,x.type_desc AS [Index_Type]

    ,i.leaf_update_count * 100.0 /

    (i.range_scan_count + i.leaf_insert_count

    + i.leaf_delete_count + i.leaf_update_count

    + i.leaf_page_merge_count + i.singleton_lookup_count

    ) AS [Percent_Update]

    ,i.range_scan_count * 100.0 /

    (i.range_scan_count + i.leaf_insert_count

    + i.leaf_delete_count + i.leaf_update_count

    + i.leaf_page_merge_count + i.singleton_lookup_count

    ) AS [Percent_Scan]

FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) i

JOIN sys.objects o

    ON o.object_id = i.object_id

JOIN sys.indexes x

    ON x.object_id = i.object_id

         AND x.index_id = i.index_id

WHERE (i.range_scan_count + i.leaf_insert_count

+ i.leaf_delete_count + leaf_update_count

+ i.leaf_page_merge_count + i.singleton_lookup_count) != 0

AND OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1

ORDER BY [Percent_Update] ASC




壓縮語法:

語法也很簡單,可以針對資料表或索引分別啟用壓縮:


資料表

ALTER TABLE TableName REBUILD PARTITION = ALL

WITH (DATA_COMPRESSION = PAGE)


索引

ALTER INDEX IndexName ON TableName REBUILD PARTITION = ALL 

   WITH (DATA_COMPRESSION = PAGE)


2022年7月19日 星期二

Usando ListView com uma base de dados (語言開發和教學)

 Usando ListView com uma base de dados

===

網站有提供範例下載

該網站有非常的多語言開發和教學

想要大增功力必學   網站位置


Listview to datatable

 參考來源

---


1.

DataTable dtZeitplan = new DataTable();

foreach (ColumnHeader chZeitplan in lvZeitplan.Columns)

{

    dtZeitplan.Columns.Add(chZeitplan.Text);

}

foreach (ListViewItem item in lvZeitplan.Items)

{

    DataRow row = dtZeitplan.NewRow();

    for(int i = 0; i < item.SubItems.Count; i++)

    {

        row[i] = item.SubItems[i].Text;

    }

    dtZeitplan.Rows.Add(row);

}



2.

if (listView1.Items.Count > 0)

{

       dt.Columns.Add();

       foreach (ListViewItem.ListViewSubItem lvsi in listView1.Items[0].SubItems)

              dt.Columns.Add();

       //now we have all the columns that we need, let's add rows

       foreach (ListViewItem item in listView1.Items)

       {

              List<string> row = new List<string>();

              row.Add(item.ToString());

              foreach (var it in item.SubItems)

                   row.Add(it.ToString());

              //Add the row into the DataTable

              dt.Rows.Add(row.ToArray());

       }

}


3.

DataTable table = new DataTable();


            table.Columns.Add("MODUL", typeof(string));

            table.Columns.Add("ACIKLAMA", typeof(string));

            table.Columns.Add("UZUNLUK", typeof(string));

            table.Columns.Add("GENISLIK", typeof(string));

            table.Columns.Add("MIKTAR", typeof(string));


            for (int i = 0; i < listView2.Items.Count; i++)

            {

                table.Rows.Add(listView2.Items[i].SubItems[1].Text, listView2.Items[i].SubItems[2].Text, listView2.Items[i].SubItems[3].Text, listView2.Items[i].SubItems[4].Text, listView2.Items[i].SubItems[5].Text);

            }


4.

DataView theDataView = (DataView)theListView.ItemsSource;

DataTable theDataTable = theDataView.Table;


5.

 Dim it As Integer = 0

        Dim dt As New DataTable

        For it = 0 To LVActions.Items(0).SubItems.Count ‑ 1

            Dim DCOL As New DataColumn(LVActions.Columns(it).Text)

            dt.Columns.Add(DCOL)

        Next

        For it = 0 To LVActions.Items.Count ‑ 1

            Dim DROW As DataRow = dt.NewRow

            For j As Integer = 0 To LVActions.Items(it).SubItems.Count ‑ 1

                DROW(LVActions.Columns(j).Text) = LVActions.Items(it).SubItems(j).Text

            Next

            dt.Rows.Add(DROW)

        Next


HOW TO CONVERT OF LISTVIEW TO DATATABLE IN VB.NET

參考來源

---

 Public for Function CONVRSION_LISTVIEW_TO_DATATABLE(ByVal LS_VIEW As ListView) As DataTable

'LS_VIEW.Items.Clear()

Dim DT_TAB As New DataTable

If LS_VIEW.Items.Count < 1 Then

Return DT_TAB

Else

For i As Integer = 0 To LS_VIEW.Items(0).SubItems.Count - 1

Dim DCOL As New DataColumn(LS_VIEW.Columns(i).Text)

DT_TAB.Columns.Add(DCOL)

Next

End If

For i As Integer = 0 To LS_VIEW.Items.Count - 1

Dim DROW As DataRow = DT_TAB.NewRow

For j As Integer = 0 To LS_VIEW.Items(i).SubItems.Count - 1

DROW(LS_VIEW.Columns(j).Text) = LS_VIEW.Items(i).SubItems(j).Text

Next

DT_TAB.Rows.Add(DROW)

Next

Return DT_TAB

End Function

HOW TO FILL UP A LISTVIEW FROM DATABASE IN VB.NET USING A DATATABLE

 參考網址

--


Sub FillListViewByTable(ByVal listView As ListView, ByVal dt As DataTable)

        Dim ii As Integer

        Dim iColCount As Integer = dt.Columns.Count

        Dim iRowCount As Integer = dt.Rows.Count

        listView.Clear()

        For ii = 0 To iColCount – 1

            listView.Columns.Add(dt.Columns(ii).ColumnName, 250, HorizontalAlignment.Left)

          

        Next

   

        Dim i As Integer

        Dim x As Integer

        For i = 0 To iRowCount – 1  ‘ for each row in the table

            Dim lst As New ListViewItem

            lst.Text = dt.Rows(i).Item(0)

            lst.UseItemStyleForSubItems = True

            For x = 1 To iColCount – 1 ‘ for each column in the row of the table

                Application.DoEvents()

                lst.SubItems.Add(SNZ(dt.Rows(i).Item(x)))

             

            Next


               Application.DoEvents()

           ‘    If you want to display the progress then you can do it here

           ‘ myStatusLabel.text = “Displaying Record ” & i + 1 & “/” & iRowCount

            listView.Items.Add(lst)

            lst = Nothing

        Next

    

    End Sub

Crear y LLenar DataTable y Transferir Datos a Listview

 參考來源(不錯的網站)

----


Crear y LLenar DataTable y Transferir Datos a Listview

    Public Sub AGREGAR(ByVal Archivo_ As String, ByVal URL_ As String, ByVal Destino_ As String)


        Dim dt As New DataTable()

        dt.Columns.Add("Archivo")

        dt.Columns.Add("URL")

        dt.Columns.Add("Destino")

        Dim row As DataRow = dt.NewRow()

        row("Archivo") = Archivo_

        row("URL") = URL_

        row("Destino") = Destino_

        dt.Rows.Add(row)


        Dim lvItem As ListViewItem

        For y = 0 To dt.Rows.Count - 1

            lvItem = ListView1.Items.Add(dt.Rows(y)(0))

            'FILA DESCRIPCIÓN

            lvItem.SubItems.Add(dt.Rows(y)(1))

            lvItem.SubItems.Add(dt.Rows(y)(2))

        Next

    End Sub

Bind ListView to DataTable

 Bind ListView to DataTable


T-SQL:


    CREATE PROCEDURE GetMembers


    AS

    SET NOCOUNT ON

    SELECT

        FirstName,

        LastName,

        NickName,

        FavoriteLanguage

    FROM

        Members


VB.NET


Private Function GetMembers() As DataTable

    Dim connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

    Dim command As SqlCommand = connection.CreateCommand

    command.CommandText = "GetMembers"

    command.CommandType = Data.CommandType.StoredProcedure

 

    Dim table As New DataTable

    connection.Open()

    table.Load(command.ExecuteReader(Data.CommandBehavior.CloseConnection))

 

    Return table

End Function


Protected Sub Page_Load(ByVal sender As Object, _

    ByVal e As System.EventArgs) Handles Me.Load

    Me.ListView1.DataSource = GetMembers()

    Me.ListView1.DataBind()

End Sub

Bind Listview from dataset

 Dim constr As String = "Put your connection string here"

        Dim ds As New DataSet

        Dim con As New SqlClient.SqlConnection(constr)

        con.Open()

        Dim sqladap As New SqlClient.SqlDataAdapter("select * from tbl_Employee", con)

        sqladap.Fill(ds)

 

        For i As Integer = 0 To ds.Tables(0).Columns.Count - 1

            ListView1.Columns.Add(ds.Tables(0).Columns(i).ToString())

        Next

        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1

            Dim listRow As New ListViewItem

            listRow.Text = ds.Tables(0).Rows(i)(0).ToString()

            For j As Integer = 1 To ds.Tables(0).Columns.Count - 1

                listRow.SubItems.Add(ds.Tables(0).Rows(i)(j).ToString())

            Next

            ListView1.Items.Add(listRow)

        Next

VB.NET NPOI读取EXCEL数据到DataTable

引用來源


 Imports NPOI.HSSF.UserModel

Imports NPOI.SS.UserModel

Imports NPOI.XSSF.UserModel    

 

    ''' <summary>

    ''' 获取EXCEL表格真正的值

    ''' </summary>

    ''' <param name="cell"></param>

    ''' <returns>不同的类型处理后的值</returns>

    ''' <remarks></remarks>

    Private Shared Function GetCellValue(cell As ICell) As String

        If cell Is Nothing Then

            Return String.Empty

        End If

        Select Case cell.CellType

            Case CellType.Blank

                '空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写)

                Return String.Empty

            Case CellType.[Boolean]

                'bool类型

                Return cell.BooleanCellValue.ToString()

            Case CellType.[Error]

                Return cell.ErrorCellValue.ToString()

            Case CellType.Numeric

                '数字类型

                If HSSFDateUtil.IsCellDateFormatted(cell) Then

                    '日期类型

                    Return cell.DateCellValue.ToString()

                Else

                    '其它数字

                    Return cell.NumericCellValue.ToString()

                End If

            Case CellType.Unknown

                '无法识别类型

                '默认类型

                Return cell.ToString()

                '

            Case CellType.[String]

                'string 类型

                Return cell.StringCellValue

            Case CellType.Formula

                '带公式类型

                Try

                    Dim e As New HSSFFormulaEvaluator(cell.Sheet.Workbook)

                    e.EvaluateInCell(cell)

                    Return cell.ToString()

                Catch

                    Return cell.NumericCellValue.ToString()

                End Try

        End Select

    End Function

 

 

 

    ''' <summary>

    ''' 获取excel内容

    ''' </summary>

    ''' <param name="filePath">excel文件路径</param>

    ''' <returns></returns>

    Public Shared Function ImportExcel(filePath As String) As DataTable

        Dim dt As New DataTable()

        Using fsRead As FileStream = System.IO.File.OpenRead(filePath)

            Dim wk As IWorkbook = Nothing

            '获取后缀名

            Dim extension As String = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower()

            '判断是否是excel文件

            If extension = ".xlsx" OrElse extension = ".xls" Then

                '判断excel的版本

                If extension = ".xlsx" Then

                    wk = New XSSFWorkbook(fsRead)

                Else

                    wk = New HSSFWorkbook(fsRead)

                End If

 

                '获取第一个sheet

                Dim sheet As ISheet = wk.GetSheetAt(0)

                '获取第一行

                Dim headrow As IRow = sheet.GetRow(0)

                '创建列

                For i As Integer = headrow.FirstCellNum To headrow.Cells.Count - 1

                    Dim datacolum = New DataColumn(headrow.GetCell(i).StringCellValue)

                    'Dim datacolum As New DataColumn("F" + CStr(i + 1))

                    dt.Columns.Add(datacolum)

                Next

                '读取每行,从第二行起

                For r As Integer = 1 To sheet.LastRowNum

                    Dim result As Boolean = False

                    Dim dr As DataRow = dt.NewRow()

                    '获取当前行

                    Dim row As IRow = sheet.GetRow(r)

                    '读取每列

                    For j As Integer = 0 To row.Cells.Count - 1

                        Dim cell As ICell = row.GetCell(j)

                        '一个单元格

                        dr(j) = GetCellValue(cell)

                        '获取单元格的值

                        '全为空则不取

                        If dr(j).ToString() <> "" Then

                            result = True

                        End If

                    Next

                    If result = True Then

                        '把每行追加到DataTable

                        dt.Rows.Add(dr)

                    End If

                Next

            End If

        End Using

        Return dt

    End Function

 

    REM 调用

    Dim 文件名 = "abc.xlsx"

    Dim dt As New DataTable()

    If File.Exists(文件名) Then

        dt = ImportExcel(文件名)

        Grid显示框.DataSource = dt

    Else

        MsgBox(文件名 & "  不存在,请检查!!", MsgBoxStyle.Critical)

    End If

EPPlus —— 輕鬆處理 Excel

 https://igouist.github.io/post/2020/04/epplus/


2022年7月17日 星期日

指定的連接埠名稱不是以 COM/com 開頭

 Windows7 無法使用SerialPort控制項

---

可以試試看在裝置管理員中把你COM1停用,之後啟用,然後測試你的程式看看,滿久之前在某些電腦有遇過這種怪情形


-----------

SerialPort.GetPortNames 方法

指定的連接埠名稱不是以 COM/com 開頭

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM


未指定從 GetPortNames 傳回的埠名稱順序。


GetPortNames使用 方法來查詢目前電腦是否有有效的序列埠名稱清單。 例如,您可以使用這個方法來判斷 COM1 和 COM2 是否為目前電腦的有效序列埠。


埠名稱是從系統登錄 (取得,例如HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM)。 如果登錄包含過時或不正確的資料,則 GetPortNames 方法會傳回不正確的資料。


MSSQL 資料表鎖住

 可以利用 dbcc opentran查看一下是否有交易還沒結束,若有可能也會導致lock


後續可再用 dbcc inputbuffer(id) 查看是何種語法導致


最後再用kill id 殺掉該程序


註:id即為 dbcc opentran回傳值


MS-SQL Disable AUTO SHRINK

 MS-SQL Disable AUTO SHRINK


--Set Auto Shrink ON or True

ALTER DATABASE TechYaz SET AUTO_SHRINK ON

--Set Auto Shrink OFF or False

ALTER DATABASE TechYaz SET AUTO_SHRINK OFF

2022年7月14日 星期四

KTV計費管理

 最近1-2個月一連3-4通電話,都是KTV打來須要計費管理軟體

無奈阿,我就沒寫~
有寫都是複合式的

非專用款的包廂+點餐+計時+計費

在幾年前曾寫了一個範本"多計時器"結果找不到放哪了

今天花了一些時間,重寫了一個多計時器引擎

有空來專寫一套"KTV包廂計時計費"管理軟體 

當然寫一定是寫網路版




2022年7月12日 星期二

MS-SQL 查詢執行過的語法

 MS-SQL 查詢執行過的語法


SELECT

QS.creation_time,

ST.text

FROM

sys.dm_exec_query_stats QS

CROSS APPLY

sys.dm_exec_sql_text(QS.sql_handle) ST

where QS.creation_time between '2017-11-17 10:23:01.500' and '2017-11-17 23:23:01.500'

ORDER BY

QS.creation_time DESC

MS-SQL 相容性層級

 

MS-SQL 相容性層級:

SQL Server 2008 (100)

SQL Server 2019 (150)


指令查詢目前所有資料庫的相容性層級版本:

SELECT name 'DB', compatibility_level FROM sys.databases


查詢SQLSERVER執行過的SQL記錄

 僅支援SQL SERVER2008及以上版本

SELECT TOP 1000
–建立時間
QS.creation_time,
–查詢語句
SUBSTRING(ST.text,(QS.statement_start_offset/2)+1,
((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1
) AS statement_text,
–執行文字
ST.text,
–執行計劃
QS.total_worker_time,
QS.last_worker_time,
QS.max_worker_time,
QS.min_worker_time
FROM
sys.dm_exec_query_stats QS
–關鍵字
CROSS APPLY
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE
QS.creation_time BETWEEN ‘2018-05-08 09:00:00’ AND ‘2018-05-08 18:00:00’
–AND ST.text LIKE ‘%%’
ORDER BY
QS.creation_time DESC

SELECT TOP 1000
–建立時間
QS.creation_time,
–執行文字
ST.text
FROM
sys.dm_exec_query_stats QS
–關鍵字
CROSS APPLY
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE
QS.creation_time BETWEEN ‘2018-05-08 09:00:00’ AND ‘2018-05-08 18:00:00’
AND ST.text NOT LIKE ‘%SELECT * FROM T_LOCATIONINFO WHERE STRCLIPLOGICID in(%’
ORDER BY
QS.creation_time DESC

2022年7月11日 星期一

MS-SQL帳號只開放SELECT功能

 MS-SQL帳號只開放SELECT功能

db_datareader

db_denydataeader

--------------------

當無法刪除,必須先把帳號權限移轉

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

--alter authorization on schema::[db_datareader] To [dbo]

--alter authorization on schema::[db_denydatareader] To [dbo]

--alter authorization on schema::[db_denydatawriter] To [dbo]


---------------------






2022年7月6日 星期三

在今年多雨的氣候,草總是特別長很快

 草又長大了,割草日

就拍拍照,和看看前些日子才網購買了櫛瓜種子;播種了10顆,共9顆發芽長出來了

在都市上班快30年了,現在每日最期待的就是假日農夫日了

拋開上班的壓力.沉澱自己.放空,不要再錢.工作的煩事...

當然這塊阿爸留下來的田地,我也是在為自己鋪路;未來退休後的農事運動休閒








2022年6月26日 星期日

自行車租借WebAPP系統-完整版

 


歡迎需要客製開發 WebAPP.WebAPI 系統的客戶

都可以加LINE與我聯絡

可以開發任何行業系統,包含硬體串接.各種金流串接及超商系統

也能開立電子發票.點餐系統.工廠BOM.進銷存.POS...等等

Google查 : 池龍工作室








2022年6月17日 星期五

vb.net利用SerialPort進行讀取串口操作

 Imports System

Imports System.IO.Ports


Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'獲取計算機有效串口

        Dim ports As String() = SerialPort.GetPortNames() '必須用命名空間,用SerialPort,獲取計算機的有效串口

        Dim port As String

For Each port In ports

            portnamebox.Items.Add(port) '向combobox中添加項

        Next port

'初始化界面

        baudratebox.SelectedIndex() = 2

        portnamebox.SelectedIndex() = 0

        Serial_Port1() '初始化串口

        Label3.Text = SerialPort1.IsOpen

        statuslabel.Text = "串口未連接"

        statuslabel.ForeColor = Color.Red

        sendbox.Text = "123"

' baudratebox.Text = baudratebox.Items(0) 註釋和不註釋的地方可以替換

        'portnamebox.Text = portnamebox.Items(0)

    End Sub


Private Sub Serial_Port1() '設置串口參數

        SerialPort1.BaudRate = Val(baudratebox.Text) '波特率

        SerialPort1.PortName = portnamebox.Text '串口名稱

        SerialPort1.DataBits = 8 '數據位

        SerialPort1.StopBits = IO.Ports.StopBits.One '停止位

        SerialPort1.Parity = IO.Ports.Parity.None '校驗位

    End Sub


'關閉串口連接

    Private Sub closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebtn.Click

Try

            SerialPort1.Close() '關閉串口

            Label3.Text = SerialPort1.IsOpen

If SerialPort1.IsOpen = False Then

                statuslabel.Text = "串口未連接"

                statuslabel.ForeColor = Color.Red

                receivebox.Text = ""

                receivebytes.Text = ""

End If

Catch ex As Exception

            MessageBox.Show(ex.Message)

End Try

End Sub


'打開串口連接

    Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click

Try

            SerialPort1.Open() '打開串口

            Label3.Text = SerialPort1.IsOpen

If SerialPort1.IsOpen = True Then

                statuslabel.Text = "串口已連接"

                statuslabel.ForeColor = Color.Green

End If

Catch ex As Exception

            MessageBox.Show(ex.Message)

End Try

End Sub



'發送數據

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Try

            SerialPort1.Write(sendbox.Text)

Catch ex As Exception

            MessageBox.Show(ex.Message)

End Try


End Sub


'觸發接收事件

    Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

Me.Invoke(New EventHandler(AddressOf Sp_Receiving)) '調用接收數據函數

    End Sub


'接收數據

    Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)

Dim strIncoming As String

Try

            receivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)

If SerialPort1.BytesToRead > 0 Then

                Threading.Thread.Sleep(100) '添加的延時

                strIncoming = SerialPort1.ReadExisting.ToString '讀取緩衝區中的數據

                SerialPort1.DiscardInBuffer()

                receivebox.Text = strIncoming

End If

Catch ex As Exception

            MessageBox.Show(ex.Message)

End Try

End Sub

End Class

2022年6月10日 星期五

IIS 檔案上傳的大小限制 File Upload Limit (MaxRequestLength, MaxAllowedContentLength)

 IIS 檔案上傳的大小限制 File Upload Limit (MaxRequestLength, MaxAllowedContentLength)


藉由調整 maxAllowedContentLength來設定 IIS 所允許的檔案上傳大小,預設值為 30000000 相當於 28.6 MB,調整為 104857600 相當於 100 MB。


<system.webServer>

    <security>

        <requestFiltering>

            <requestLimits maxAllowedContentLength="104857600" />

        </requestFiltering>

    </security>

</system.webServer>


另外也可以使用 GUI 來設定:




2022年6月8日 星期三

FileRead and StreamReader介紹開啟檔案的幾個方法

 


以下程式碼, 由上而下分別是: 

(1) 以 File.Open 讀檔 

(2) 以 StreamReader 讀檔(此方法比較簡便) 

(3) 以 File 類別支援的 ReadAllText 方法, 讀出整個檔案內容. 

(4) StreamReader 搜尋檔案裡是否存在某個字串. 


因為程式碼都很簡單, 就不多做解釋, 請直接看以下所附的 code 應該不難了解. 



Imports System.IO

 

Public Class _03_StreamReader

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim theFile As FileStream = File.Open("d:\temp\asdf.txt", FileMode.Open, FileAccess.Read)

Dim rdr As StreamReader = New StreamReader(theFile)

TextBox1.Text = rdr.ReadToEnd()

rdr.Close()

theFile.Close()

End Sub

 

 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim rdr As StreamReader = File.OpenText("d:\temp\asdf.txt")

TextBox1.Text = rdr.ReadToEnd()

rdr.Close()

End Sub

 

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

MsgBox(File.ReadAllText("d:\temp\asdf.txt"))

End Sub

 

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Dim rdr As StreamReader = File.OpenText("d:\temp\asdf.txt")

While Not rdr.EndOfStream

Dim ft As String = rdr.ReadLine()

If ft.Contains(TextBox2.Text) Then

MsgBox("Found " & TextBox2.Text & vbNewLine & ft)

End If

End While

End Sub

 

 

End Class

2022年5月29日 星期日

4年生苦茶樹初掛果

 去年不忍了,讓4年生苦茶樹開花結果(不摘除花苞了)

看起來,還是得慢慢等進入第5年看看了

有70%還在練掛果,掉光光的不在少數



苦茶苗

 趁這週六日,梅雨稍暫停

趕快回農園,整理一下苦茶苗;把草都拔掉後

看了一下苦茶苗,心情就好起來...(因草都比苗還高了...)

--

有網客來信詢問是否有在賣苗

只能再等等了,這批已有預定了;要等明年喔

--




2022年5月27日 星期五

POS 系統 - 新世代趨勢

在POS系統開發上已超過10年了

這2-3年,發現整個消費行為和交易行為完全不一樣

主要是疫情這2-3年內的影響層面太大了

現市面的POS百百款,各種平台都有 Web  / Windows / android APP/ IOS APP

但一直延申串接,快變一台雜貨車了;要什麼有什麼是很好,卻非主體的手+腳

也就是一堆小工具特多,連我上班公司的POS也不例外

越寫越多,越須要人力維護;我一人實在無法維護這麼多NN工具

把話題拉回來今天要講的主題:新世代趨勢

現在的交易行為:團購.定點購.網購.代購.實體店面

支付行為:現金.行動支付.信用卡.LINE pay.台灣pay......NN種

現在市面POS都是一個接一個的擴增加寫,結構上也是很亂

就在想,是不是能寫一個本體+外體模組式的架構

而非現在很零亂的本體式+小工具

另外一個重要的是"資料流"的交換機制和穩定度

每家的系統,都有一定的問題和缺點存在,就看怎排除問題和處理

資料流和網路的穩定度就特別重要了

以上種種...

去年有談一家連鎖的客戶,結果價位落差實在太大;實在無法為該客戶開發系統

本想說,要把自己的這種新趨勢的架構趁這機會寫出來...

結果,擺著放腦海保留...



2022年5月13日 星期五

企業系統化趨勢分析

 在疫情這2年多來,很多傳統的企業紛紛朝更簡便的系統化變化

很多公司捨不得更換現有系統,有幾個問題可以思考的

1.人力和輪替新系統的接受度(這一點真的好難)

2.請系統商(工作室)開發符合公司實際需求的費用,捨不得花

3.員工忙得要死,還要使用新系統;光開會討論就激戰不下

4.老闆的心態很重要

---

在個人接案的過程分析,接不下或無法完案的幾乎很少;但也是有例外

100% 絕對制勝的關鍵:

1.專業度

2.經驗值

3.真心.真實

4.實力

5.產品.產業.各行業的透徹度

6.面對新的領域,一定要有所犧牲到現場實地分析

7.服務面和處理時間及排除問題的能力和速度

---

很多客戶找我開發系統,肯花錢又不愛計較的;幾乎都是變成永久的客戶+好朋友

今天突然寫這一篇... 

表示我又空窗期了,目前手上案子已消化完... 

再等待新有緣的客戶+朋友




若有需要軟體系統或須要專案開發,請勿採用留言

 若有需要軟體系統或須要專案開發,請勿採用留言

剛剛看了一下留言記錄,哇咧.......

一大堆留言...不是要買範例就是有軟體系統需求和各行業的專案開發

我會把放在首頁標題說明內:聯絡方式或導引到我個人工作室網站 池龍工作室

= _ = 怎會一卡車多的留言需求呢....

太忙了,都沒在注意留言記錄

不好意思...Orz...

2022年4月14日 星期四

自行車租借WebAPP系統-進度02

 WebAPP 已串接租借系統

也支援綁定手機號碼和供刷一維條碼(手機/單號)










2022年4月11日 星期一

自行車租借WebAPP系統-進度01

 自行車租借WebAPP系統-進度01

系統採用響應式框架開發

串接API取得實體租借系統B2C

可應用讀取租借記錄.當下租借車輛及相關資訊狀態記錄

客端現階段需求規劃先朝"有"後再"複雜化"


目前的系統進度畫面: