2015年12月18日 星期五

專案移轉到他平台時,complie時遇到「此專案參考這部電腦上所缺少的 NuGet 封裝。請啟用 NuGet 封裝還原,以下載該封裝。如需詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的檔案是....」

移轉到他台pc的vs2015開發時,
如果只有copy一些source & html檔就編譯重建
就會遇到package 缺漏的訊息:
ex:
===================================
此專案參考這部電腦上所缺少的 NuGet 封裝。請啟用 NuGet 封裝還原,以下載該封裝。如需詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的檔案是
..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props....
==================================
此時,除了用nuget把既有的package升級之外
最直接的方式是....從你copy過來的來源平台中,把package資料夾拿過來全數覆蓋
再重建之
就可以了
參考 相關案例

以上,加油了

2015年12月11日 星期五

for Extjs4 大一點的combobox下拉按鈕

一樣都是pos的單元,所以連帶combobox也要大一點
最麻煩的就是combobox旁邊的下拉鍵,怎麼做?
1.準備一個下拉要用的按鈕圖,本例是30x30
2.準備一個css class
========================================
            /*--for bigger combobox--arrow_down.png*/
            .bigTriggerArrow   {
                background-image: url('/FTW/Images/arrow_down.png') !important;
                height:30px!important;
                width:30px!important;
            }

======上述的「!important」真的是很important,省不得!!================
其中長與高,真的就是照圖的大小,別留白了
3.設定combobox的trigger css對應
================combobox==================
                                        {
                                            xtype: 'combobox',
                                            width: 155,
                                            height:32,
                                            fieldLabel: '業務人員',
                                            labelSeparator: '   ',
                                            labelWidth: 52,
                                            name: 'SO_sales',
                                            //triggerCls: 'bigTriggerArrow',
                                            triggerBaseCls: 'bigTriggerArrow',
                                            //triggerWrapCls: 'bigTriggerArrow',

                                            id: 'MainPanelTextInvoiceSEQ',
                                            allowBlank: false,
                                            queryMode: 'local',
                                            matchFieldWidth: false,
                                            store: new Ext.data.ArrayStore({
                                                fields: ['text', 'value'],
                                                data: [['李四', 'F'], ['張三', 'M']]
                                            }),
                                            valueField: 'value',
                                            displayField: 'text',
                                            listeners: {
                                                select: function (cbx, records, eOpts) {
                                                    var recOfCbx = records[0];
;

                                                }
                                            },
                                            listConfig: {
                                                width: 250,
                                                getInnerTpl: function () {
                                                    return '<h4>{value}</h4>{text}'
                                                }
                                            }
                                        }

============================================
以上

2015年11月20日 星期五

連結SignalR卻遇到「You are using a version of the client that isn't compatible with the server. Client version 1.4, server version 1.3.」 錯誤

server push 在多人系統中是可能會遇到的課題
在這次我們試著用SignalR來實做
大家應該都拿到範例了
如果是要從server的control去呼叫已經存在的SignalR去送訊息,
參考以下的程式碼:(caller project要先安裝siganlR client 套件) 
========先決條件是你已經做好一個SignalR with hub "ChatHub"================
 public ActionResult callSignalR() {
            var hubConnection = new HubConnection("http://localhost/SignalRChat");
            IHubProxy myproxy = hubConnection.CreateHubProxy("ChatHub");
            hubConnection.Start().Wait();
            myproxy.Invoke("Send", "From backend", "Attention!!");
            return new EmptyResult();
        }
===========================================
可是執生起來(hubConnection.start.Wait()那段),居然出現exception:
「You are using a version of the client that isn't compatible with the server. Client version 1.4, server version 1.3.」
翻遍所有的套件,好像都沒有1.4/1.3的代號
是的,問題不出在caller/control,而是出在signalR,
回到SignalR的專案,用nuget把用到的相關的套件做update,這個問題就解決了
就是這麼單純

以上,大家加油吧

2015年11月17日 星期二

for MSSQL2012 由查詢的結果產出insert 語法

