2016年3月9日 星期三

C# Oracle Client 執行多行SQL回傳影響列數為-1 | C# Oracle Client execute multiple line sql number of rows affected return -1

問題:
當執行多行ORACLE SQL、如BEGIN ...END,或者MERGE INTO等指令時會,
ExecuteNonQuery()都只會回傳-1,這樣就無法看出影響列數

解決方法參考
http://stackoverflow.com/questions/32138843/merge-query-returns-1-instead-of-number-of-rows-merged

原本的SQL加上一段
:num := sql%rowcount;
且增加一個OUTPUT變數
OracleCommand cmd = new OracleCommand(sql, myConnection);
  var p = cmd.Parameters.Add(":num", OracleDbType.Int32, ParameterDirection.Output);
  cmd.ExecuteNonQuery();
  Console.WriteLine("Rows affected: " + p.Value);
執行之後讀取變數的值即可得到影響列數

-----------
寫成int回傳方法時
舊的System.Data.OracleClient裡面我這樣寫轉換:
count = (int)p.Value;
是可以跑的,但在新的Oracle.DataAccess.Client裡面
我要這樣轉換
(參考: http://stackoverflow.com/questions/3026036/convert-oracleparameter-value-to-int32 )
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
轉換時才不會出現InvalidCastException

2016年2月26日 星期五

ORA-01722 invalid number

今天在處理一個卡號欄位,原本是6位數字卡號,
現在新需求是把卡號的主檔裡一些欄位資訊帶出來,
所以理所當然就做一個JOIN就結束,
同時也做了另外幾個相同功能裡面的新需求,
本機+測試DB上跑也正常,
但到了本機+正式機DB測試後卻跳了ORA-01722 invalid number錯誤,

兜了快20分鐘,甚至找歪方向,發現拿掉
ROW_NUMBER() OVER( ORDER BY MY_DATE DESC )
這個行號欄位後就能跑,但實際上問題不在這裡,整個誤導思路...

後來才想通,有新需求才有新BUG,檢視新加的TABLE才想起來,
因為這個卡號欄位後來又塞了不是數字的值,
所以JOIN時文字對上數字,就發生ORA-01722錯誤,
解決辦法就是把主檔TABLE的數字ID轉文字,JOIN就成功了...

不過如果一次只處理一個需求,找問題發生點時或許就可以明確指出是這個TABLE了

2016年1月15日 星期五

asp.net web form updatepanel + jQueryUI dialog 按鈕postback造成textbox文字消失 | button postback cause textbox text missing

功能情境:
一個網頁有查詢區跟查詢結果gridview
GRID的資料行有可以點擊查看明細的按鈕
明細的DIV用jquery UI 的dialog來顯示
明細DIV裡有包在updatepanel裡的明細Grid
並且有一個同意按鈕 跟一個加備註按鈕 和備註文字textbox
原本只設定了按鈕的onClick 後端程式
但是按下按鈕postback時會無法觸發後端事件

所以我找到一篇說
前端的按鈕click事件加上

__doPostBack($('input[id$="按鈕ID"]').attr("id"), null);

的事件來觸發postback

但只有同意按鈕正常運作,需要填備註的按鈕就出問題了
同樣做法會讓備註文字欄的文字在postback後消失,
但是又不想要整個打掉改寫成Ajax 要改太多了,
所以又再找了一下做法,找到以下這篇
http://blog.roonga.com.au/2009/07/using-jquery-ui-dialog-with-aspnet-and.html

解法很簡單就是在dialog設定的open事件中加上

$(this).parent().appendTo("form");


還有updatePanel的屬性加上 ChildrenAsTriggers="true"
就成功觸發後端事件了

PS:記得移除前面那個__doPostBack不然會變成觸發兩次...

2016年1月12日 星期二

jquery ui dialog 關閉按鈕圖案消失 jquery ui dialog button icon missing

問題:
在一個有載入jquery ui跟bootstrap的網頁裡
dialog的關閉按鈕的icon不見了
但同樣的功能別的網頁上都正常

解決:
查了半天發現是css載入順序問題
要先載入bootstrap的css再去載入jquery ui的css
icon就出現了

2015年12月23日 星期三

blockUI jQuery配bootstrap無法置中 | blockUI with jQuery bootstrap not center properly

問題情境:
一個表單,上半部要先填條件後帶出資料,才繼續填下半部
下半部的ui先用blockUI罩起來,中間顯示「請填上半部的資料」
結果那個顯示文字在BOOTSTRAP的表單置中樣式套用後就歪掉了

解法:
顯示訊息的時候指定
centerX: false,
centerY: false

參考:
Why does my div not center properly?http://stackoverflow.com/questions/2518465/why-does-my-div-not-center-properly


2015年12月21日 星期一

沒有權限存取資料夾 的IIS 資料夾權限設定

網站有個功能需要刪除資料夾內的檔案
但預設沒有權限可以存取

解決方法:
對該資料夾按右鍵→內容→安全性
新增使用者名稱填入
IIS AppPool\(在IIS的集區名字)
按確定,就會多出一個集區使用者,就可以針對他來做權限設定了

2015年12月4日 星期五

ASP.NET GridView Header flow by scroll up and down use JQuery | WebForm的Gridview 欄標題 以JQuery置頂的方法

WebForm的Gridview元件想要讓欄標題可以置頂的方法

我的Gridview是用template做版面的,資料很多很長,捲下去時就看不見欄標題,很不方便,

解法參考來源:
http://stackoverflow.com/questions/2177983/how-to-make-div-follow-scrolling-smoothly-with-jquery
answered by ajax333221

1.原本是只有設定HeaderText,現在要加上HeaderTemplate,然後用div包起來標題文字


<asp:TemplateField HeaderText="標題" HeaderStyle-HorizontalAlign="Left">

                                <HeaderTemplate>

                                    <div class="divTH">

                                        <label>標題</label>

                                    </div>

                                </HeaderTemplate>

                                <ItemTemplate>

                                   ......

                                </ItemTemplate>

</asp:TemplateField>


2.div給一個css class,這個class加上fixed時就會固定置頂


.divTH.fixed {

                position: fixed;

                top: 0;

            }


3.JQUERY


$(document).ready(function () {

if (!($.browser == "msie" && $.browser.version < 7)) {

            var target = ".divTH", top = $(target).offset().top - parseFloat($(target).css("margin-top").replace(/auto/, 0));

            $(window).scroll(function (event) {

                if (top <= $(this).scrollTop()) {

                    $(target).addClass("fixed");

                } else {

                    $(target).removeClass("fixed");

                }

            });

        }

});

2015/12/25 追記:
如果有GridView是不要一進網頁就databinding的,那網頁ready的時候就沒有欄位標題可以註冊,
這樣就讓效果無效了,我想到的兩種解決方法:

一種是把Jquery部分改放到function pageLoad() { }事件,
這個事件會在aspx postback回來後觸發
但要判斷有沒有註冊過window scroll 才去註冊那個事件
不然每次post back都會註冊一次 就會有問題
我沒有把這方法做完,改用我想到的第二種方法

第二種比較簡單的方法是,設定gridview屬性ShowHeaderWhenEmpty="true"
然後在page load事件給gridview空的source後bind
gv.DataSource = new DataTable();
gv.DataBind();
這樣就會沒資料但顯示標頭,就可以讓javascript註冊事件