2013年4月26日 星期五

安裝ODAC時&之前,務必做好的工作

材料--ODTwithODAC1120320_32bit
因為ODAC(oracle data access   component  as provider)時
準備工作:
1.把整個oracle的資料夾都備份起來,務必,因為odac沒裝好會修改一堆設定
2.在安裝ODAC時,類型選client,如下圖

3.目錄一定要跟你的oracle_home區隔開,要不就是在其下設定一個目錄給他,別被他亂改你的oracle_home設定就是了

以上,加油了

2013年4月22日 星期一

從System.Data.OracleClient改用Oracle.DataAccess.Client的作業

一.執行 ODTwithODAC1120320_32bit.zip中的setup.exe,安裝ODAC到vs2012
二.Visual Studio2012方面,NuGet安裝ODAC11.2 Release5 with Xcopy 及 Oracle Data Provider for .NET(ODP.NET)x64
  (前者與後者相依,會自動帶上)
三,connection string方面
格式「User Id=scott;Password=tiger;Data Source=oracle」
四,底層修改方面:
   command.ExecuteOracleScalar 改為 command.ExecuteScalar
必要時,修改建置的目的平台為x64
以上,加油

2013年4月21日 星期日

How to query the count of oracle connection ?

 SELECT s.username AS username,
  (
  CASE
    WHEN grouping(s.machine) = 1
    THEN '**** All Machines ****'
    ELSE s.machine
  END)     AS machine,
  COUNT(*) AS session_count
FROM v$session s,
  v$process p
WHERE s.paddr   = p.addr
AND s.username IS NOT NULL
GROUP BY rollup (s.username, s.machine)
ORDER BY s.username,
  s.machine;

System.Data.OracleClient.OracleInternalConnection.Enlist & HRESULT: 0x8007000B 的問題及解決

如果只是用一般的增刪修功能的話,一般的oracle client就夠應付的了
但是用到transaction,開啟第二條connection時,就會出現以下的錯誤:
System.Data.OracleClient.OracleInternalConnection.Enlist(String userName, String password, String serverName, Transaction transaction, Boolean manualEnlistment)
   於 System.Data.OracleClient.OracleInternalConnection.Activate(Transaction transaction)
   於 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
   於 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   於 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   於 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   於 System.Data.OracleClient.OracleConnection.Open()
   於 database.datatype.OracleTable.database.datatype.ITable.insertRecord(Record rec, Int32 seqColmnIndex)
試圖載入格式錯誤的程式。 (發生例外狀況於 HRESULT: 0x8007000B)
解決之道是除了在「方案」->「屬性」->「建置」:目標平台由Any Cpu改為x86之外,

connection  string也要加上「Enlist=false;Pooling=false;」這兩個參數
(上述兩項修改完後,請清除重建方案)
就可以解決這個例外了
為什麼會有這樣的代志發生?
請參這個連結 
 

2013年4月20日 星期六

how to post an array from extjs client and parsed by asp.net mvc

1.in client page:
 even data is stored in model,but since we use the 「Ext.JSON.encode」,have to trim