「由查詢的結果產出insert 語法」(就某單一table查詢而言)
在toad 這樣的工具早就有這功能了,
在MSSQL 2008也有,叫 sp_generate_inserts
example:
EXEC sp_generate_inserts 'titles', @From = "from titles where title like '%Computer%'"
但是在MSSQL 2012 SQL 居然沒這麼好用的工具
放心,
這行就是這樣--很多事已經有人替你踢過鐵板了,你需要的,別人也有需要
以下就是這個產生insert語法的stored procedure:
===================================================================
/*
Authore : neeraj prasad sharma (please dont remove this :))
Example (1) Exec [dbo].[INS]  'Dbo.test where 1=1'
        (2) Exec [dbo].[INS]  'Dbo.test where name =''neeraj''' * for string

here Dbo is schema and test is tablename and 1=1 is condition

*/


CREATE procedure  [dbo].[INS]                              
(                                                          
   @Query  Varchar(MAX)                                                          
)                              

AS                              

       Set nocount ON                  

DEclare @WithStrINdex as INT                            
DEclare @WhereStrINdex as INT                            
DEclare @INDExtouse as INT                            

Declare @SchemaAndTAble VArchar(270)                            
Declare @Schema_name  varchar(30)                            
Declare @Table_name  varchar(240)                            
declare @Condition  Varchar(MAX)                             

SET @WithStrINdex=0                            

SELECT @WithStrINdex=CHARINDEX('With',@Query )                            
, @WhereStrINdex=CHARINDEX('WHERE', @Query)                            

IF(@WithStrINdex!=0)                            
Select @INDExtouse=@WithStrINdex                            
ELSE                            
Select @INDExtouse=@WhereStrINdex                            

Select @SchemaAndTAble=Left (@Query,@INDExtouse-1)                                                     
select @SchemaAndTAble=Ltrim (Rtrim( @SchemaAndTAble))                            

Select @Schema_name= Left (@SchemaAndTAble, CharIndex('.',@SchemaAndTAble )-1)                            
,      @Table_name = SUBSTRING(  @SchemaAndTAble , CharIndex('.',@SchemaAndTAble )+1,LEN(@SchemaAndTAble) )                            

,      @CONDITION=SUBSTRING(@Query,@WhereStrINdex+6,LEN(@Query))--27+6                            


Declare   @COLUMNS  table (Row_number SmallINT , Column_Name VArchar(Max) )                              
Declare @CONDITIONS as varchar(MAX)                              
Declare @Total_Rows as SmallINT                              
Declare @Counter as SmallINT              

declare @ComaCol as varchar(max)            
select @ComaCol=''                   

Set @Counter=1                              
set @CONDITIONS=''                              

INsert INTO @COLUMNS                              
Select  Row_number()Over (Order by ORDINAL_POSITION ) [Count] ,Column_Name FRom INformation_schema.columns Where Table_schema=@Schema_name                              
And table_name=@Table_name         


select @Total_Rows= Count(1) FRom  @COLUMNS                              

             Select @Table_name= '['+@Table_name+']'                      

             Select @Schema_name='['+@Schema_name+']'                      

While (@Counter<=@Total_Rows )                              
begin                               
--PRINT @Counter                              

    select @ComaCol= @ComaCol+'['+Column_Name+'],'            
    FROM @COLUMNS                              
Where [Row_number]=@Counter                          

