2010年8月21日 星期六

Microsoft Access 容量2GB

微軟官網

Microsoft Access 資料庫 (.mdb) (Microsoft Access 資料庫:資料及物件 (如資料表、查詢或表單) 的集合,與特定主題或目的相關。Microsoft Jet 資料庫引擎管理資料。) 檔案的大小 2 GB 減去系統物件 (系統物件:由系統 (如資料表 MSysIndexes),或使用者定義的資料庫物件。您可以藉由使用 USys 做為物件名稱的前 4 個字元命名物件,來建立系統物件。)所需的空間
一個資料庫內的物件數目 32,768
模組 (包含其 [有模組] 屬性設定為 [是] 的表單和報表) 1,000
一個物件名稱的字元數 64
一個密碼的字元數 14
一個使用者名稱或群組名稱的字元數 20
共用的使用者數目 255

2010年8月20日 星期五

組合母子計算

購買組合(母)-產生3筆 M 1 100
S1 1 54.17 (原價65) 公式100 * 65 / (65+55) = 54.17
S2 1 45.83 (原價55) 公式100 * 55 / (65+55) = 45.83

2010年8月18日 星期三

T-SQL迴圈的寫法

來原處

DECLARE @_i INT
DECLARE @_MAX INT
SET @_i = 0
SET @_MAX = 10 -- 要產生幾筆資料
WHILE (@_i<@_MAX)
BEGIN
--要迴圈的語法
INSERT INTO #TT VALUES('T')

--加1
Set @_i=@_i+1
END

2010年8月17日 星期二

DEALLOCATE

引自:微軟-HELP,詳細請至微軟官網查看
移除資料指標參考。
語法
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

引數
cursor_name

是已宣告資料指標的名稱。若同時有名為 cursor_name 的全域及區域資料指標存在,當指定 GLOBAL 時,cursor_name 參考全域資料指標,若未指定 GLOBAL,則參考區域資料指標。

@cursor_variable_name

是 cursor 變數的名稱。@cursor_variable_name 的型別必須是 cursor。

備註
作用於資料指標的陳述式會使用資料指標名稱或資料指標變數來參考資料指標。DEALLOCATE 會移除資料指標與資料指標名稱或資料指標變數之間的關聯。如果名稱或變數是最後一個參考該資料指標者,該資料指標便會被解除配置,它所使用的任何資源也會被釋放。用來保護提取隔離性的捲動鎖定會在 DEALLOCATE 時被釋放。用來保護更新 (包括透過此資料指標所做的定位更新) 的交易鎖定則會保留到交易結束為止。

DECLARE CURSOR 陳述式可配置資料指標,並將其關聯到一個資料指標名稱:

DECLARE abc SCROLL CURSOR FOR
SELECT * FROM authors

資料指標名稱被關聯到某個資料指標之後,此名稱就不能被相同範圍 (GLOBAL 或 LOCAL) 的另一個資料指標所用,直到這個資料指標被解除配置為止。

資料指標變數可以用下列兩種方式關聯到某個資料指標:

依據名稱,即使用 SET 陳述式將資料指標設定為某個資料指標變數:
DECLARE @MyCrsrRef CURSOR
SET @MyCrsrRef = abc

資料指標也可以在不定義資料指標名稱的情況下建立,並將其關聯到某個變數:
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles

DEALLOCATE @cursor_variable_name 陳述式只會移除具名變數對資料指標的參考。變數一直到批次、預存程序或觸發程序結尾超出範圍時才會被解除配置。在 DEALLOCATE @cursor_variable_name 陳述式之後,變數即可使用 SET 陳述式被關聯到另一個資料指標。

USE pubs
GO
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles

DEALLOCATE @MyCursor

SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM sales
GO

資料指標變數不一定要明確地解除配置。當一個變數超出範圍時,它即隱含性地被解除配置。

權限
DEALLOCATE 權限預設授與任何有效的使用者。

範例
以下指令碼顯示了資料指標維持到最後一個名稱被解除配置,或參考該資料指標的變數被解除配置為止。

USE pubs
GO
-- Create and open a global named cursor that
-- is visible outside the batch.
DECLARE abc CURSOR GLOBAL SCROLL FOR
SELECT * FROM authors
OPEN abc
GO
-- Reference the named cursor with a cursor variable.
DECLARE @MyCrsrRef1 CURSOR
SET @MyCrsrRef1 = abc
-- Now deallocate the cursor reference.
DEALLOCATE @MyCrsrRef1
-- Cursor abc still exists.
FETCH NEXT FROM abc
GO
-- Reference the named cursor again.
DECLARE @MyCrsrRef2 CURSOR
SET @MyCrsrRef2 = abc
-- Now deallocate cursor name abc.
DEALLOCATE abc
-- Cursor still exists, referenced by @MyCrsrRef2.
FETCH NEXT FROM @MyCrsrRef2
-- Cursor finally is deallocated when last referencing
-- variable goes out of scope at the end of the batch.
GO
-- Create an unnamed cursor.
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles
-- The following statement deallocates the cursor
-- because no other variables reference it.
DEALLOCATE @MyCursor
GO

2010年8月16日 星期一

DataGridViewComboBoxColumn requires multiple clicks to select an item

原出處

If you have ever used a DataGridView with a DataGridViewComboBox column, then you would have definitely noticed that you need multiple clicks to select an item in the combo box. This is very annoying because every time you want to select a different item from the combo box, you need at least 2-3 clicks.

Fix

Fortunately, there is a simple fix for this: set the EditMode property of the data grid view to EditOnEnter. So, when the user enters the control, the cell is automatically put in edit mode, so when you actually click on the combo box, you can see the drop down list.
A bug

That being said, there is a bug associated with this. With the EditMode property set to EditOnEnter, when you select a row by clicking on the row header, the entire row is selected, but one cell will be in edit mode. What this means is if you try to delete the row by selecting the row header, you cannot delete the row because the delete key is actually being sent to the cell being edited and not the row.

==============
以上就是說:EditOnEnter 是重點!!

2010年8月13日 星期五

使用 REPLICATE 與 DATALENGTH

SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS [Varchar Column],
REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS [Char Column]
FROM t1

2010年8月12日 星期四

Espon 發票機控制碼

汉字模式fs&,fs.

倍宽字符fs so,fs dc4

四位字符fs w

垂直间距fs j

水平线间距fs k

两个半倍宽字符fs d(垂直打印)

汉字下划线fs-

汉字间距fs s

半倍宽字符间距fs t

半倍宽字符间隔fs u,fs v(调整)

高速打印fs x

下载汉字fs 2

半倍宽字符fs si,fs dc2

1/4字符fs r

表格符连线fs v

汉字字体族fs k

汉字打印模式选择fs i

汉字字符宽度选择fs y