before we send ,for example:
===============================================
                   var arrSubmit = new Array();
                   for (var i = 0; i < gridSelected.getStore().getCount() ; i++) {
                       var rec = gridSelected.getStore().getAt(i);
                       var rec2Send = {
                           COS_CODE: rec.get('COS_CODE'),
                           COS_NAME: rec.get('COS_NAME'),
                           SBJ_CODE: rec.get('SBJ_CODE'),
                           SBJ_NAME: rec.get('SBJ_NAME'),
                           GRP_CODE: rec.get('GRP_CODE'),
                           GRP_NAME: rec.get('GRP_NAME'),
                           GRP_DTL: rec.get('GRP_DTL'),
                           TTL_SLOT: rec.get('TTL_SLOT'),
                           SELECTED: rec.get('SELECTED')
                       };
                       arrSubmit.push(rec2Send);
==============in the ajax request  function==============
                       Ext.Ajax.request({
                       url: "......your url to handle the request....",
                       method: 'POST',
                       params: {
                           dateString: timeStamp,
                           recsInString: Ext.JSON.encode(arrSubmit).replace(/<br\/>/g,"\\n")
                             
                       },
                       success: function (response) {
                           alert("Error: " - response.responseText);
                       },
                       failure: function (response) {
                           alert("Error: " - response.responseText);
                       }
                   });
================at server side,how it receive===========================
        public JsonResult RcvPreRegSubjGrp(string dateString,string recsInString) {

            List<MdlCosSbjGrpDtl> recs = JsonConvert.DeserializeObject<List<MdlCosSbjGrpDtl>>(recsInString);
               
            for (int i = 0; i < recs.Count ;i++ )
            {
                util.SqlLog.writeLog(dateString+" recieved pre-reg data is ",
                      recs[i].toLogString()
                    );
            }
        ....
        .....
         ....
======================================================
以上

2013年4月19日 星期五

關於extjs grid的一些小技巧--groupHeaderTpl,格子內的文字樣式(style)....

1.feature group的group字串,是有一定的格式的,其中的「{name}」是固定的指向store中的「groupField」,別三八假賢慧換成自己的dataIndex,是行不通的,
參考以下範例:
==========順便示範如果把其他的資料秀在group header中==============
            ,features: [
                   Ext.create('Ext.grid.feature.GroupingSummary', {
                       //---groupHeaderTpl的那個對應資料欄位真的就是「name」,別問我為什麼,這是試出來的
                       groupHeaderTpl: 'Subject Code : {name} ,Name: {[values.rows[0].get("SBJ_NAME")]}'
                   })
            ]
=======================================

2.欄位中的文字,要套用css,如何設定?
首先,先指定該欄的tdCls,再定義一個css來對應,如
=====css================
        td.GroupDtlStyleClass .x-grid-cell-inner {
            font-family: "Lucida Console", Monaco, monospace;
            font-style: normal;
            font-size:small;
        }
        td.chkBoxClass .x-grid-cell-inner {
            vertical-align:middle;
        }
=========對應到 column物件=======
                {
                    xtype: 'gridcolumn',
                    width: 200,
                    tdCls: 'GroupDtlStyleClass',
                    dataIndex: 'GRP_DTL',
                    text: 'Group Info.'
                },{
                    xtype: 'checkcolumn',
                    dataIndex: 'SELECTED',
                    width:50,
                    text: 'Select',
                    tdCls: 'chkBoxClass'              
              }...
==============================
看出其中的對應關係了嗎?

3. 不要隨便呼叫parent.doLayout(),應改為呼叫 parent.updateLayout()
 這案例是在顯示/隱藏一個panel,設定show/hide後,如果做了parent.doLayout,那隱藏的panel會跑到畫面下半段,變成「蘿蔔蹲現象」,參考以下片刻:
======我們在image物件加上click事件==============
                                        src: './DogEar_1346.png',
                                        listeners: {
                                            el: {
                                                click: function () {
                                                    var cmp = Ext.getCmp('PnlListSjbGrp2Select');
                                                    //做左側功能表的開關
                                                    if (cmp.hidden) {
                                                        cmp.show();
                                                    } else {
                                                        cmp.hide();
                                                    }
                                                   //me是這個元件的最外圍容器
                                                  //注意,是呼叫「updateLayout」,而不是「doLayout」
                                                    me.updateLayout();
                                                   
                                                }
                                            }
                                        }

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

2013年4月16日 星期二

Extjs 4 如何列舉表單欄位,並一口氣把所有有問題欄位告知user

        var me = this;
        if (!this.getForm().isValid()) {
            //findout invalid fields
            var fields = me.getForm().getFields();
            var errorField = '';
            for (var i = 0; i < fields.getCount() ; i++) {
                var field = fields.getAt(i);
                if (!field.isValid()) {
                    if (errorField.length > 0) errorField += "<br>";
                    errorField += field.getFieldLabel();
                }
            }
            Ext.Msg.alert('Validate failed in field(s):<br>'+errorField);
            return;
        }

2013年4月13日 星期六

加入了跟使用者登入權限有關的partial view後,頁面會一直跑回login介面?

答案很簡單,因為你還沒登入就要使用權限相關機制
在Html.RenderAction時,filter在無法得到登入資料時,會導向login form (在你的web.conf中<authentication....> <forms loginUrl=....> 設定)
而此時,你的form的returnUrl又指向目前所在,於是就成了登入後還是直留在登入介面
解決之道,在主頁面要呼叫Html.RenderAction時
要加入「@if(Request.IsAuthenticated)」的檢查
如果有Authentication,再呼叫Html.RenderAction
example:
in _layout.cshtml
.....
...
    @if(Request.IsAuthenticated){
       Html.RenderAction("_userFunctionList", "TcsAccount");
    }
....
......

2013年4月11日 星期四

如何防止表單被多次 submit (for asp.net MVC form with validation)

MVC架構幫了我們做很多工作,
但是在client方面,真的還是要自己多下點工夫比較好
如果使用者故意用北斗百裂拳做一個表單多次提交(click submit button ) 的動作
會有意想不到的結果
(不過,如果是server效能差或是需要大量運算才能回應時,這真的不能怪user手賤,像我耐性就很差了,會到處亂點的)
這時,要用以下的方式:
請在你表單的script section做以下的調整(真的,加入就可以了,不用改,因為這是非入侵性的寫法)
========================================
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
<script>
    $(document).on('invalid-form.validate', 'form', function () {
        var button = $(this).find('input[type="submit"]');
        setTimeout(function () {
            button.removeAttr('disabled');
        }, 1);
    });
    $(document).on('submit', 'form', function () {
        var button = $(this).find('input[type="submit"]');
        setTimeout(function () {
            button.attr('disabled', 'disabled');
        }, 0);
    });</script>
}
============================================
這時,就算是表單驗證不成,submit button還是會恢復可用狀態
很好用的
這是我在這裡所找到的解決方法,提供給需要的朋友參考


2013年4月5日 星期五

'IIS APPPOOL\DefaultAppPool' 的登入失敗的問題所在及如何解決

最近因為把開發環境的web application porting到azure平台的IIS8
(for windows server 2012)時,
因為有帳密(USER/ROLE)之故所以遇到這樣的現象
app_data裡面的東西,應該是整個清空重建,怎麼重建正式環境的IIS user/role?
首先,除了先建立好你的web app實體路徑對應之外,為了要讓應用程式集的「應用程式」要能吃web config中的一堆connnection string,要到應用程式集區找出執行你的應用程式進階設定做以下的修改:
這樣才能走下去
好了,之後我們要設定applicatio的 user & role,不必再灌個vs2012然後在asp.net 組態設定,
請直接切到那個web application 的設定中,有兩個東西 --.net 使用者 & .net 角色--如下圖
請依之前我們在vs2012 asp.net組態設定時設定帳密及角色
至於「連結字串」及「提供者」不要動,讓IIS預設就可以了

現在你執行你的web app的登入介面時,一定會有
「 'IIS APPPOOL\DefaultAppPool' 的登入失敗」的錯誤訊息
這就是今天的重點了,你除了要在app_data中的 「ASPNETDB.MDF」及「aspnetdb_log.ldf」 兩個檔案要加入「IIS APPPOOL\DefaultAppPool 」的read/write權限之外,接著在IIS中把default web server停下來(否則會有lock的現象發生)
在MSSQL 2012express的manager studio,
1用windows admin登入
2.把ASPNET.MDF掛入資料庫
3在安全性-->登入的user加入這個虛擬帳號,並設定相對權限(對整個MSSQL server而言)
 如圖:
set default conneted DB to the APSNETDB.MDF




設定登入使用者及資格對象

5.設定完之後,也要到那個被附掛的db設定 「IIS APPPOOL\DefaultAppPool」的相對權限:

以上設定完成後,再到IIS中把預設的web server啟動
如此,登入及驗證角色的機制就可以為application中所使用了,加油