select @CONDITIONS=@CONDITIONS+ ' +Case When ['+Column_Name+'] is null then ''Null'' Else ''''''''+                              

 Replace( Convert(varchar(Max),['+Column_Name+']  ) ,'''''''',''''  )                              

  +'''''''' end+'+''','''                              

FROM @COLUMNS                              
Where [Row_number]=@Counter                              

SET @Counter=@Counter+1                              

End                              

select @CONDITIONS=Right(@CONDITIONS,LEN(@CONDITIONS)-2)                              

select @CONDITIONS=LEFT(@CONDITIONS,LEN(@CONDITIONS)-4)              
select @ComaCol= substring (@ComaCol,0,  len(@ComaCol) )                            

select @CONDITIONS= '''INSERT INTO '+@Schema_name+'.'+@Table_name+ '('+@ComaCol+')' +' Values( '+'''' + '+'+@CONDITIONS                              

select @CONDITIONS=@CONDITIONS+'+'+ ''')'''                              

Select @CONDITIONS= 'Select  '+@CONDITIONS +'FRom  ' +@Schema_name+'.'+@Table_name+' With(NOLOCK) ' + ' Where '+@Condition                              
print(@CONDITIONS)                              
Exec(@CONDITIONS)  
=============================================================
出處在此
以上,大家加油吧



2015年11月10日 星期二

for Extjs4 ,如何在文字欄位離焦前做點事--找出被誰橫刀「奪焦」去了

找出同一個頁面中,是讓什麼其他元件取走focus
(這種需求多半是在輸入時要用輔助單元做輸入,而動作完之後,仍要再度取回焦點,)
我想,你一定想當然爾是在blur事件時做善後的,
example:
==================================
  { xtype:'textfield',
     ...
     ...
     listeners:{
          ...
          ...
          blur: function (textfield, e, o) {
               //test if the target is helper control,and take back focus latter.
             if(e.getTarget().id!=.......){
                //if target id is not help control,forget it
             }else{
                 //if target id is helper control, set the flag, wait for it
             }
 
          }
     
    }
   }
=====================================
但,不幸的,上例所取得的id,永遠是這個textfield.inputEl.dom.id,而不是取得焦點的extjs control id
,怎麼辦?
事實上,上面的例子,只要加個defer的動作,就差不多了,如:
==============================
   Ext.Function.defer(function () {
        if(e.getTarget().id!=.......){
        }
  },500);
=============================
是的,既言之,差不多,就是還是會有漏勾的地方,沒錯,在Chrome是很正常,但在IE & 火狐就掛了
就這樣放棄了嗎?
   那就改一下xtype吧,用別的文字方塊類別,,把上述的程式碼改一下
==================================
  { xtype:'numberfield',
     ...
     ...
     listeners:{
          ...
          ...
          blur: function (textfield, e, o) {
               //test if the target is helper control,and take back focus latter.
             if(e.getTarget().id!=.......){
                //if target id is not help control,forget it
             }else{
                 //if target id is helper control, set the flag, wait for it
             }
 
          }
     
    }
   }
========不要問我為什麼,反正我就是試出了===================
這樣在firefox & IE就正常了
以上,大家加油囉


2015年10月31日 星期六

Extjs4.2.2 pagingtoolbar 的按鍵怎麼修改 ?

最近很不幸的又是臨危受命去改版別人的東西,這次是POS
POS的東西有一項很重要的特性就是所有的按鍵都要大
其中Grid的列要如何加大,加高,這請自己去查
今天要講的是pagingtoolbar的問題
pagingtoolbar的「重新整理」這按鈕要怎麼查出來?
先看「錯誤示範」  
=============================================
 var grid = Ext.create('Ext.grid.Panel', {
   ...
   ...
   ...
  //這裡先不做dockedItems設定
  }
 var otherButton={.....} //定義一個要在pagingToolBar加入的其他功能按鈕
//在gird外面宣告一個paging Tool bar
        var pgToolbar = {
            xtype: 'pagingtoolbar',
            store: store,
            dock: 'bottom',
            displayInfo: true,
            height:40,
            items:[ otherButton ]
        }
 //放進 gird中
 grid.addDocked(pgToolbar);
 //這樣看起來看正常,是吧?
 //接著,我們要把「重新整理」按鍵隱藏起來,不讓user去按
pgToolbar.down('#refresh').hide(); <--注意,這裡就會出現pgToolbar error:沒有「.down」方法函數
                                                            //這下子,志明跟春嬌的故事就演不下去了!!
================================================
要怎麼做才是正確的呢?
以下才是正確的方法:
=============================================
 var grid = Ext.create('Ext.grid.Panel', {
   ...
   ...
   ...,
            width: 735,
            minHeight: 300,
           //這時就要先放進grid中了
            dockedItems: [{
                xtype: 'pagingtoolbar',
                store: store,
                displayInfo: true,
                dock: 'bottom',
                height:40,
                items: [
                     //在paging tool bar加上其他我們要用的動作鈕
                    {
                        xtype: 'button',
                        margin: '0 0 0 30',
                        text: '關閉',
                        handler: function () {
                            .....
                        }
                    }
                ]
            }]
  }
  //宣告完了,現在,就可以找出「重新整理 」按鍵做隱藏動作了
  grid.down('#refresh').hide(); <---這樣,就達成我們要的目的了
======================================================
其他的修改icon的動作也是如此,舉例吧
===================================
        var btnNext = grid.down('#next');
        btnNext.minWidth = 32;
        btnNext.minHeight = 32;
        btnNext.setText('');
        btnNext.setIcon('');
        btnNext.iconCls = null;
        btnNext.cls = 'pagingToolBarBtnNext';
================================
(上例是你已定義一個css  pagingToolBarBtnNext class,像是以下的玩意
           .pagingToolBarBtnNext {
                background-image: url('......../ToNext.png') !important;
            }
)

以上,大家加油吧


2015年7月21日 星期二

for .net ,如何把xls等檔案包到你的bin中?

「這還不簡單,直接copy進去不就得了?」沒錯,之前我就是這麼三八假賢慧
事實上設定一下,再build,vs2012就會幫你把檔案copy到bin\realse   去了,
--------------------------------------------------------
如下圖:
看到了吧,就是在建置動作的選項中,選用為「內嵌資源」 & 「複製到輸出目錄」
在build時,就會自動幫你帶到bin\release了,debug也會找到該檔的
...
...
什麼? 不知道怎麼找到路徑!?
好吧,用winform專業為例好了:
---------------------------------------------------
                string executableLocation = Path.GetDirectoryName(
                    Assembly.GetExecutingAssembly().Location);
                string tmplPath = Path.Combine(executableLocation, "XXX_DownloadTemplate.xls");
                 return new System.IO.FileStream(tmplPath, FileMode.Open, FileAccess.Read);
--------------------------------------------------------------------
這樣,送佛送上西天,功德夠圓滿了吧

加油了



2015年7月10日 星期五

如果沒有EF可以用的話--如何從table schema產生類別(for MS SQL)

俗話說:由儉入奢易,由奢入儉難,
不過,程式設計師應該考慮的是一旦沒了電的人類文明之下,怎麼活下去吧,
(至少做吃的就應該沒這問題了)
 好了,扯太遠了,如果你用習慣了Entity Framework,結果把你派到一定只能用.net 2的公司去
你有兩個選擇--一個是不幹了,一個是用自己的方式來包
以下這個sql stored procedure ,用了參數(table name),執行後就會產出相對的Model class了
來源在此
=========MSSQL store procedure to genreate c# class====================
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE GenerateCsharpClass
(@tableName2Gen varchar(100))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare @TableName  varchar(100)
 set @TableName=@tableName2Gen
declare @Result varchar(max) = 'public class ' + @TableName + '
{'

select @Result = @Result + '
    public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; }
'
from
(
    select
        replace(col.name, ' ', '_') ColumnName,
        column_id ColumnId,
        case typ.name
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'char'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + typ.name
        end ColumnType,
        case
            when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier')
            then '?'
            else ''
        end NullableSign
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
    where object_id = object_id(@TableName)
) t
order by ColumnId

set @Result = @Result  + '
}'

print @Result
END
GO

=============================================================
(說真的,我也是有點不想幹了,明明有web & MSSQL2012 ,居然還要用winform & .net 2.0)

同場加映:
用stored procedure的參數來產生類別的屬性欄位:

===================================================
USE [xxxDB]
GO
/****** Object:  StoredProcedure [dbo].[GenCsharpClassByStoredProc]    Script Date: 2015/7/13 下午 02:57:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GenCsharpClassByStoredProc]
(@storeProcName varchar(100))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare @TableName  varchar(100)
 set @TableName=@storeProcName

declare @Result varchar(max) = 'public class SP_'+@TableName+'
{'
select @Result = @Result + '
    public ' + ColumnType + '' + ' ' + ColumnName + ' { get; set; }
'
from
(
    select
        replace(replace(p.name, ' ', '_'),'@','')  ColumnName,
        p.parameter_id  ColumnId,
        case TYPE_NAME(p.user_type_id)
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'char'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + p.name
        end ColumnType

    from sys.objects AS SO
INNER JOIN sys.parameters AS P
ON SO.OBJECT_ID = P.OBJECT_ID
WHERE SO.OBJECT_ID IN ( SELECT OBJECT_ID
FROM sys.objects
WHERE TYPE IN ('P','FN'))
and SO.Type_Desc='SQL_STORED_PROCEDURE'
and so.name=@TableName
--ORDER BY SCHEMA_NAME(SCHEMA_ID), SO.name, P.parameter_id
)t
order by ColumnId,ColumnName

--一定要order by 2個欄位,如果只有一個ColumnId欄位的話,只會顯示出最後一個

set @Result = @Result  + '
}'

print @Result
end
===============================================

2015年7月8日 星期三

如果你沒有EF可以用的話,參考這個常用.net DB access 元件吧

常用.net DB access 元件:
來源在此
=======================================
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

namespace DbHelper
{
    /// <summary>
    /// 通用数据库访问类,封装了对数据库的常见操作
    ///</summary>
    public sealed class DbUtility
    {
        public string ConnectionString { get; set; }
        private DbProviderFactory providerFactory;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <param name="providerType">数据库类型枚举,参见<paramref name="providerType"/></param>
        public DbUtility(string connectionString, DbProviderType providerType)
        {
            ConnectionString = connectionString;
            providerFactory = ProviderFactory.GetDbProviderFactory(providerType);
            if (providerFactory == null)
            {
                throw new ArgumentException("Can't load DbProviderFactory for given value of providerType");
            }
        }
        /// <summary>  
        /// 对数据库执行增删改操作,返回受影响的行数。  
        /// </summary>  
        /// <param name="sql">要执行的增删改的SQL语句</param>  
        /// <param name="parameters">执行增删改语句所需要的参数</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql, IList<DbParameter> parameters)
        {
            return ExecuteNonQuery(sql, parameters, CommandType.Text);
        }
        /// <summary>  
        /// 对数据库执行增删改操作,返回受影响的行数。  
        /// </summary>  
        /// <param name="sql">要执行的增删改的SQL语句</param>  
        /// <param name="parameters">执行增删改语句所需要的参数</param>
        /// <param name="commandType">执行的SQL语句的类型</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql, IList<DbParameter> parameters, CommandType commandType)
        {
            using (DbCommand command = CreateDbCommand(sql, parameters, commandType))
            {
                command.Connection.Open();
                int affectedRows = command.ExecuteNonQuery();
                command.Connection.Close();
                return affectedRows;
            }
        }

        /// <summary>  
        /// 执行一个查询语句,返回一个关联的DataReader实例  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>
        /// <returns></returns>
        public DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters)
        {
            return ExecuteReader(sql, parameters, CommandType.Text);
        }

        /// <summary>  
        /// 执行一个查询语句,返回一个关联的DataReader实例  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>
        /// <param name="commandType">执行的SQL语句的类型</param>
        /// <returns></returns>
        public DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters, CommandType commandType)
        {
            DbCommand command = CreateDbCommand(sql, parameters, commandType);
            command.Connection.Open();
            return command.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>  
        /// 执行一个查询语句,返回一个包含查询结果的DataTable  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>
        /// <returns></returns>
        public DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters)
        {
            return ExecuteDataTable(sql, parameters, CommandType.Text);
        }
        /// <summary>  
        /// 执行一个查询语句,返回一个包含查询结果的DataTable  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>
        /// <param name="commandType">执行的SQL语句的类型</param>
        /// <returns></returns>
        public DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters, CommandType commandType)
        {
            using (DbCommand command = CreateDbCommand(sql, parameters, commandType))
            {
                using (DbDataAdapter adapter = providerFactory.CreateDataAdapter())
                {
                    adapter.SelectCommand = command;
                    DataTable data = new DataTable();
                    adapter.Fill(data);
                    return data;
                }
            }
        }

        /// <summary>  
        /// 执行一个查询语句,返回查询结果的第一行第一列  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
        /// <returns></returns>  
        public Object ExecuteScalar(string sql, IList<DbParameter> parameters)
        {
            return ExecuteScalar(sql, parameters, CommandType.Text);
        }

        /// <summary>  
        /// 执行一个查询语句,返回查询结果的第一行第一列  
        /// </summary>  
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
        /// <param name="commandType">执行的SQL语句的类型</param>
        /// <returns></returns>  
        public Object ExecuteScalar(string sql, IList<DbParameter> parameters, CommandType commandType)
        {
            using (DbCommand command = CreateDbCommand(sql, parameters, commandType))
            {
                command.Connection.Open();
                object result = command.ExecuteScalar();
                command.Connection.Close();
                return result;
            }
        }

        public DbParameter CreateDbParameter(string name, object value)
        {
            return CreateDbParameter(name, ParameterDirection.Input, value);
        }

        public DbParameter CreateDbParameter(string name, ParameterDirection parameterDirection, object value)
        {
            DbParameter parameter = providerFactory.CreateParameter();
            parameter.ParameterName = name;
            parameter.Value = value;
            parameter.Direction = parameterDirection;
            return parameter;
        }

        /// <summary>
        /// 创建一个DbCommand对象
        /// </summary>
        /// <param name="sql">要执行的查询语句</param>  
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>
        /// <param name="commandType">执行的SQL语句的类型</param>
        /// <returns></returns>
        private DbCommand CreateDbCommand(string sql, IList<DbParameter> parameters, CommandType commandType)
        {
            DbConnection connection = providerFactory.CreateConnection();
            DbCommand command = providerFactory.CreateCommand();
            connection.ConnectionString = ConnectionString;
            command.CommandText = sql;
            command.CommandType = commandType;
            command.Connection = connection;
            if (!(parameters == null || parameters.Count == 0))
            {
                foreach (DbParameter parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }
            }
            return command;
        }
    }
    /// <summary>
    /// 数据库类型枚举
    /// </summary>
    public enum DbProviderType : byte
    {
        SqlServer,
        MySql,
        SQLite,
        Oracle,
        ODBC,
        OleDb,
        Firebird,
        PostgreSql,
        DB2,
        Informix,
        SqlServerCe
    }
    /// <summary>
    /// DbProviderFactory工厂类
    /// </summary>
    public class ProviderFactory
    {
        private static Dictionary<DbProviderType, string> providerInvariantNames = new Dictionary<DbProviderType, string>();
        private static Dictionary<DbProviderType, DbProviderFactory> providerFactoies = new Dictionary<DbProviderType, DbProviderFactory>(20);
        static ProviderFactory()
        {
            //加载已知的数据库访问类的程序集
            providerInvariantNames.Add(DbProviderType.SqlServer, "System.Data.SqlClient");
            providerInvariantNames.Add(DbProviderType.OleDb, "System.Data.OleDb");
            providerInvariantNames.Add(DbProviderType.ODBC, "System.Data.ODBC");
            providerInvariantNames.Add(DbProviderType.Oracle, "Oracle.DataAccess.Client");
            providerInvariantNames.Add(DbProviderType.MySql, "MySql.Data.MySqlClient");
            providerInvariantNames.Add(DbProviderType.SQLite, "System.Data.SQLite");
            providerInvariantNames.Add(DbProviderType.Firebird, "FirebirdSql.Data.Firebird");
            providerInvariantNames.Add(DbProviderType.PostgreSql, "Npgsql");
            providerInvariantNames.Add(DbProviderType.DB2, "IBM.Data.DB2.iSeries");
            providerInvariantNames.Add(DbProviderType.Informix, "IBM.Data.Informix");
            providerInvariantNames.Add(DbProviderType.SqlServerCe, "System.Data.SqlServerCe");
        }
        /// <summary>
        /// 获取指定数据库类型对应的程序集名称
        /// </summary>
        /// <param name="providerType">数据库类型枚举</param>
        /// <returns></returns>
        public static string GetProviderInvariantName(DbProviderType providerType)
        {
            return providerInvariantNames[providerType];
        }
        /// <summary>
        /// 获取指定类型的数据库对应的DbProviderFactory
        /// </summary>
        /// <param name="providerType">数据库类型枚举</param>
        /// <returns></returns>
        public static DbProviderFactory GetDbProviderFactory(DbProviderType providerType)
        {
            //如果还没有加载,则加载该DbProviderFactory
            if (!providerFactoies.ContainsKey(providerType))
            {
                providerFactoies.Add(providerType, ImportDbProviderFactory(providerType));
            }
            return providerFactoies[providerType];
        }
        /// <summary>
        /// 加载指定数据库类型的DbProviderFactory
        /// </summary>
        /// <param name="providerType">数据库类型枚举</param>
        /// <returns></returns>
        private static DbProviderFactory ImportDbProviderFactory(DbProviderType providerType)
        {
            string providerName = providerInvariantNames[providerType];
            DbProviderFactory factory = null;
            try
            {
                //从全局程序集中查找
                factory = DbProviderFactories.GetFactory(providerName);
            }
            catch (ArgumentException e)
            {
                factory = null;
            }
            return factory;
        }
    }
}

2015年7月4日 星期六

For Extjs4 : checkbox 的布林與其他值對應關係

如果你的form有用checkboxfield,請設定「inputValue」& 「
這樣就不必還要在server設定uncheck & check時,model應該對應的值是什麼
ex:如,我們要這欄位checked時是"1",unchecked時是空字串時,就直接設定
   { xtype:'checkboxfield',
   ....
   ...
  inputValue:'1',
  uncheckedValue:'',
  name:'with_receipt'
  }
這樣,就會很直接在submit時做轉換了,
另外「」也有可能會用到--如果你的checkbox可能會被disabled時,就可以用這屬性決定要不要submit這欄位的狀態了

2015年6月3日 星期三

EPSON ESC/POS 指令測試--win8.1 64bit之下中文嘛會通

最近臨危受命幫友人寫EPR,POS用的是wp-520 發票機 ,還好有EPSON ESC/POS指令相容模式可以用,那就好辦了
照常理中文又會有亂碼出現了,只要encoding解決就好了--下例就是了
至於physical的問題--取錯紙捲以至於發票編號給錯的問題,留待他的流程面解決了
=========sample code============================
            SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            port.Open();
            port.Write(Convert.ToChar(27) +"@");
            //port.Write(Convert.ToChar(28) + "&"); <--「漢字模式」!? 不必啦
            port.Write(Convert.ToChar(27) + "z" + Convert.ToChar(1));
            port.Write( "begin test" + Convert.ToChar(13) + Convert.ToChar(10));
            byte[] strArr = System.Text.Encoding.GetEncoding("big5").GetBytes("NEO.TECH 力台系統公司");
            port.Write(strArr, 0, strArr.Length);
            port.Write(""+ Convert.ToChar(13) + Convert.ToChar(10));
            strArr = System.Text.Encoding.GetEncoding("big5").GetBytes("二聯發票機測試");
            port.Write(strArr, 0, strArr.Length);
            port.Write("" + Convert.ToChar(13) + Convert.ToChar(10));

            strArr = System.Text.Encoding.GetEncoding("big5").GetBytes("64位元 win8嘛會通");
            port.Write(strArr, 0, strArr.Length);
            port.Write("" + Convert.ToChar(13) + Convert.ToChar(10));

            port.Write("end of test" + Convert.ToChar(13) + Convert.ToChar(10));
            //chr$(29)+chr$(86)+chr$(66)
            port.Write(""+ Convert.ToChar(29) + Convert.ToChar(86) + Convert.ToChar(66) + Convert.ToChar(13) + Convert.ToChar(10));
            port.Close();
=========================================
至於 Epson RP-U420常用命令一覽表,參考這裡

再怎麼樣ERP都是人操作的,如何用流程改善來減少user的問題,增進用戶的收益,問題始終在於人上面

加油了

2015年5月28日 星期四

for Extjs4 ,combobox彈出視窗如何比他未下拉時寬一點?

Extjs4的combobox是非常好用的contorl,除了可以用Tpl設定資料列出的樣式之外
還可以設定下拉選項彈出時比收起來時寬些:
托Extjs4之福,只要設定一下就可以了:
============================================
                                                {
                                                    xtype: 'combobox',
                                                    margin: '0 0 0 10',
                                                    width: 150,
                                                    fieldLabel: '分配機號',
                                                    labelSeparator: '              ',
                                                    labelWidth: 65,
                                                    store:storePos,
                                                     ...
                                                     ...
                                                     ...
                                                    matchFieldWidth: false,
                                                    queryMode: 'local',
                                                    listConfig: {
                                                        width:200,
                                                        getInnerTpl: function () {
                                                            return '<h4>{pos_code}</h4>{pos_name}'
                                                        }
                                                    }
                                                }
====================================================
很簡單吧?
加油了!!

2015年5月21日 星期四

for Extjs4 :如果只有store,而無定義model類別時,如何產生model物件?

有時combobx的store只是很暫時的東西.
懶的為這個暫時性的store定義model是人之常情
可是其中的選項是從server來的string array,而不是memory的話....

=================Ex====================
                                {
                                    xtype: 'combobox',
                                    name: 'xxx',
                                    queryMode: 'local',
                                    valueField: 'itemName',
                                    displayField: 'itemName',
                                    store: new Ext.data.ArrayStore({
                                        fields: ['itemName'],
                                        data: []
                                    }),
                                   ...
                                   ...
                                }
           //以下有個函數
      ,setSelectItems:(strArr){
               //這時如何是好?
      }
==========================================
事實上,只要有了store,也知道欄位(fields),就可以產生model了!!
================如下======================
    var rec = this.getForm().findField('xxx').getStore().model.create(
                  { itemName: stringOfThisItem }
                  ); 
                  //itemName 是上例的store的唯一欄位名稱
                     
                 this.getForm().findField('xxx').getStore().add(rec);
=====================================
以上,
加油了!!





2015年5月15日 星期五

in C#,16進制字串如何轉成unicode字元呢?

工具函數:
==================================================
public static byte[] StringToByteArray(String hex) {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for(int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
===================================================
但是轉出來會有Hi byte & Low byte順序問題,所以別忘了要反轉一下

                byte[] cbyte = StringToByteArray("5F5E");
                Array.Reverse(cbyte);
                var uniChar = Encoding.Unicode.GetString(cbyte);
來源在此

加油了

2015年5月13日 星期三

for EXTJS4 --To Scroll GRID by dragging

可以參考iscroll
ref : http://www.rahulsingla.com/blog/2011/11/extjs-and-iscroll-scrolling-ext-containers-on-touch-devices-ipad-iphone-etc-using-iscro
ref : http://cubiq.org/iscroll-4

如果不想這樣麻煩,參考以下的code.
solution from here

=============================================
                            listeners: {
                                itemmousedown: function (view, rec, item, idx, event) {

                                    var startX = event.getX();
                                    var startY = event.getY();

                                    var grid = view.up('gridpanel');
                                    var div = grid.getEl();
                                    var body = Ext.getBody();

                                    body.setStyle('cursor', '-moz-grabbing'); //doesn't work in 4.0.7+

                                    div.on('mousemove', function (e) {
                                        x = e.getX(), y = e.getY()
                                        grid.scrollByDeltaX(startX - x);
                                        grid.scrollByDeltaY(startY - y);
                                        startX = x
                                        startY = y
                                    });

                                    body.on('mouseup', function (e) {
                                        body.setStyle('cursor', 'default'); //doesn't work in 4.0.7+
                                        div.removeAllListeners();
                                        body.removeAllListeners();
                                    });

                                    body.on('mouseleave', function (e, tgt) {
                                        body.setStyle('cursor', 'default'); //doesn't work in 4.0.7+
                                        div.removeAllListeners();
                                        body.removeAllListeners();
                                    });
                                }
                            }
=======================================
 加油了!!

2015年4月25日 星期六

伺服馬達的舵盤如何鎖上樂高的齒輪?

這需要一點點以退為進的手段,
先兩支螺絲反著鎖,
對鎖確定完成之後,洞距就會被拉開了
如此,再把反相的螺絲卸下,正向鎖回去就可以了
這樣,你可以享用你的伺服與樂高之間的合作了,加油吧!!






2015年4月14日 星期二

extjs4 --model中,某欄的值是從其他欄位加工而來

這招,就要用到「convert」密技了
===================================
       ..
       ..
       {
            name: 'code_and_name',
            type: 'string',
            convert: function (v, record) {
                return record.get('bymkrCode') + ' ' + record.get('bymkrName')
            }
        }
          ...
          ...
=======================================

2015年3月27日 星期五

Raspberry Pi 的遠端桌面(而且是single 的哦)

不管是用VNC 或是 Xming,都是multi-session的
 也就是斷線後就之前的xwin狀態都不見了
現在推薦你用這:XRDP只要用一個指令就可以安裝了:
sudo apt-get install xrdp
之後只要在windows 的遠端桌面連結之,就可以了
日後不管你要在xwin裡開發或是執行一堆console,都不必怕斷了線就什麼都成了過往雲煙了
參考:XRDP


2015年1月22日 星期四

Creating Tooltip for Text Field in Extjs

原文網址在此
{
    xtype: 'textfield',
    anchor: '100%',
    name: 'Alamat',
    fieldLabel: 'Alamat',
    emptyText: 'Alamat',
    listeners : {
       render: function(p) {
            var theElem = p.getEl();
            var theTip = Ext.create('Ext.tip.Tip', {
                html: 'Tuliskan nama jalan dan nomor rumah.<br>Misal: Jl. Merak, No. 3',
                margin: '0 0 0 200',
                shadow: false
            });
           
            p.getEl().on('mouseover', function(){
                theTip.showAt(theElem.getX(), theElem.getY());
            });
           
            p.getEl().on('mouseleave', function(){
                theTip.hide();
            });
        }
    }
},