---
三十天利用Angular與.net Core開發實戰一波 系列
--若有大批新增或修改資料,建議執行更新統計資料和更新資料列計數,以避免查詢資料會有效能緩慢的問題
--參考資料網站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
Me.Top = 0
Me.Left = 0
Me.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
Me.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
序列化:
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)
蝦皮超商單列印
依據平台單號,自動列印:
五大超商的出貨單:萊爾富,OK,蝦皮OK,7-11,全家
採用標籤機 : ZDesigner GT800-300dpi EPL
紙張大小 : 10x15
邊界: 左,右,上,下--> 0,0,0,0
目前系統能:依據蝦皮產出的Excel自動匯入系統
1.客戶資料
2.訂單作業
3.檢貨作業 (自動產出下單的訂單的撿貨單,進行撿貨作業)
4.出貨作業 (依撿貨單打包封箱貼超商單(退貨取消訂單)
5.確定出貨寄出轉歷史出貨作業 (供備查)
未來將打造全新:蝦皮專用ERP系統
目標:
採用全新自動讀取蝦皮賣場的訂單
只要在ERP系統內操作,即可異動蝦皮平台的訂單
不需再2邊忙,只需要1邊忙即可完全出貨並寄出
歡迎有興趣的,請電洽或LINE [池龍工作室]
VS2019 視窗設計界面不見,解決方法
最近開始碰到從未遇過的問題(如下圖)
這樣根本無法打開視窗界面來設計
解決方式
將打開的VB 程式檔,全選後剪下(清空)後,存檔
再貼回去原本的程式碼,再[存檔]並關掉 form1.vb檔
此實專案內的form1圖示已變更[視窗設計]圖示
表示可以正常了
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;
}
}
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;
}
}
--抓英文或數字(過濾中文和符號)
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
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
參考來源:格式化匯入和匯出資料的檔案 (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;"
觀察目前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)
---
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
---
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
--
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
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
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
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
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
---
可以試試看在裝置管理員中把你COM1停用,之後啟用,然後測試你的程式看看,滿久之前在某些電腦有遇過這種怪情形
-----------
指定的連接埠名稱不是以 COM/com 開頭
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
未指定從 GetPortNames 傳回的埠名稱順序。
GetPortNames使用 方法來查詢目前電腦是否有有效的序列埠名稱清單。 例如,您可以使用這個方法來判斷 COM1 和 COM2 是否為目前電腦的有效序列埠。
埠名稱是從系統登錄 (取得,例如HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM)。 如果登錄包含過時或不正確的資料,則 GetPortNames 方法會傳回不正確的資料。
可以利用 dbcc opentran查看一下是否有交易還沒結束,若有可能也會導致lock
後續可再用 dbcc inputbuffer(id) 查看是何種語法導致
最後再用kill id 殺掉該程序
註:id即為 dbcc opentran回傳值
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
最近1-2個月一連3-4通電話,都是KTV打來須要計費管理軟體
無奈阿,我就沒寫~
有寫都是複合式的
非專用款的包廂+點餐+計時+計費
在幾年前曾寫了一個範本"多計時器"結果找不到放哪了
今天花了一些時間,重寫了一個多計時器引擎
有空來專寫一套"KTV包廂計時計費"管理軟體
當然寫一定是寫網路版
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 相容性層級:
SQL Server 2008 (100)
SQL Server 2019 (150)
指令查詢目前所有資料庫的相容性層級版本:
SELECT name 'DB', compatibility_level FROM sys.databases
僅支援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
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]
草又長大了,割草日
就拍拍照,和看看前些日子才網購買了櫛瓜種子;播種了10顆,共9顆發芽長出來了
在都市上班快30年了,現在每日最期待的就是假日農夫日了
拋開上班的壓力.沉澱自己.放空,不要再錢.工作的煩事...
當然這塊阿爸留下來的田地,我也是在為自己鋪路;未來退休後的農事運動休閒
歡迎需要客製開發 WebAPP.WebAPI 系統的客戶
都可以加LINE與我聯絡
可以開發任何行業系統,包含硬體串接.各種金流串接及超商系統
也能開立電子發票.點餐系統.工廠BOM.進銷存.POS...等等
Google查 : 池龍工作室
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
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 來設定:
以下程式碼, 由上而下分別是:
(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
在POS系統開發上已超過10年了
這2-3年,發現整個消費行為和交易行為完全不一樣
主要是疫情這2-3年內的影響層面太大了
現市面的POS百百款,各種平台都有 Web / Windows / android APP/ IOS APP
但一直延申串接,快變一台雜貨車了;要什麼有什麼是很好,卻非主體的手+腳
也就是一堆小工具特多,連我上班公司的POS也不例外
越寫越多,越須要人力維護;我一人實在無法維護這麼多NN工具
把話題拉回來今天要講的主題:新世代趨勢
現在的交易行為:團購.定點購.網購.代購.實體店面
支付行為:現金.行動支付.信用卡.LINE pay.台灣pay......NN種
現在市面POS都是一個接一個的擴增加寫,結構上也是很亂
就在想,是不是能寫一個本體+外體模組式的架構
而非現在很零亂的本體式+小工具
另外一個重要的是"資料流"的交換機制和穩定度
每家的系統,都有一定的問題和缺點存在,就看怎排除問題和處理
資料流和網路的穩定度就特別重要了
以上種種...
去年有談一家連鎖的客戶,結果價位落差實在太大;實在無法為該客戶開發系統
本想說,要把自己的這種新趨勢的架構趁這機會寫出來...
結果,擺著放腦海保留...
在疫情這2年多來,很多傳統的企業紛紛朝更簡便的系統化變化
很多公司捨不得更換現有系統,有幾個問題可以思考的
1.人力和輪替新系統的接受度(這一點真的好難)
2.請系統商(工作室)開發符合公司實際需求的費用,捨不得花
3.員工忙得要死,還要使用新系統;光開會討論就激戰不下
4.老闆的心態很重要
---
在個人接案的過程分析,接不下或無法完案的幾乎很少;但也是有例外
100% 絕對制勝的關鍵:
1.專業度
2.經驗值
3.真心.真實
4.實力
5.產品.產業.各行業的透徹度
6.面對新的領域,一定要有所犧牲到現場實地分析
7.服務面和處理時間及排除問題的能力和速度
---
很多客戶找我開發系統,肯花錢又不愛計較的;幾乎都是變成永久的客戶+好朋友
今天突然寫這一篇...
表示我又空窗期了,目前手上案子已消化完...
再等待新有緣的客戶+朋友
若有需要軟體系統或須要專案開發,請勿採用留言
剛剛看了一下留言記錄,哇咧.......
一大堆留言...不是要買範例就是有軟體系統需求和各行業的專案開發
我會把放在首頁標題說明內:聯絡方式或導引到我個人工作室網站 池龍工作室
= _ = 怎會一卡車多的留言需求呢....
太忙了,都沒在注意留言記錄
不好意思...Orz...
自行車租借WebAPP系統-進度01
系統採用響應式框架開發
串接API取得實體租借系統B2C
可應用讀取租借記錄.當下租借車輛及相關資訊狀態記錄
客端現階段需求規劃先朝"有"後再"複雜化"
目前的系統進度畫面: