援助教技--IT點滴日誌
系統整合就像交響曲一樣,各部都有表現的機會,但,也必須恰如其份地表現,才是完美地呈現IT獨有的真善美--儘可能地用最小的成本來解決最複雜的問題,皆大歡喜
2013年4月26日 星期五
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中所使用了,加油