bank-number选择 fs(1

cc-dos控制码

打印模式 esc i a,esc i b,esc i c,esc i d

条形码

条形码安装及打印 esc (b

代码 功能 代码 功能
LF 换行 ESC m 局部切割
CR 回车 ESC o 印章
ESC SP 设置右边界 ESC q 释放纸
ESC ! 设置打印方式 ESC r 选择打印颜色
ESC * 设置位映射方式 ESC z 设置或取消两页并行打印
ESC @ 初始化打印机 ESC BEL 蜂鸣器ON/OFF
ESC R 选择国际字符子集 ESC c5 禁止/使能面板开关
ESC d 打印及N行进纸 ESC c6 禁止/使能ON-LINE开关
ESC t 选择字符码表 ESC p 产生指定脉冲
ESC l 选择或取消倒过来的字符ESC V 发送打印机状态
ESC c0 选择打印页 ESC ~ LED ON/OFF
FF 打印送出单页 HT 水平TAB
RS 流水TAB ESC % 选择或取消用户自定义字符集
ESC 2 选择行间距为1/6英寸 ESC & 定义用户自定义字符集
ESC 3 设置行进为最小间距 ESC D 设置TAB位置
ESC 标签:
ESC
,
Espon
,
Windows
,
打印指令

cnblogs jiangyuxuan

cnblogs jiangyuxuan
有收集一些不錯的文章

控制POS打印機

delphi控制POS打印機
RPrinter為TextFile類型;
SContent為TStringList類型。

// 建立打印連接並打印數據
Assignfile(RPrinter,'lpt1'); // 設置打印機
Rewrite(RPrinter); // 準備寫文件
Writeln(RPrinter,chr($b)+chr(27)+'K'+chr(40)); // 向後倒紙!
...

for i := 0 to SContent.Count - 1 do
Writeln(RPrinter,SContent.strings[i]);

Writeln(RPrinter,chr($b)+chr(27)+'J'+chr(140)); // 向前進紙

CloseFile(RPrinter); // 關閉打印機,結束打印
SContent.Free; // 釋放字符串列表

Assignfile(RPrinter,'lpt1'); // 設置打印機
Rewrite(RPrinter); // 準備寫文件
Writeln(RPrinter,chr(27)+'p'+'m'+(後面兩個看起來像是參數) t1 t2); // 開錢箱
CloseFile(RPrinter); // 關閉打印機,結束打印




開 錢 箱控制命令(該命令可同時開啟兩個錢箱,實際操作只需開啟一個)
1、PK模式驅動錢箱指令
  ESC | r F9 M n1 n2
  M =0 代表一個錢箱 n代表脈衝寬度 n1 =40--50 之間
  M =1 代表兩個錢箱 n2 =120--150之間
  QBASIC下編程
  LPRINT CHR$(27);"|";"r";CHR$(249);CHR$(0); CHR$(50);CHR$(150)
2、POS模式驅動錢箱指令
  ESC r p M n1 n2
  M =0 代表一個錢箱 n代表脈衝寬度 n1 =40--50 之間
  M =1 代表兩個錢箱 n2 =120--150之間
  QBASIC下編程   LPRINT CHR$(27);CHR$(112);CHR$ (0);CHR$ (50);CHR$(200)
3、BS300K可同時打開兩個錢箱,當接 2、4 時錢箱1打開,接4、5時錢箱2打開
4、設定在windows下自動開錢箱功能
   LPRINT CHR$(27);"|w";CHR$(45);CHR$(n);
   n=0 FF走紙命令時錢箱無效
   n=1 錢箱1打開
   n=2 錢箱2打開

POS週邊(發票機)廠商

POS週邊(發票機)廠商

BS-D808顾客显示屏

ESC/POS命令集明细表:
1. STX B n波特率设置命令
ACSII码 格式:STX B n n=0 bps=9600 n=2 bps=4800
十进制 格式:[002][066]n n=48 & n=50
十六进制 格式:[02H][42H]n n= 30H & n=32H
说明:改变系统的波特率(上电开机时缺省波特率为:2400bit/s),这个命令一般不需用到,使用缺省设定即

2. ESC @初始化命令
ASCII码 格式:ESC @
十进制 格式:[027][064]
十六进制 格式:[1BH][40H]
说明:恢复到上电开机时的状态。

3. CLR清屏命令
ASCII码 格式:CLR
十进制 格式:[012]
十六进制 格式:[0CH]
说明:清除屏幕上的所有字符。

4. ESC Q A d1d2d3…dn CR送显示数据命令
ASCII码 格式:ESC Q A d1d2d3…dn CR
十进制 格式:[027][081][065]d1d2d3…dn[013] 48<=dn<=57或dn=45或dn=46
十六进制 格式:[1BH][51H][41H]d1d2d3…dn[0DH]
30H<=dn<=39H或dn=2DH或dn=2EH
说明:
a. 执行该命令时,会以覆盖模式送要显示的数据,这样就不需要在每次送显示数据前都去执行CAN清除光标行命令了。
b. 显示的d1…dn没有小数点时1<=n<=8。
c. 显示的d1…dn有小数点时1<=n<=15(8位数值+7位小数点)。
d. 显示的内容可用CLR或CAN命令清除。

5. ESC s n设置 “单价”、“总计”、“收款”、“找零”字符显示状态命令
ASCII码 格式:ESC s n 0<=n<=4
十进制 格式:[027][115] n 48<=n<=52
十六进制 格式:[1BH][73H] n 30H<=n<=34H
说明:(1)当 n=0,四种字符 全暗。
(2)当 n=1,“单价”字符 亮,其它三种 全暗。
(3)当 n=2,“总计”字符 亮,其它三种 全暗。
(4)当 n=3,“收款”字符 亮,其它三种 全暗。
(5)当 n=4,“找零”字符 亮,其它三种 全暗。


6. CAN清除光标行命令
ASCII码 格式:CAN
十进制 格式:[024]
十六进制 格式:[18H]
说明:清除光标行(数码行)上的字符,光标移动到第1位置,一般不需使用,只使用ESC Q A d1d2d3…dn CR命令即可。

7. ESC _ n设置光标状态命令
ASCII码 格式:ESC _ n 0<=n<=1
十进制 格式:[027][095]n 48<=n<=49
十六进制 格式:[1BH][5FH]n 30H<=n<=31H
说明:这个命令一般不需使用。
(1)当n=0时,光标 暗
(2)当n=1时,光标 亮

BS-210BM打印机控制代码

打印控制命令

5.1.打印控制命令

5.1.1 概述

BS-210BM 提供了ESC/POS命令集。下面将对每个命令进行说明。每个命令的说明包括格式和解释两部分。格式部分提供了命令的ASCII码、十进制码和十六进码三种格式,解释部分描述命令的功能。三种命令的格式是等价的,用户可按照需要选择任一种。

5.1.2 各个命令的描述格式如下:

打印命令                   功能
格式:  ASCII: 以标准ASCII字符序列表示
    十进制: 以十进制数字序列表示
   十六进制: 以十六进制数字序列表示
说明:该命令功能和使用说明。

5.1.3 命令说明

HT                    水平制表
格式:  ASCII: HT
    十进制: 09
   十六进制: 09
说明:
打印位置进行到下一水平制表位置。
如果当前打印位置超过了最后一个水平制表位置,则HT命令不被执行。
水平制表位置由 ESC D命令设置。
LF                   打印并换行
格式:  ASCII: LF
    十进制: 10
   十六进制: 0A
说明:
打印存放在行编辑缓存中的一行数据并按当前设定的行距向前走纸一行。ESC2,ESC3指令可设定行距的长短。
如果行编辑缓存空,则只按当前设定的行距向前走纸一行。

CR                    打印回车
格式:  ASCII: CR
    十进制: 13
   十六进制: 0D
说明:
当打印在行编辑缓存中的一行数据之后,不进行走纸操作。

ESC SP              设置字符右间距
格式:  ASCII: ESC  SP n
    十进制: 27  32 n
   十六进制: 1B  20 n
说明:
以半点为设定单位(1/144英寸),设置字符右边间距为n个半点距。
默认值n=0。

ESC !              设置字符打印方式
格式:  ASCII: ESC  ! n
    十进制: 27  33 n
   十六进制: 1B  21 n
说明:
0≤n≤255
ESC ! n是综合性的字符打印方式设置命令,用于选择打印字符的大小和下划线。
打印参数n的每位定义为:
位 功能 值
0 1
0 字模选择 7×9 5×7
1 无定义
2 无定义
3 无定义
4 倍 高 取消 设定
5 倍 宽 取消 设定
6 无定义
7 下划线 取消 设定
默认值n=0,

ESC %           允许/禁止用户自定义字符
格式:  ASCII: ESC  %  n
    十进制: 27  37 n
   十六进制: 1B  25 n
说明:
参数n为一个字节,只有最低位有效。
当n=<*******1>B时,选择用户自定义字符集;
当n=<*******0>B时,选择内部字符集。
0≤n≤255,默认值n=0。
ESC &               设置用户自定义字符
格式: ASCII: ESC  &  y  n  m  x  d1  d2……db
   十进制: 27  38  y  n  m  x  d1  d2……db
  十六进制: 1B  26  y  n  m  x  d1  d2……db
说明:
该命令用于自定义字符。各参数为:
y:字符的纵向字节数。这里取 y=1,2。
n:自定义字符集的起始ASCII码,n≥32。
m:自定义字符集的终止ASCII码,m≤127。自定义字符个数为m-n+1,最多可定义96个字符。
当只有一个自定义字符时,取m=n。
a:自定义字符的水平方向的点数。
d1 d2……db:自定义字符的数据。每个字符 y×x个字节,m-n+1个自定义字符共有:
(y×x)×(m-n+1)个字节。

每个自定义字符数据的格式:

d1 d3 … d(y×x)×(m-n+1)-1
d2 d4 … d(y×x)×(m-n+1)

ESC *                  设置图形点阵
格式:  ASCII: ESC  *  m  n1  n2  D1,D2 … Dk
     十进制: 27 42 m  n1  n2  D1,D2 … Dk
    十六进制: 1B 2A m  n1  n2  D1,D2 … Dk
说明:
该命令用来设置点阵图形模式(m)和横向图形点阵。
m = 0,1: 表示打印密度。
0≤n1≤255,0≤n2≤1,0≤Dk≤255,k= n1+ n2×256。
n1,n2为两位十六进制数,n1这低字节,n2这高字节,k= n1+ n2×256,表示该命令下载的要打印图形的横向点数,该值应小于打印机的最大行宽打印点数。如果下送的点图数据超出一行的最大行宽打印点数时,超出的部分被忽略。

m 垂直方向点数 点密度 最大点数 图形打印模式
0 8 单密度 210 相邻点打印
1 8 双密度 420 相邻点不打印

Dk 定义为:

ESC 2              设定1/6英寸换行量
格式:  ASCII: ESC  2
    十进制: 27  50
   十六进制: 1B  32
说明:
此指令将打印机的换行量设定为1/6英寸。
ESC 3            设定 n/144英寸换行量
格式:  ASCII: ESC  3  n
    十进制: 27  51  n
   十六进制: 1B  33  n
说明:
此指令将打印机的换行量设定为 n/144英寸。
n=1 - 255。

ESC 〈                打印头归位
格式:  ASCII: ESC 〈
    十进制: 27  60
   十六进制: 1B  3C
说明:
执行该指令后,打针头会回到原位(home的位置)。

ESC @                初始化打印机
格式:  ASCII: ESC  @
    十进制: 27  64
   十六进制: 1B  40
说明:
该命令初始化打印机:使打印机恢复到最初的联机状态,清除以前留下的程序。

ESC D               设置水平制表值
格式:  ASCII: ESC  D  Nk NUL
    十进制: 27 68 Nk 0
   十六进制: 1B   44 Nk 00
说明:
设置水平制表位置为:N1,N2,…,Nk。
其中: 0≤Nk≤42,0≤k≤32。k为总共定义的水平跳格数,不超过32个。
Nk定义为以打印起始位置开始计算的列数,实际位置为(k-1)×字符宽度(10)。
Nk的默认值为:0,1,2,3,… 31。
NUL加在最后,表示该命令结束。

ESC D NULL        消除所有的水平制表位置
格式:  ASCII: ESC  D  NUL
    十进制: 27 68 0
   十六进制: 1B  44 0
说明:
ESC D NUL命令消除所有的水平制表位置,之后再执行的HT命令将无效。

ESC J              执行n/144英寸走纸
格式:  ASCII: ESC J  n
    十进制: 27 74 n
   十六进制: 1B  4A n
说明:
进纸n/144英寸,n值应为0到255之间的任意值。
若当时有打印内容则在打印完成后执行走纸。

ESC R               选择国际字符集
格式:  ASCII: ESC  R  n
    十进制: 27 82 n
   十六进制: 1B  52 n
说明:
ESC R用于选择11个不同国家的不同ASCII字符集。
n=0~10。默认值为0,选择U.S.A方式。

ESC U              设置/取消单向打印
格式:  ASCII: ESC  U  n
    十进制: 27 85 n
   十六进制: 1B  55 n
说明:
设置/取消单向打印。n=0~255,仅最低位有效。
当n=<×××××××1>B时,在字符方式下设置为准双向打印,在图形方式下设置为单向打印。
当n=<×××××××0>B时,设置双向打印。
默认值n=0。

ESC C             设定检测黑标的范围
格式:  ASCII: ESC  C    n
    十进制: 27 67 n
   十六进制: 1B  43 n
说明:
以当前的行距为单位,以行数来定义检测黑标的范围,默认值为4英寸。

ESC FF             执行走纸到黑标位置
格式:  ASCII: ESC  FF    
    十进制: 27 12
   十六进制: 1B  0C
说明:
该命令使打印机在一定长度范围寻找黑标,并在黑标位置停下。
若无黑标或检测不到黑标,那么要走完这段长度后停下。
若当前就在黑标位置,那么将不会有走纸动作。

ESC c 4            设定缺纸时停止打印
格式:  ASCII: ESC  c  4  n
    十进制: 27 99 52 n
   十六进制: 1B 63 34 n
说明:
设置/取消纸检测器检测到缺纸时停止打印。
N=0~255,仅最低位有效。
当n=<*******1>B时,纸检测器检测到缺纸时停止打印。
当n=<*******0>B时,纸检测器检测到缺纸时不停止打印,以便用户可以将最后一张单据打印至页底。
默认值n=1。

ESC c 5 n         允许/禁止走纸按键
格式:  ASCII: ESC c 3 n
    十进制:  27 99 33 n
   十六进制:  1B 63 35 n
说明:
当n=<*******1>B时,禁止纸按键。
当n=<*******0>B时,允许纸按键(默认值)。


ESC d             打印并进纸n字符行
格式:  ASCII: ESC  d  n
    十进制: 27 100 n
   十六进制: 1B 64 n
说明:
打印行缓存里的数据并向前走纸n行。
n=0~255。

ESC  i                全切纸命令
格式:  ASCII: ESC  i 
    十进制:  27 105
   十六进制:  1B 69
说明:
打印机控制切纸刀全切纸一次。

ESC  j n             退纸n/144英寸
格式:  ASCII: ESC  j n
    十进制:  27 106 n
   十六进制:  1B 6A n
说明:
当执行该指令时退纸n/144英寸(nx0.176mm)。
n=0~255。

ESC m               部分切纸命令
格式:  ASCII: ESC  m
    十进制: 27 109
   十六进制: 1B 6D
说明:
打印机控制切纸刀部分切纸一次。

ESC p              产生钱箱驱动脉冲
格式:  ASCII: ESC  p  m n1 n2
    十进制: 27 112 m n1 n2
   十六进制: 1B 70 m n1 n2
说明:
产生钱箱驱动脉冲。
m=0,1,48,49 0≤n1≤n2≤255
驱动脉冲形式为:



解释:
打开钱箱脉冲时间为n1×2毫秒。
关闭钱箱脉冲时间为n2×2毫秒。

ESC t                 选择字符集
格式:  ASCII: ESC  t  n
    十进制: 27 116 n
   十六进制: 1B 74 n
说明:
选择中文方式下的ASCII字符集。
0: 选择7×9字符集(默认值)。
1: 选择7×7字符集。


FS !                汉字综合选择
格式:  ASCII: FS  ! n
    十进制: 28 33 n
   十六进制: 1C 21 n
说明:
n的各位的定义如下:

位 0 1
0 无定义
1 无定义
2 宽正常 汉字倍高
3 高度正常 汉字倍高
4 无定义
5 无定义
6 无定义
7 无下划线 汉字下划线

FS &              进入汉字打印方式
格式:  ASCII: FS  &
    十进制: 28 38
   十六进制: 1C 26
说明:
打印机接收到该命令后,结束本行打印,从下一行开始转为汉字打印方式。
在汉字打印方式时,打印机接收的代码为2字节的标准机内码(均为大于9FH的码),根据该代码寻找打印机的硬汉字字模,打印国标15×16点阵的汉字。
打印机接收到单字节的ASCII码(20H-9FH)时,将打印出相应的5 ×7或7×7点阵字符。

FS ~ S           选择汉字打印速度
格式:  ASCII: FS  ~ S n
    十进制: 28 126 83 n
   十六进制: 1C 7E 53 n
说明:
此功能设置汉字打印模式时的打印速度,当n=1时为汉字高速打印,横向分辨率为144 DPI,纵向分辨率为72 DPI;
当n=0时为正常打印模式,横向分辨率为144 DPI,纵向分辨率为144 DPI 此模式为默认模式。

FS ·             退出汉字打印方式
格式:  ASCII: FS  ·
    十进制: 28 46
   十六进制: 1C 2E
说明:
  打印机接收到该命令后,退出汉字打印方式,转为正常的西文打印方式。

FS 2                  用户自定义汉字
格式:  ASCII: FS  2 a1 a2 d1 d2 d3 …d32
    十进制: 28 50 248 a2 d1 d2 d3 …d32
   十六进制: 1C 32 F8 a2 d1 d2 d3 d32
说明:
此功能为用户自定义汉字。
a1=F8(十六进制)
a2为A1与FE(十六进制)之间任意值。
因汉字代码为二字节,a1为第一字节,a2为第二字节,可定义94个汉字。



FS  S             设定全角汉字字间距
格式:  ASCII: FS  S n1 n2
    十进制: 28 83 n1 n2
   十六进制: 1C  53 n1 n2
说明:
0≤n1,n2≤127,n1决定字符左边间距,n2决定字符右边间距。
单位是1/160英寸,电源打开时的初始设定为n1=0,n2=2。

FS  T             设定半角汉字字间距
格式:  ASCII: FS  T n1 n2
    十进制: 28 84 n1 n2
   十六进制: 1C  54 n1 n2
说明:
0≤n1,n2≤127,n1决定字符左间距,n2决定字符右间距。
单位是1/180英寸,电源打开时的初始设定为n1=0,n2=2。

GS ( F pL pH a m nL nH  设置黑标定位偏移量
格式:  ASCII: GS ( F pL pH a m nL nH    
十进制: 29 40 70 pL pH a m nL nH
  十六进制: 1D 28 46 pL pH a m nL nH
说明:
该命令用于选择黑标定位控制允许,且设置切/撕纸位置或起始打
印位置相对于黑标检测的偏移量。该值以点数计算。
命令相关参数为:
pL+(pHx256)=4 即 pL=4,pH=0
1≤a≤2,
m=0,48
0≤(nL+nHx256)<1700


l a 用来选择设置切/撕纸位置或起始打印位置的偏移量。
a 功能
1 设置起始打印位置相对于黑标检测位置的偏移量
2 设置切/撕纸位置相对于黑标检测位置的偏移量
l m=0或48,选择偏移量为前进纸方向计算;
l nL,nH设置的偏移量对应实际距离为(nL+nHx256)×0.176mm
l 只有执行此命令后GS FF 和 GS V命令有关黑标定位操作方有效;
l 设置起始打印位置偏移量(a=1)在执行GS FF 命令时有效;
l 设置切/撕纸位置偏移量(a=2)在执行GS V m 命令时有效;
l 默认值为nL=nH=0,即黑标检测开关检测到黑标时,当前票面上对应打印头的位置为设定的起始打印位置,当前票面上对应切/撕纸口的位置为设定的切/撕纸位置。
l 关于切/撕纸位置偏移量和起始打印位置偏移量的计算说明
1、 切/撕纸位置到黑标印刷位置的距离L与打印机的固有机械值L0相同,而且切/撕纸位置到起始打印位置的距离Q与打印机构固定的机械值Q0相同时,即用GS( F命令所设置的偏移量均为0。
2、 当黑标印刷位置到切/纸位置的距离L小于打印的机械值L0时,GS( F命令的切/撕纸位置偏移量计算为:
切/撕纸位置偏移量=(L0—L)/0.176(点数)
3、 当黑标印刷位置到切/撕纸位置的距离L大于打印机的机械值L0时,GS( F命令的切 /撕纸位置偏移量计算为:
切/撕纸位置偏移量=(L0+相邻两黑标间的距离—L)/0.176(点数)。
注意:在设置切/撕纸位置偏移量时,GS 〈 F命令的参数a应为2。
4、 当切/撕纸位置偏移量不为零或每单的起始打印位置到切/撕纸位置的距离Q大于打印机的机械值Q0)时,GS( F命令的切/撕纸位置偏移量计算为:
起始打印位置偏移量=(Q—Q0)/0.176 +切/撕纸位置偏移量。
注意:在设置切/撕纸位置偏移量时,GS 〈 F命令的参数a应为1。
5、 打印结构M—U110(051)的固有机械值
L0=39mm, Q0=11mm,
当打印机构安装在机壳内,使得撕纸位置和打印起始位置的固有机械值发生改变时
L0=39+△L Q0=11+△L
6、 △L的测量方法如下:
1) 先将空白打印纸装入打印机械,撕去出纸口上多余的打印纸
2) 给打印机发20个字符“E”,打印在打印纸上
3) 让打印机发走出足够长度,测量纸端到打印字符“EEEEEEEEEEEEEEEEEEEE”的上沿距离,该值减去11mm,即为△L。切/撕纸位置起始打印位置

GS FF           送黑标纸至打印起始位置
格式:  ASCII: GS  FF
    十进制: 29 12
   十六进制: 1D 0C
说明:
该命令仅在黑标定位控制允许条件(GS ( F pL pH a m nL nH)下有效。
检测黑标并前送纸至GS( F(a=1)命令设置确定的打印起始位置。
当黑标纸已在当前打印起始位置上,则不执行进纸操作。

GS V m           送黑标纸到切/撕纸位置
格式:  ASCII: GS  V m
    十进制: 29 86 m
   十六进制: 1D 56 m
说明:
当m =0,1,48,49时打印机执行送纸
当选择黑标定位有效时,前送纸距离有GS ( F(a=2)命令设置的参数确定。
当禁止黑标定位(未设置或正确设置GS ( F命令)时,该命令无效。

GS V                走纸到切纸位置
格式:① ASCII: GS  V m
    十进制: 29 86 m
十六进制: 1D 56 m
② ASCII: GS  V m n
    十进制: 29 86 m n
十六进制: 1D 56 m n
说明:
①m=1,49。②m=66,0≤n≤255
M 解 释
1,49 部分切纸(无切刀则无切纸动作)
66 走纸到(切纸位置+n×1/144英寸)位置并部分切纸(无切纸刀则无切纸动作)

GS *                下装自定义点图
格式:  ASCII: GS  * n1 n2 [d]k
    十进制: 29 42 n1 n2 [d]k
   十六进制: 1D 2A n1 n2 [d]k
说明:
GS *命令主要用于将重复打印单据中不变的徵标等大量图形数据一次性下装到打印机内贮存起来,在重复打印单据时只需送GS /命令随时打印出所下装的点图。







下装的点图数据格式如下:
n1*8点
…….. n2*n1*7+1


n2*8点 …….. n2*n1*7+2
. .
: :
…….. n2*n1*8

其中:1〈 n1〈35,1〈 n2〈64,并要求 n1* n2〈315,k=0……n1*n2*8
下装的数据量为:n1* n2*8。
第二次执行GS *命令时,会将以前由GS *命令下装的点图数据清除,装入当前GS *命令的下装数据。
执行ESC @初始化命令不会清除下装点图数据。

GS /           将下装点图装入打印缓冲区
格式:  ASCII: GS  / n
    十进制: 29 47 n
   十六进制: 1D 2F n
说明:
GS /命令将由GS *命令定义的下装点图按照参数n的设置不同密度装入打印缓冲区。并打印出全图。
N 点图方式 纵向密度 横向密度
0 正常方式 144dpi 160dpi
1 双倍宽方式 144dpi 80dpi
2 双倍高方式 72dpi 160dpi
3 双倍高倍宽方式 72dpi 80dpi

附录一  打印命令表

命令(ASCII) 十六进制 功能说明
HT 09 打印位置进行到下一水平制表位置
LF 0a 打印行缓冲器里的内容,并向前走纸一行
CR 0D 打印回车
ESC SP 1B 20 n 设置字符右边的字间距为n个半点距(1/140英寸)
ESC ! 1B 21 n 选择打印字符的大小和下划线
ESC % 1b 25 n 允许/禁止用户自定义字符集
ESC & 1B 26 s n m a d1..dn 设置用户自定义字符集
ESC * 1B 2A m n1 n2 置点阵图形打印
ESC 2 1B 32 设定1/6英寸换行量
ESC 3 1B 33 设置字符行间距为n/8英寸
ESC 〈 1B 3C 打印头归位
ESC @ 1B 40 初始化打印机
ESC D 1B 44 设置水平制表值,最迟多可设置32个
ESC D NULL              1B 44 0 消除所有的水平制表位置
ESC J 1B 4A n 执行n/144英寸走纸
ESC R 1B 52 n 选择n个不同国家的不同ASCII字符集
ESC U 1B 55 n 设置/取消单向打印方式
ESC C 1B 43 n 设定检测黑标的范围
ESC FF 1B 0C 执行走纸到黑标位置
ESC c 4 1B 63 34 设置/取消缺纸时停止打印
ESC c 5 n 1B 63 35 允许/禁止走纸按键
ESC d 1B 64 打印并进纸n字符行
ESC i 1B 69 切纸刀命令
ESC j n 1B 6A 退纸n/144英寸
ESC m 1B 6D 执行部分切纸
ESC p 1B 70 产生钱箱驱动脉冲
ESC t 1B 74 选择字符集
FS ! 1C 21 汉字综合选择
FS & 1C 26 进入汉字打印方式
FS ~ S 1C 7E 53 选择汉字打印速度
FS · 1C 2E 退出汉字打印方式
FS 2 1C 32 用户自定义汉字
FS S 1c 53 n1 n2 设定全角汉字字间距
FS T 1c 54 n1 n2 设定半角汉字字间距
GS ( F pL pH a m nL nH 1D 28 46 pL pH am nL nH 设置黑标定位偏移量
GS FF 1D 0C 送黑标纸至打印起始位置
GS V m 1D 56 m 送黑标到切/撕纸位置
GS V 1D 56 走纸到切纸位置
G * 1D 2A n1 n2 下装自定义点图
GS / 1D 2F 将下装的位图装入打印缓冲区

BS-300KS控制命令

1、换行
  LPRINT CHR$(10)
2. 换页
  LPRINT CHR$(12)
3、PK模式驱动钱箱指令
  ESC | r F9 M n1 n2
  M =0 代表一个钱箱 n代表脉冲宽度 n1 =40--50 之间
  M =1 代表两个钱箱 n2 =120--150之间
  QBASIC下编程举例
  LPRINT CHR$(27);"|";"r";CHR$(249);CHR$(0); CHR$(50);CHR$(150)

3、POS模式驱动钱箱指令
  ESC p M n1 n2
  M =0 代表一个钱箱 n代表脉冲宽度 n1 =40--50 之间
  M =1 代表两个钱箱 n2 =120--150之间
  QBASIC下编程举例
  LPRINT CHR$(27);CHR$(112);CHR$ (0);CHR$ (50);CHR$(200)

4、 BS300K可同时打开两个钱箱

  当接 2、4 时钱箱1打开 ,接4、5时钱箱2打开

5、条码打印指令
  ASC II: Fs p n s h m k d1 d2… dk
  十进制码: 28 80 n s h m k d1 d2…dk
  十六进制码: 1C 50 n s h m k d1 d2…dk

***** 八种常用类型条码命令*****
(1) EAN--13在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(1);CHR$(2);CHR$(2);CHR$(3) CHR$(12);"012345678901"
(2) EAN--8在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(2);CHR$(2);CHR$(2);CHR$(3);CHR$(7);" 4718290"
(3) UPC--A在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(3);CHR$(2);CHR$(2);CHR$(3);CHR$(11);"012345678900"
(4) UPC--E在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(4);CHR$(2);CHR$(2);CHR$(3);CHR$(7);"0143121"
(5) CODE--39在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(5);CHR$(2);CHR$(2);CHR$(3);CHR$(8);"*C0DE39*"
(6) INTERLEAVED--25在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(6);CHR$(2);CHR$(3);CHR$(3);CHR$(4);"3214"
(7) CODABAR在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(7);CHR$(2);CHR$(2);CHR$(3);CHR$(5);"D123D"
(8) CODE--128在QBASIC下编程举例
LPRINT CHR$(28);CHR$(80);CHR$(8);CHR$(2);CHR$(2);CHR$(3);CHR$(5);CHR$(137);"C128"


6、屏蔽换页功能指令
   LPRINT CHR$(27);"|";"w"; CHR$(36);CHR$(1);
   1为屏蔽换页
   0为恢复换页功能

7.切纸刀在PK模式下切纸
   ESC ;"|r"; CHR$(&H0FA)
   在QBASIC下编程例子
   10 FOR i=1 TO 10
   20 FOR j=1 TO 10
   30 LPRINT "0123456789"
   35 NEX J
   40 LPRINT
   41 LPRINT
   42 LPRINT
   43 LPRINT
   44 LPRINT
   45 LPRINT
   46 LPRINT
   47 LPRINT
   50 LPRINT CHR$(27); "|r"; CHR$(&HFA)
   60 NEXT
   70 END


8.切纸刀在POS模式下切纸
   ESC ;"i"; CHR$(0)
   在QBASIC下编程例子
   10 FOR i=1 TO 10
   20 FOR j=1 TO 10
   30 LPRINT "0123456789"
   35 NEX J
   40 LPRINT
   41 LPRINT
   42 LPRINT
   43 LPRINT
   44 LPRINT
   45 LPRINT
   46 LPRINT
   47 LPRINT
   50 LPRINT CHR$(27); "i"; CHR$(0)
   60 NEXT 0全切
   70 END 1半切


9 黑标检测功能
   ESC C n n代表两黑标距离
   10 LPRINT CHR$(27);"C";CHR$(60);
   确实找黑标范围要大于两黑标距离
   20 LPRINT CHR$(27);"|r";CHR$(&HF5);
   寻找到黑标位置
   30 LPRINT "123456" 找到黑标就打印
   40 LPRINT "abcdef"
   50 LPRINT "efghj"

10 设定单向或双向打印
   LPRINT CHR$(27);CHR$(85); CHR$(n);
   n=1 单向打印
   n=0 双向打印

11 设定在windows下开钱箱功能
   LPRINT CHR$(27);"|w";CHR$(45);CHR$(n);
   n=0 FF走纸命令时钱箱无效
   n=1 钱箱1打开
   n=2 钱箱2打开



12、切纸功能的设定、(包括入纸高度。页长。切纸位)
   10 LPRINT CHR$(27);"|w";CHR$(1);CHR$(0); 开机初始入纸的位置,高8位
   20 LPRINT CHR$(27);"|w";CHR$(2);CHR$(0); 开机初始入纸的位置,低8位
   60 LPRINT CHR$(27);"|w";CHR$(36);CHR$(0); 设定换页功能有效
   70 LPRINT CHR$(27);"|w";CHR$(40);CHR$(0); 换页时切纸功能无效
   80 LPRINT CHR$(27);"|w";CHR$(38);CHR$(0) 页长调整,低8位
   90 LPRINT CHR$(27);"|w";CHR$(39);CHR$(0);页长调整,高8位
   110 LPRINT CHR$(27);"|w";CHR$(41);CHR$(0);切纸时往上走纸距离的低8位
   120 LPRINT CHR$(27);"|w";CHR$(42);CHR$(0);切纸时往上走纸距离的低8位
   130 END



13、BS300K中可通过接口对以下各单元进行设置,格式如下:(以QBASIC为例)
   10 LPRINT CHR$(27);"|W";CHR$(n1);CHR$(n2)
   20 END
   N1表示单元位置,N2表示对单元写入值

14 N1单元位置
   1 开机初始入纸的位置,高8位,出厂值=02H
   2 开机初始入纸的位置,低8位,出厂值=5CH,即从检测纸传感器位置走纸025CH/432 英 寸。
   32 =AAH则允许条码打印,=0则不打(出厂=0)。
   36 =1,换页(FF)命令无效,=0有效(=0)。
   38 页长调整,低8位。
   39 页长调整,高8位 ,若该单元bit7=1,则为负调整;bit7=0,为正向调整,值为(39)(38) AND 7FFFH。
   40 换页时的切纸功能,=0,无效;=1,有效(=0)。
   41 切纸时往上走纸距离的高8位,(=01H)。
   42 切纸时往上走纸距离的低8位,(=0DCH),单位=1/432英寸。
   43 切纸时往下退纸距离的高8位,(=01H)。
   44 切纸时往下退纸距离的高8位,(=0DCH),单位=1/432英寸。
   如要使用切纸功能,需要先使(36)=0,(40)=1,然后对(41),(42),(43),(44)的值做相应调整。

15。注意事项:
   当打印机检测到错误时,会用面板的LED来提示错误类型:
   1 ONLINE灯闪,打印头电机部分出错。
   2 READY灯闪,EEPROM读/写出错。
   3 PAPER灯闪,RAM出错 。
   4 ONLINE+READY灯闪,打印头温度过高,或热敏电阻出错。
   5 ONLINE+PAPER灯闪,切纸刀不能复位。

16。设定汉字打印、下线、1/4角汉字、半角汉字、倍宽、倍宽汉字

位   “1”  “0”
------------------------------------------
7   下划线   取消
6         取消
5   下标汉字  取消
4  选择1/4角汉字 取消
3  倍高汉字   取消
2  倍宽汉字   取消
1  半角汉字   取消
0  纵向打印  横向打印

The Epson Connection: Atari XE/XL

Epson Printer
---
Epson Printer Control Codes





Following are control codes for all Epson printers. Some of the functions are not available on all printers, and we've marked them with an asterisk. Refer to your printer's manual to see if it will perform the listed function, or just send the control code and see what happens. (We have not noted with asterisks some functions of which printers are capable, but which may not be available through Epson PICs or other interface devices for certain computers.)
From the BASIC programming language, the function is called with a command like LPRINT CHR$(27)"P"; in other words, placing the command LPRINT before the command shown below. From some applications, the command below can be entered after a symbol that tells the printer a control code is coming.
A lower case "n", as in CHR$(n), means a numeric value must be inserted.

CHARACTER PITCH CONTROL CODE
Compressed On
CHR$(27) CHR$(15) or CHR$(15)

Off
CHR$(27) CHR$(18) or CHR$(18)
Expanded On
CHR$(27) "W1"

Off
CHR$(27) "WO"
Expanded (one On
CHR$(27) CHR$(14) or CHR$(14)
line only) Off
CHR$(27) CHR$(20) or CHR$(20)
*Elite On
CHR$(27)"M"

Off
CHR$(27)"P"
*Proportional On
CHR$(27)"p1"

Off
CHR$(27)"p0"

PRINT ENHANCEMENTS

Emphasized On
CHR$(27)"E"

Off
CHR$(27)"F"
Doublestroke On
CHR$(27)"G"

Off
CHR$(27)"H"
*Italics On
CHR$(27)"4"

Off
CHR$(27)"5"
Underline On
CHR$(27)" -1"

Off
CHR$(27)" - 0"
*Superscript On
CHR$(27)"S0"

Off
CHR$(27)"T"
*Subscript On
CHR$(27)"S1"

Off
CHR$(27)"T"
*NLQ On
CHR$(27)"x1"

Off
CHR$(27)"x0"
*Master Select
CHR$(27)"!" CHR$(n)
International
On
CHR$(27)"R" CHR$(n)
characters Off
CHR$(27)"R" CHR$(0)

HORIZONTAL MOVEMENT

Set left margin
CHR$(27)"1" CHR$(n)
Set right margin
CHR$(27)"Q" CHR$(n)
Next tab
CHR$(9)
*Set tabs

CHR$(27)"D" CHR$(n) CHR$(n). . .
Carriage return
CHR$(13)
Backspace
CHR$(8)
Unidirectional On
CHR$(27)"U1"

Off
CHR$(27)"U0"
Unidirectional
CHR$(27)"<"
(one line only)



VERTICAL MOVEMENT

Line feed
CHR$(10)
Form Feed
CHR$(12)
Skip over perf
On
CHR$(27)"N" CHR$(n)

Off
CHR$(27)"O"
Vertical tab
CHR$(11)
*Set vert. tab


Channel 0 (all)
CHR$(27)"B" CHR$(n) CHR$(n). . .
Channel nn
CHR$(27)"b" CHR$(nn) CHR$(n). . .
*Select vert. channel
CHR$(27)"/" CHR$(nn)
Set page length


Lines

CHR$(27)"C" CHR$(n)
Inches
CHR$(27)"C0" CHR$(n)

GRAPHICS

Single density 60 dpi CHR$(27)"K" CHR$(nl) CHR$(n2)
Double density 120 dpi CHR$(27)"L" CHR$(nl) CHR$(n2)
*High speed 120 dpi CHR$(27)"Y" CHR$(nl) CHR$(n2)
*Quadruple 240 dpi CHR$(27)"Z" CHR$(n1) CHR$(n2)

9-pin single 60 dpi CHR$(27)"^" CHR$(1) CHR$(n1)


CHR$(n2)
9-pin double 120 dpi CHR$(27)"^" CHR$(2) CHR$(n1)


CHR$(n2)
n2*256+n1=number of columns reserved for graphics
Full 8-inch line, 1920 columns =CHR$(128)CHR$(7)

USER DEFINED CHARACTERS
Copy ROM to RAM
CHR$(27)":" CHR$(0) CHR$(0)


CHR$(0)
Use RAM set
CHR$(27)"%" CHR$(1) CHR$(0)
Define characters
CHR$(27)"&" CHR$(nl) CHR$(n2)
nl-n2 range of characters to be redefined
Expand redefine On
CHR$(27)"6"
area Off
CHR$(27)"7"

OTHER CODES
Sound beeper CHR$(7)
Select printer CHR$(17)
Deselect printer CHR$(19)
Disable paper-out CHR$(27)"8"
Enable CHR$(27)"9"
*Immediate print CHR$(27)"i"
*Half-speed mode CHR$(27)"s"
Cancel print buffer CHR$(24)
Cancel last char. in CHR$(127)
buffer

*Cut-sheet feeder CHR$(27)"EM"
*MSB =1 CHR$(27)">"
*MSB = 0 CHR$(27)"="
Cancel MSB Setting CHR$(27)"#"

如何從 Internet Explorer 使用 VB ActiveX 元件將 Word 自動化

參考官網-微軟

ActionScript 3.0 語言和組件參考

ActionScript 3.0 語言和組件參考

delphi 園地

delphi 園地

讚喔,有空也研究其他語言

發票機的列印注意事項

參考
----------
1.請先確認用來連接發票機的連接線接電腦端的是什麼介面...
通常是RS-232..接COM PORT, 如果電腦沒有COM PORT可用USB轉COM PORT連接線取代,
但USB轉COM的Driver要安裝正確.

2.不論是用USB轉COM or 直接接電腦COM PORT...在裝置管理員上都可以查到使用的
COM連接埠編號..COM1 OR COM2,3....這必須與你在程式上設定的PORT NAME是一致的.
例如:
Dim sPortNames() As String = SerialPort.GetPortNames()
Dim invoicePrinter As SerialPort = New SerialPort(sPortNames(0), 9600, Parity.None, 8, StopBits.One)
那麼請確認一下sPortNames(0)是否與實際連接的PORT名稱是一樣的.
或直接寫上PORT NAME,例如是接在裝置管理員上定義為COM1的PORT:
Dim invoicePrinter As SerialPort = New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)

3.既然傳輸率是設9600,None,8,1請再到裝置管理員上確認連接埠設定的值是否一致.
還有印表機本身硬體上指撥開關的設定是否一致.

4.另外建議加一條 invoicePrinter.Open()是否成功的判斷式在open之後,
Try
If invoicePrinter.IsOpen = True then
'開始輸出
End If
Catch ex as Exception
'顯示錯誤訊息
End Try

5.程式1是呼叫serial port去輸出ESC Command,所以不用安裝Driver..廠商沒有說錯.
請先核對一下你使用的發票印表機指令,建議先送一條初始化指令給印表機,
看看印表機是否會移動一下印字頭...前提是印表機在ON LINE READY狀態下..

LPT1 port (vb.net)

Public Class Win32API

Public Const GENERIC_WRITE = &H40000000
Public Const CREATE_ALWAYS = 2
Public Const OPEN_EXISTING = 3

Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, _
ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, _
ByVal hTemplateFile As Integer) As Integer

Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" _
(ByVal hObject As Long) As Long

End Class

Public Sub WriteToPort(ByRef sPort As String, ByRef sText As String)

Dim FileHandle As Long
Dim FileHandleIntPtr As IntPtr
Dim FStream As FileStream
Dim SWriter As StreamWriter

FileHandle = Win32API.CreateFile(sPort, Win32API.GENERIC_WRITE, 0, 0, Win32API.CREATE_ALWAYS, 0, 0)

FileHandleIntPtr = New IntPtr(FileHandle)

FStream = New FileStream(FileHandleIntPtr, FileAccess.Write, False)

FStream.Flush()

SWriter = New StreamWriter(FStream)

SWriter.WriteLine(sText)

FStream.Flush()

SWriter.Close()

FStream.Close()

Win32API.CloseHandle(FileHandle)

End Sub

2010年8月11日 星期三

VB.Net連結遠端SQL資料庫(完整版)

原出處

1.首先必須先匯入元件


2.宣告必須變數

' 資料集物件的類別層級建立
Dim ds As DataSet = New DataSet
' CurrencyManager 物件的類別層級宣告
Dim bmCategory As BindingManagerBase
' 資料配接器物件的類別層級建立
Dim limingDA As SqlDataAdapter = New SqlDataAdapter
' 資料表物件的類別層級宣告
Dim dtLiming As DataTable
' CurrencyManager 物件的類別層級宣告
Dim bmLiming As BindingManagerBase

'設定資料庫預設變數
Dim SQL_Server As String = "TONY-SLO"
Dim SQL_DBName As String = "slo"
Dim SQL_Table As String = "Friend"

--
3.副程式名稱一覽表
SetDataBase() ---> 設定資料庫
SetPrintData() ---> 設定顯示資料欄位
PrintPoint() ---> 設定資料記錄目前位置訊息的初值
MoveData(ByVal i As Int16) ---> 移動資料
AddData() ---> 新增資料記錄
DeleteData() ---> 刪除資料記錄
UpdateData() ---> 更新資料記錄

4.寫入副程式

Private Sub SetDataBase()
Dim SQL_Select As String = "SELECT * FROM " & SQL_Table

' 建立一個資料連接
Dim con As New SqlConnection("Server=" & SQL_Server & ";Database=" & SQL_DBName & ";Integrated Security=SSPI")
limingDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
limingDA.SelectCommand = New SqlCommand(SQL_Select, con) ' 設定資料配接器的 SelectCommand 屬性
ds.Tables.Clear() ' 移除資料集內的所有資料表
Try
con.Open() ' 開啟連接
Dim nRowsCount As Integer = limingDA.Fill(ds, SQL_Table) ' 將所提取的資料填入資料集內的資料表中
con.Close() ' 關閉連結
dtLiming = ds.Tables(SQL_Table) ' 連結資料表
bmLiming = Me.BindingContext(dtLiming) ' 取得代表資料表的 CurrencyManager 物件
For Each myControl As Control In Controls
myControl.DataBindings.Clear() ' 清除資料
Next
SetPrintData() '設定顯示資料欄位
PrintPoint() '設定資料記錄目前位置訊息的初值
Catch ex As Exception
MessageBox.Show(ex.Message, "請注意") '如有錯誤顯示錯誤訊息
End Try
End Sub

Private Sub AddData()
' 新增資料記錄的 INSERT 陳述式
Dim SQL_Select As String = _
"INSERT into " & SQL_Table & " VALUES (" & _
"'" & TextBox1.Text & "'," & _
"'" & TextBox2.Text & "'," & _
"'" & TextBox3.Text & "'," & _
"'" & ComboBox1.Text & "')"

' 建立一個資料連接
Dim con As New SqlConnection("Server=" & SQL_Server & ";Database=" & SQL_DBName & ";Integrated Security=SSPI")
Dim insertCMD As New SqlCommand(SQL_Select, con) ' 使用 SqlCommand 類別的第三個建構函式來建立 SqlCommand 物件
Try
con.Open() ' 開啟連接
insertCMD.ExecuteNonQuery() ' 執行資料命令來新增資料記錄
MessageBox.Show("已經成功新增資料記錄。", "恭喜您", MessageBoxButtons.OK, MessageBoxIcon.Information)
SetDataBase()
Catch ex As Exception
MessageBox.Show(ex.ToString(), "請注意", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Finally
con.Close() ' 關閉連接
End Try
End Sub

Private Sub DeleteData()
' 刪除資料記錄的 DELETE 陳述式
Dim SQL_Select As String = "DELETE " & SQL_Table & " WHERE 欄位1 = " & "'" & Val(TextBox1.Text) & "'"

' 建立一個資料連接
Dim con As New SqlConnection("Server=" & SQL_Server & ";Database=" & SQL_DBName & ";Integrated Security=SSPI")
Dim deleteCMD As New SqlCommand(SQL_Select, con) ' 使用 SqlCommand 類別的第三個建構函式來建立 SqlCommand 物件
Try
con.Open() ' 開啟連接
deleteCMD.ExecuteNonQuery() ' 執行資料命令來刪除資料記錄

MessageBox.Show("已經成功刪除資料記錄。", "恭喜您", MessageBoxButtons.OK, MessageBoxIcon.Information)
SetDataBase()
Catch ex As Exception
MessageBox.Show(ex.ToString(), "請注意", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Finally
con.Close() ' 關閉連接
End Try
End Sub

Private Sub UpdateData()
' 更新資料記錄的 UPDATE 陳述式
Dim SQL_Select As String = _
"UPDATE " & SQL_Table & _
" SET 欄位1=" & TextBox1.Text & _
" ,欄位2=" & "'" & TextBox2.Text & "'" & _
" ,欄位3=" & "'" & TextBox3.Text & "'" & _
" WHERE 欄位1 = " & TextBox1.Text

' 建立連接
Dim con As SqlConnection = New SqlConnection("Server=TONY-SLO;Database=slo;Integrated Security=SSPI")
Dim updateCMD As New SqlCommand(SQL_Select, con) ' 使用 SqlCommand 類別的第三個建構函式來建立 SqlCommand 物件
Try
con.Open() ' 開啟連接
updateCMD.ExecuteNonQuery() ' 執行資料命令來更新資料記錄
MessageBox.Show("已經成功更新資料記錄。", "恭喜您", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.ToString(), "請注意", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Finally
con.Close() ' 關閉連接
End Try
End Sub

Private Sub SetPrintData()
'設定顯示資料欄位
TextBox1.DataBindings.Add("Text", dtLiming, "欄位1")
TextBox2.DataBindings.Add("Text", dtLiming, "欄位2")
TextBox3.DataBindings.Add("Text", dtLiming, "欄位3")
End Sub

Private Sub PrintPoint()
'設定資料記錄目前位置訊息的初值
TextBoxPosition.Text = String.Format("資料記錄:目前位置 {0} 總數 {1}", bmLiming.Position + 1, bmLiming.Count)
End Sub

Private Sub MoveData(ByVal i As Int16)
'移動資料
Select Case i
Case 1 '第一筆
bmLiming.Position = 0
Case 2 '上一筆
bmLiming.Position -= 1
Case 3 '下一筆
bmLiming.Position += 1
Case 4 '最後一筆
bmLiming.Position = bmLiming.Count - 1
End Select
PrintPoint() '設定資料記錄目前位置訊息的初值
End Sub

Using SqlParameter Class

原出處

Imports Namespace: System.Data.SqlClient

' Insert string
Dim sql As String = " INSERT INTO tblZipCode([ZIPCODE], [STATE], [CITY], [TestDate]) VALUES(@ZIPCODE, @STATE, @CITY), @TestDate"

' Create sql parameter
Dim param(3) As SqlParameter

param(0) = New SqlParameter("@ZIPCODE", SqlDbType.VarChar)
param(0).Value = "60000"

param(1) = New SqlParameter("@STATE", SqlDbType.VarChar)
param(1).Value = "Statename"

param(2) = New SqlParameter("@CITY", SqlDbType.VarChar)
param(2).Value = "Cityname"

' Recommend to use sql param when you try to send datetime value
param(3) = New SqlParameter("@TestDate", SqlDbType.DateTime)
param(3).Value = DateTime.Now

' Create Connection string
Dim sConnection As New SqlConnection("server=(local);uid=sa;pwd=pass;database=db")
sConnection.Open()

' Create Sql Command
Dim command As SqlCommand = sConnection.CreateCommand()
command.CommandText = sql

' Add Parameter to command
command.Parameters.AddRange(param)

' Execute command
Dim nResult As Integer = command.ExecuteNonQuery()

If nResult > 0 Then
Console.WriteLine("Insert completed")
End If

sConnection.Close()
command.Dispose()

WillAsrari.aspx.cs

WillAsrari
內容不錯,篇章還等原作者加入中;有空可參考文章

Retrieving records with a Console Application

Imports System.Data.SqlClient
Imports System.Console
Module Module1

Dim myConnection As SqlConnection
Dim myCommand As SqlCommand
Dim dr As SqlDataReader

Sub Main()
Try
myConnection = New SqlConnection("server=localhost;uid=sa;pwd=;database=pubs")
'you need to provide password for sql server
myConnection.Open()
myCommand = New SqlCommand("Select * from discounts", myConnection)
dr = myCommand.ExecuteReader
Do
While dr.Read()
WriteLine(dr(0))
WriteLine(dr(1))
WriteLine(dr(2))
WriteLine(dr(3))
WriteLine(dr(4))
' writing to console
End While
Loop While dr.NextResult()
Catch
End Try
dr.Close()
myConnection.Close()
End Sub

End Module

Code to Retrieve Data using Select Command

Imports System.Data.SqlClient
Public Class Form1 Inherits System.Windows.Forms.Form
Dim myConnection As SqlConnection
Dim myCommand As SqlCommand
Dim dr As New SqlDataReader()
'declaring the objects

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)_
Handles MyBase.Load
myConnection = New SqlConnection("server=localhost;uid=sa;pwd=;database=pubs")
'establishing connection. you need to provide password for sql server
Try
myConnection.Open()
'opening the connection
myCommand = New SqlCommand("Select * from discounts", myConnection)
'executing the command and assigning it to connection
dr = myCommand.ExecuteReader()
While dr.Read()
'reading from the datareader
MessageBox.Show("discounttype" & dr(0).ToString())
MessageBox.Show("stor_id" & dr(1).ToString())
MessageBox.Show("lowqty" & dr(2).ToString())
MessageBox.Show("highqty" & dr(3).ToString())
MessageBox.Show("discount" & dr(4).ToString())
'displaying the data from the table
End While
dr.Close()
myConnection.Close()
Catch e As Exception
End Try
End Sub

End Class

VB/ VBA/ C#/ Java/ C++ 語言學習筆記

VB/ VBA/ C#/ Java/ C++ 語言學習筆記

這Blog 非常多好文章唷

passing empty string to SqlCommand.Parameter.Add

ColumnName DataType Length AllowNulls
sampleKey char 10
engDesc char 40 Yes
frDesc char 40 Yes
When I try to add a record,if the Textbox is empty then I am getting an errror. If it's not empty then it adds to the table. But in database, I checked those fields to accept null values. Here is the sample code below.


Dim sqlQuery as String = "INSERT INTO SampleTable(sampleKey,engDesc,frDesc) VALUES (@key,@english,@french)"

Dim cmd As SqlCommand = SqlConnection1.CreateCommand

cmd.Parameters.Add("@key", txtKey.Text)
cmd.Parameters.Add("@english", txtEnglish.Text)
cmd.Parameters.Add("@french", txtFrench.Text)
cmd.CommandType = CommandType.Text
cmd.CommandText = sqlQuery

SqlConnection1.Open()
cmd.ExecuteNonQuery()
SqlConnection1.Close()

2010年8月5日 星期四

刪除在 Table 內重複的資料列

有時候表格內發生了重複的資料列,造成 PK 或者 Unique key 無法建立,在大量的表格內要找出發生違反 constraint 的 data ,可以使用下列的程序發現,再給予刪除後即可以重新建立 constraint 。



Example:

Table name: test

SQL> select * from test;

ID ID1 ID2

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

1 2 3

1 2 5

1 7 5

1 7 5

7 7 5



你可以發現重複了一筆資料 (1,7,5) ,如果我們要在 (ID,ID1,ID2 上建立 PK OR UNIQUE CONSTRAINT ,必須先做個資料清除動作 )



1. 確認表格內是否有重複的資料列

SQL> select id,id1,id2,count(*) from test group by id,id1,id2 having count(*) > 1;

ID ID1 ID2 COUNT(*)

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

1 7 5 2

(1,7,5) 出現了兩筆重複的資料



2 .保守起見,先建立一個 EXCEPTION TABLE 來儲存重複的 ROW

SQL>@[ORACLE HOME 目錄]\rdbms\admin\utlexcpt

SQL> @D:\ORACLE\ORA90\RDBMS\ADMIN\UTLEXCPT;

以建立表格

SQL> alter table test add constraint test_pk primary key (id ,id1,id2)

2 exceptions into exceptions;

alter table test add constraint test_pk primary key (id ,id1,id2)

*

ERROR 在行 1:

ORA-02437: 無法驗證 (SYS.TEST_PK) - 主索引鍵違規

SQL> select count(*) from exceptions;

COUNT(*)

----------

2

有兩筆重複資料列。



3 .直接刪除重複的資料列

SQL> delete from test where rowid not in (select min(rowid) from test group by id,id1,id2);

已刪除 1 個資料列 .

SQL> select * from test;

ID ID1 ID2

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

1 2 3

1 2 5

1 7 5

7 7 5

2010年8月3日 星期二

SqlBulkCopy加载其他源数据到SqlServer

原出處

protected void btnBulkCopy_Click(object sender, EventArgs e)
{
String ShajarConString =ConfigurationManager.ConnectionStrings["DSN_Shajar"].ConnectionString;
String NorthWindConString = ConfigurationManager.ConnectionStrings["DSN_Northwind"].ConnectionString;
SqlConnection ShajarCon = new SqlConnection(ShajarConString);
SqlConnection NorthwindCon = new SqlConnection(NorthWindConString);
string sql1 = " SELECT ID, First_Name, Last_Name, " +
" 'Shajar' as Source FROM MailingList_Temp ";
SqlCommand ShajarCom = new SqlCommand(sql1,ShajarCon);
SqlDataReader ShajarReader;
ShajarCon.Open();

SqlBulkCopy NorthWindBulkOp= new SqlBulkCopy(NorthWindConString, SqlBulkCopyOptions.UseInternalTransaction);

NorthWindBulkOp.DestinationTableName = "Employees";

NorthWindBulkOp.ColumnMappings.Add("Id", "EmployeeID");
NorthWindBulkOp.ColumnMappings.Add("First_Name", "FirstName");
NorthWindBulkOp.ColumnMappings.Add("Last_Name", "LastName");

SqlBulkCopyColumnMapping JobTitleColMap= new SqlBulkCopyColumnMapping("Source1", "Title");
NorthWindBulkOp.ColumnMappings.Add(JobTitleColMap);
NorthWindBulkOp.BulkCopyTimeout = 500000000;

NorthWindBulkOp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied);

NorthWindBulkOp.NotifyAfter = 1000;

ShajarReader = ShajarCom.ExecuteReader();

try
{
NorthWindBulkOp.WriteToServer(ShajarReader);
}
catch (Exception ex)
{
lblResult.Text = ex.Message;
}
finally
{
ShajarReader.Close();
}
}

private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
{
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied
";
}

-----------
大批量文本数据导入:
private string[] currentRow;
private int myRowCount = 1;
private int myBatchCount = 1;
private long myCopiedRows = 0;
private long countStart;

private DataTable myTable = new DataTable();

private void btnGoBulkCopy_Click(object sender, EventArgs e)
{
//Create myTable DataColumn...

using(TextFieldParser myReader = new TextFieldParser(@"data.txt"))
{
// 表示文件内容是字符分隔。
myReader.TextFieldType = FieldType.Delimited;
// 定义文字文件的字符分隔符。
myReader.Delimiters = new string[] {","};
// 循环处理文字文件中所有数据列的所有字段。
while(!myReader.EndOfData)
{
try
{
currentRow = myReader.ReadFields();
// 略过标题列
if(myRowCount > 1)
{
myTable.Rows.Add(currentRow);
}
}
catch(MalformedLineException ex)
{
MessageBox.Show(ex.Message);
return;
}

myRowCount += 1;
this.lblBeingCopyedTextRows.Text = myTable.Rows.Count.ToString();
this.lblBeingCopyedTextRows.Refresh();

if(myTable.Rows.Count == 50000)
{
try
{
GoBulkCopy();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

myTable.Rows.Clear();
myBatchCount += 1;
}
}

if(myTable.Rows.Count > 0)
{
GoBulkCopy();
}
}
}

private void GoBulkCopy()
{
SqlConnectionStringBuilder sqlconStringBuilder = new SqlConnectionStringBuilder();
sqlconStringBuilder.DataSource = @"(local)\SQLExpress";
sqlconStringBuilder.InitialCatalog = "Northwind";
sqlconStringBuilder.IntegratedSecurity = true;
using(SqlConnection con_bulkcopy =
new SqlConnection(sqlconStringBuilder.ConnectionString))
{
con_bulkcopy.Open();
SqlCommand cmdRowCount = new SqlCommand(
"SELECT COUNT(*) FROM dbo.Bulk_Target",
con_bulkcopy);

if(myBatchCount == 1)
{
countStart =
System.Convert.ToInt32(cmdRowCount.ExecuteScalar());
this.lblRowsCountBeforeBulkCopy.Refresh();
}

using(SqlBulkCopy bcp = new SqlBulkCopy(con_bulkcopy))
{
bcp.DestinationTableName = "dbo.Bulk_Target";
bcp.WriteToServer(myTable);
}

long countEnd =
System.Convert.ToInt32(cmdRowCount.ExecuteScalar());

myCopiedRows = countEnd - countStart;

this.DataGridView1.Rows.Add(
new string[] {
Convert.ToString(myBatchCount), Convert.ToString(myCopiedRows)});
this.DataGridView1.Refresh();
}
}
}

net網站開發相關文章

dotnetcurry

StreamReader csv/DataTable SqlBulkCopy

Dim dt As New DataTable()
Dim line As String = Nothing
Dim i As Integer = 0

Using sr As StreamReader = File.OpenText("c:\temp\table1.csv")
line = sr.ReadLine()
Do While line IsNot Nothing
Dim data() As String = line.Split(","c)
If data.Length > 0 Then
If i = 0 Then
For Each item In data
dt.Columns.Add(New DataColumn())
Next item
i += 1
End If
Dim row As DataRow = dt.NewRow()
row.ItemArray = data
dt.Rows.Add(row)
End If
line = sr.ReadLine()
Loop
End Using


Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConsoleApplication3.Properties.Settings.daasConnectionString").ConnectionString)
cn.Open()
Using copy As New SqlBulkCopy(cn)
copy.ColumnMappings.Add(0, 0)
copy.ColumnMappings.Add(1, 1)
copy.ColumnMappings.Add(2, 2)
copy.ColumnMappings.Add(3, 3)
copy.ColumnMappings.Add(4, 4)
copy.DestinationTableName = "Censis"
copy.WriteToServer(dt)
End Using
End Using

章立民 cnblogs

章立民 cnblogs

SqlBulkCopy 微軟官網版

微軟官網版

Imports System.Data.SqlClient

Module Module1
Sub Main()
Dim connectionString As String = GetConnectionString()

' Open a connection to the AdventureWorks database.
Using sourceConnection As SqlConnection = _
New SqlConnection(connectionString)
sourceConnection.Open()

' Perform an initial count on the destination table.
Dim commandRowCount As New SqlCommand( _
"SELECT COUNT(*) FROM dbo.BulkCopyDemoMatchingColumns;", _
sourceConnection)
Dim countStart As Long = _
System.Convert.ToInt32(commandRowCount.ExecuteScalar())
Console.WriteLine("NotifyAfter Sample")
Console.WriteLine("Starting row count = {0}", countStart)

' Get data from the source table as a SqlDataReader.
Dim commandSourceData As SqlCommand = New SqlCommand( _
"SELECT ProductID, Name, ProductNumber " & _
"FROM Production.Product;", sourceConnection)
Dim reader As SqlDataReader = commandSourceData.ExecuteReader

' Create the SqlBulkCopy object using a connection string.
' In the real world you would not use SqlBulkCopy to move
' data from one table to the other in the same database.
Using bulkCopy As SqlBulkCopy = _
New SqlBulkCopy(connectionString)
bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns"

' Set up the event handler to notify after 50 rows.
AddHandler bulkCopy.SqlRowsCopied, AddressOf OnSqlRowsCopied
bulkCopy.DestinationTableName = _
"dbo.BulkCopyDemoMatchingColumns"
bulkCopy.NotifyAfter = 50

Try
' Write from the source to the destination.
bulkCopy.WriteToServer(reader)

Catch ex As Exception
Console.WriteLine(ex.Message)

Finally
' Close the SqlDataReader. The SqlBulkCopy
' object is automatically closed at the end
' of the Using block.
reader.Close()
End Try
End Using

' Perform a final count on the destination table
' to see how many rows were added.
Dim countEnd As Long = _
System.Convert.ToInt32(commandRowCount.ExecuteScalar())
Console.WriteLine("Ending row count = {0}", countEnd)
Console.WriteLine("{0} rows were added.", countEnd - countStart)

Console.WriteLine("Press Enter to finish.")
Console.ReadLine()
End Using
End Sub

Private Sub OnSqlRowsCopied(ByVal sender As Object, _
ByVal args As SqlRowsCopiedEventArgs)
Console.WriteLine("Copied {0} so far...", args.RowsCopied)
End Sub

Private Function GetConnectionString() As String
' To avoid storing the sourceConnection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);" & _
"Integrated Security=true;" & _
"Initial Catalog=AdventureWorks;"
End Function
End Module

SqlBulkCopy A至B

Imports System.Data
Imports System.Data.SqlClient
Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub btnBulkCopy_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBulkCopy.Click
'程式本機 Database Server Connection String
Dim shcs As New SqlConnectionStringBuilder
shcs.DataSource = ".\SQLEXPRESS"
shcs.InitialCatalog = "Share"
shcs.UserID = "bruce"
shcs.Password = "123456789"
'遠端Database Server Connection String
Dim ntcs As New SqlConnectionStringBuilder
ntcs.DataSource = "192.168.3.12\SQLEXPRESS"
ntcs.InitialCatalog = "Northwind"
ntcs.UserID = "bruce"
ntcs.Password = "987654321"
Dim shcmd As New SqlCommand
Dim shdr As SqlDataReader
Dim shconn As New SqlConnection(shcs.ConnectionString)
shcmd.CommandText = " SELECT ID, First_Name, Last_Name, 'CEO' as Source FROM MailingList"
shcmd.CommandType = CommandType.Text
shcmd.Connection = shconn
shcmd.Connection.Open()
'與遠端建立SqlBulkCopy實體
Dim ntbcp As New SqlBulkCopy(New SqlConnection(ntcs.ConnectionString))
'指定遠端的資料表名稱
ntbcp.DestinationTableName = "Employees"
'本機與遠端的Column對應,如本機與遠端的Schema一樣,可省略ColumnMappings ntbcp.ColumnMappings.Add("ID", "EmployeeID")
ntbcp.ColumnMappings.Add("First_Name", "FirstName")
ntbcp.ColumnMappings.Add("Last_Name", "LastName")
'自定義欄位,把Source對應到Employees的Title欄位,所有欄位都會等於CEO
Dim TitleMapping As New SqlBulkCopyColumnMapping("Source", "Title") ntbcp.ColumnMappings.Add(TitleMapping)
'TimeOut,單位秒
ntbcp.BulkCopyTimeout = 360
'多少筆發一次通知
ntbcp.NotifyAfter = 1000
'委派
AddHandler ntbcp.SqlRowsCopied, AddressOf OnSqlRowsCopied
'AddHandler ntbcp.SqlRowsCopied, New SqlRowsCopiedEventHandler(AddressOf sqlRowsCopied)
shdr = shcmd.ExecuteReader
Try     
'執行WriteToServer,把本機資料(DataReader)大量複製到遠端資料庫
ntbcp.WriteToServer(shdr)
Catch ex As Exception
lblResult.Text = ex.Message
Finally
shdr.Close()
End Try
End Sub

Private Sub OnSqlRowsCopied(ByVal sender As Object, ByVal args As SqlRowsCopiedEventArgs)      
'由於ntbcp.NotifyAfter的關係,每1000筆觸發一次
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied. "
End SubEnd

Class

程式流程不會很難,


建立本機SqlConnection實體
建立遠端SqlBulkCopy實體(使用遠端Sqlconnection實體)
執行本機ExecuteReader方法,取得資料
執行SqlBulkCopy實體的WriteToServer方法,將DataReader寫到遠端Server去

TransactionScope

微軟的
參考1
參考2

交易元件 TransactionScope

Private Sub TestTransactionScope()
'以下是交易元件 TransactionScope 的範例
Dim strSql As String

strSql = "INSERT INTO tb1L (F1L_id, F1L_name) " & _
"VALUES (@F1L_id, @F1L_name) "

Using Scope As New TransactionScope
Try
'注意 TransactionScope 元件是以一個連線 SqlConnection 為準
'所以盡量使用
'Using Conn As New SqlConnection(strConnection)
'End Using
'以確保會再發生錯誤時正確關閉連線
Using Conn As New SqlConnection(strConnection)
Conn.Open()

Dim RmvCMD As SqlCommand = New SqlCommand
RmvCMD.CommandType = CommandType.Text
RmvCMD.Connection = Conn

RmvCMD.CommandText = strSql

'欄位格式設定
With RmvCMD.Parameters
.Add(New SqlParameter("@F1L_id", SqlDbType.VarChar))
.Add(New SqlParameter("@F1L_name", SqlDbType.VarChar))
End With

'TEST1
RmvCMD.Parameters("@F1L_id").Value = "T900009"
RmvCMD.Parameters("@F1L_name").Value = "測試1"
RmvCMD.ExecuteNonQuery()
'以上這一段理論上是可以正常通過的

'TEST2 這裡 F1L_id 超過欄位長度 所以會錯誤
RmvCMD.Parameters("@F1L_id").Value = "T900006000000000"
RmvCMD.Parameters("@F1L_name").Value = "測試2"
RmvCMD.ExecuteNonQuery()

End Using
'--注意 End Using 一定要在 Scope.Complete() 之前
' 不然會發揮不了
' TransactionScope 的作用且也不會有錯誤提示

'交易確認
Scope.Complete()
MsgBox("交易完成!")
Catch ex As Exception
MsgBox("交易發生錯誤!" & ex.Message)
End Try
End Using
End Sub

dotnetspider

dotnetspider

Dotnetspider.com is founded by Tony John to gather a good and quality IT professionals under one roof. This is the community sharing Technical views. Several Microsoft MVPs are directly or indirectly involved in this community offering their guidance.

Dotnetspider is platform for all .Net Professional/developers to share their stuffs. In addition, we do offer the platforms like resources, discussion forums, communities and few others coming soon. One of the key features in Dotnetspider is, members who contribute content will get 90% of Google AdSense revenue from their pages for a specific period of time.

分享世界

分享世界

讚!! 真是豐富的一站

2010年8月1日 星期日

如何在 DBCS 系统中显示扩展的 ASCII WingDings

微軟原站
難得找到這篇,記錄起來;詳細還請到微軟查看!!
---------------------------------------
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 32
End Type

'Charset constants
'Values for lf.lfCharSet:
Public Const ANSI_CHARSET = 0
Public Const DEFAULT_CHARSET = 1
Public Const SYMBOL_CHARSET = 2
Public Const SHIFTJIS_CHARSET = 128
Public Const HANGUL_CHARSET = 129
Public Const GB2312_CHARSET = 134
Public Const CHINESEBIG5_CHARSET = 136
Public Const GREEK_CHARSET = 161
Public Const TURKISH_CHARSET = 162
Public Const HEBREW_CHARSET = 177
Public Const ARABIC_CHARSET = 178
Public Const BALTIC_CHARSET = 186
Public Const RUSSIAN_CHARSET = 204
Public Const THAI_CHARSET = 222
Public Const EE_CHARSET = 238
Public Const OEM_CHARSET = 255

'Values to be used with GetSysColor:
Public Const COLOR_BTNFACE = 15
Public Const COLOR_ACTIVEBORDER = 10
Public Const COLOR_ACTIVECAPTION = 2
Public Const COLOR_ADJ_MAX = 100
Public Const COLOR_ADJ_MIN = -100 'shorts
Public Const COLOR_APPWORKSPACE = 12
Public Const COLOR_BACKGROUND = 1
Public Const COLOR_BTNHIGHLIGHT = 20
Public Const COLOR_BTNSHADOW = 16
Public Const COLOR_BTNTEXT = 18
Public Const COLOR_CAPTIONTEXT = 9
Public Const COLOR_GRAYTEXT = 17
Public Const COLOR_HIGHLIGHT = 13
Public Const COLOR_HIGHLIGHTTEXT = 14
Public Const COLOR_INACTIVEBORDER = 11
Public Const COLOR_INACTIVECAPTION = 3
Public Const COLOR_INACTIVECAPTIONTEXT = 19
Public Const COLOR_MENUTEXT = 7
Public Const COLOR_SCROLLBAR = 0
Public Const COLOR_WINDOW = 5
Public Const COLOR_WINDOWFRAME = 6
Public Const COLOR_WINDOWTEXT = 8

Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As _
Long, ByVal x As Long, ByVal y As Long, lpString As Any, _
ByVal nCount As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) _
As Long
Declare Function CreateFontIndirect Lib "gdi32" Alias _
"CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, _
ByVal hObject As Long) As Long
Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, _
ByVal crColor As Long) As Long
Declare Function GetBkMode Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) _
As Long


--
Private Sub Command1_Click()

Dim lf As LOGFONT
Dim chars(257) As Byte
Dim sysColor As Long
Dim DispChar As Integer
Dim NumDispchar As Integer
Dim prevBkCol As Long
Dim hFont As Long
Dim StartASCII As Integer
Dim StopASCII As Integer
Dim StartRow As Integer
Dim NumOfChars As Integer
Dim i As Integer
Dim j As Integer
Dim EndRow As Integer
Dim NewStart As Integer
Dim tmp As Integer
Dim xd As Long
Dim xt As Long
Dim xs As Long

'These are the important settings: lfCharSet and lfFaceName
lf.lfCharSet = SYMBOL_CHARSET
lf.lfFaceName = "WingDings" & Chr$(0)

lf.lfClipPrecision = 64
lf.lfOutPrecision = 0
lf.lfEscapement = 0
lf.lfItalic = 0
lf.lfWidth = 16
lf.lfHeight = 32
lf.lfOrientation = 0

Form1.Caption = lf.lfFaceName
Form1.Refresh
sysColor = GetSysColor(COLOR_BTNFACE) 'Gets button system color
prevBkCol = SetBkColor(Form1.hdc, sysColor) 'Set background color
hFont = CreateFontIndirect(lf)
xs = SelectObject(Form1.hdc, hFont)

DispChar = 32 'Number of characters to display in a row
StartASCII = 32 'Starting with character having this ASCII value
StopASCII = 255 'Ending with this ASCII character
StartRow = 1

If StartASCII < 0 Then StartASCII = 32
If StopASCII > 255 Then StopASCII = 255
If StartASCII > StopASCII Then 'If StartASCII is larger than
'StopASCII swap
tmp = StartASCII
StartASCII = StopASCII
StopASCII = tmp
End If

NumOfChars = StopASCII - StartASCII + 1

If Int(NumOfChars / DispChar) = (NumOfChars) / DispChar Then
EndRow = Int(NumOfChars / DispChar)
Else
EndRow = Int(NumOfChars / DispChar) + 1
End If

For i = StartASCII To StopASCII
chars(i) = i
Next i

'Display characters on the form in rows containing 32 characters
For j = StartRow To EndRow
NewStart = StartASCII + (j - 1) * DispChar

If NumOfChars < DispChar And NumOfChars > 0 Then
NumDispchar = NumOfChars
Else
NumDispchar = DispChar
End If

xt = TextOut(Form1.hdc, 0, j * lf.lfHeight + 2, _
chars(NewStart), NumDispchar)
NumOfChars = NumOfChars - NumDispchar
Next j

xd = DeleteObject(hFont)
Form1.Caption = Form1.Caption & " From " & _
StartASCII & " to " & StopASCII

End Sub