目前日期文章:200901 (6)

瀏覽方式: 標題列表 簡短摘要
一、問題起因
在某項目釋放後Bug統計的附件《釋放後問題》裡有:

CSV處理時,如果處理的主題數過多,發生URL參數上限的錯誤;

可變長度的參數通過URL方式傳遞,會造成這種潛在的錯誤發生。

1、屬於2次發生問題,開發方面沒有及時通過checklist等方式向組員傳達相關注意事項;
2、測試時沒有作大批量數據的測試;

1、作為經驗添加至CheckList中,加強組內共享、檢查的效果;
2、加強測試點是否完備的檢查,重點關注對開發方面共性問題的測試;
通過對模塊原有GUI狀況確認,進行CSV輸出時,輸出結果很大的場合,CSV文件的內容不能輸出。

沒有考慮到POST數據量存在128K的大小限制。

這屬於新問題,以前從未遇見過,也沒有進行過大規模的數據量測試

已將此類檢查列出CheckList中
做為一種經驗積累,這些問題、原因及解決辦法將被列入Checklist,那麼:
第一個問題:URL參數上限的提法準確嗎?上限是多少?
第二個問題:為什麼POST時數據有限制?限制是128K嗎?
二、問題分析
1、第一個:
1)URL不存在參數上限的說法。該問題實際是IE對URL有長度限制的問題。
2)HTTP協議規範也沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。[參1]
3)「可變長度的參數通過URL方式傳遞」實際是說提交表單時使用了GET方法,而不是POST方法。造成這種潛在錯誤的是使用GET方法提交表單數據。因為GET方法將數據放在URL裡傳遞給服務器處理。
4)注意這個限制是整個URL長度,而不僅僅是你的參數值數據長度。
5)既然是IE對URL長度的限制,那麼不管是GET方法還是POST方法都存在這個限制。
(關於FORM的GET和POST方法具體內容請參考相關資料[參2])
建議:
1)瞭解應用程序所在的環境,如Web應用的瀏覽器、服務器環境,瞭解其特定的參數限制情況。
2)提交複雜數據儘量使用POST方法。注意FORM不寫method屬性時默認是使用GET方法。
結論(寫入Checklist):
對使用GET方法提交數據時,在IE環境下,需要考慮URL長度2083字節的限制。
2、第二個:
1)理論上講,POST是沒有大小限制的。HTTP協議規範也沒有進行大小限制。
2)「POST數據量存在128K的大小限制」不夠準確,POST數據是沒有限制的,起限制作用的是服務器的處理程序的處理能力。
3)對於ASP程序,Request對象處理每個表單域時存在100K的數據長度限制。但如果使用Request.BinaryRead則沒有這個限制。對於需要處理超過100K表單域數據的解決辦法,請參考後面的[參3]。
4)由這個延伸出去,對於IIS 6.0,微軟出於安全考慮,加大了限制[參4]。我們還需要注意:
IIS 6.0默認ASP POST數據量最大為200KB,每個表單域限制是100KB。
IIS 6.0默認上傳文件的最大大小是4MB。
IIS 6.0默認最大請求頭是16KB。
IIS 6.0之前沒有這些限制。
建議:
1)弄清楚運行環境的默認設定值有助於你的設計及對出現的問題做快速的解決。
2)應該考慮服務器版本。各個版本的IIS對這些參數的默認設定都不一樣,有必要的話,找資料整理出一份對照表。這樣開發與測試時都有個參考。
3)IIS 6.0的這些限制實際只是它的默認設定值而已,實際應用環境你可以修改它們。
在WINNT\system32\inetsrv\MetaBase.xml裡默認定義了:
AspBufferingLimit="4194304" 對應於上傳文件最大大小
AspMaxRequestEntityAllowed="204800" 對應於POST最大數據量
結論(寫入Checklist):
使用ASP時,需要考慮POST表單每個域一般讀取處理時有100KB的限制。充分考慮是否使用Request.Binary。

give 發表在 痞客邦 留言(0) 人氣()

The ALTER TABLE statement allows you to rename an existing table. It can also be used to add, modify, or drop a column from an existing table.

Renaming a table

The basic syntax for renaming a table is:

ALTER TABLE table_name
RENAME TO new_table_name;

For example:

ALTER TABLE suppliers
RENAME TO vendors;

This will rename the suppliers table to vendors.

Adding column(s) to a table

Syntax #1

To add a column to an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
ADD column_name column-definition;

For example:

ALTER TABLE supplier
ADD supplier_name varchar2(50);

This will add a column called supplier_name to the supplier table.

Syntax #2

To add multiple columns to an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
ADD ( column_1 column-definition,
column_2 column-definition,
...
column_n column_definition );

For example:

ALTER TABLE supplier
ADD ( supplier_name varchar2(50),
city varchar2(45) );

This will add two columns (supplier_name and city) to the supplier table.

Modifying column(s) in a table

Syntax #1

To modify a column in an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
MODIFY column_name column_type;

For example:

ALTER TABLE supplier
MODIFY supplier_name varchar2(100) not null;

This will modify the column called supplier_name to be a data type of varchar2(100) and force the column to not allow null values.

Syntax #2

To modify multiple columns in an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
MODIFY ( column_1 column_type,
column_2 column_type,
...
column_n column_type );

For example:

ALTER TABLE supplier
MODIFY ( supplier_name varchar2(100) not null,
city varchar2(75) );

This will modify both the supplier_name and city columns.

Drop column(s) in a table

Syntax #1

To drop a column in an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
DROP COLUMN column_name;

For example:

ALTER TABLE supplier
DROP COLUMN supplier_name;

This will drop the column called supplier_name from the table called supplier.

Rename column(s) in a table
(NEW in Oracle 9i Release 2)

Syntax #1

Starting in Oracle 9i Release 2, you can now rename a column.

To rename a column in an existing table, the ALTER TABLE syntax is:

ALTER TABLE table_name
RENAME COLUMN old_name to new_name;

For example:

ALTER TABLE supplier
RENAME COLUMN supplier_name to sname;

This will rename the column called supplier_name to sname.

Acknowledgements: Thanks to Dave M., Craig A., and Susan W. for contributing to this solution!

Practice Exercise #1:

Based on the departments table below, rename the departments table to depts.

CREATE TABLE departments
( department_id number(10) not null,
department_name varchar2(50) not null,
CONSTRAINT departments_pk PRIMARY KEY (department_id)
);

Solution:

The following ALTER TABLE statement would rename the departments table to depts:

ALTER TABLE departments
RENAME TO depts;


Practice Exercise #2:

Based on the employees table below, add a column called salary that is a number(6) datatype.

CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);

Solution:

The following ALTER TABLE statement would add a salary column to the employees table:

ALTER TABLE employees
ADD salary number(6);


Practice Exercise #3:

Based on the customers table below, add two columns - one column called contact_name that is a varchar2(50) datatype and one column called last_contacted that is a date datatype.

CREATE TABLE customers
( customer_id number(10) not null,
customer_name varchar2(50) not null,
address varchar2(50),
city varchar2(50),
state varchar2(25),
zip_code varchar2(10),
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);

Solution:

The following ALTER TABLE statement would add the contact_name and last_contacted columns to the customers table:

ALTER TABLE customers
ADD ( contact_name varchar2(50),
last_contacted date );


Practice Exercise #4:

Based on the employees table below, change the employee_name column to a varchar2(75) datatype.

CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);

Solution:

The following ALTER TABLE statement would change the datatype for the employee_name column to varchar2(75):

ALTER TABLE employees
MODIFY employee_name varchar2(75);


Practice Exercise #5:

Based on the customers table below, change the customer_name column to NOT allow null values and change the state column to a varchar2(2) datatype.

CREATE TABLE customers
( customer_id number(10) not null,
customer_name varchar2(50),
address varchar2(50),
city varchar2(50),
state varchar2(25),
zip_code varchar2(10),
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);

Solution:

The following ALTER TABLE statement would modify the customer_name and state columns accordingly in the customers table:

ALTER TABLE customers
MODIFY ( customer_name varchar2(50) not null,
state varchar2(2) );


Practice Exercise #6:

Based on the employees table below, drop the salary column.

CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
salary number(6),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);

Solution:

The following ALTER TABLE statement would drop the salary column from the employees table:

ALTER TABLE employees
DROP COLUMN salary;


Practice Exercise #7:

Based on the departments table below, rename the department_name column to dept_name.

CREATE TABLE departments
( department_id number(10) not null,
department_name varchar2(50) not null,
CONSTRAINT departments_pk PRIMARY KEY (department_id)
);

Solution:

The following ALTER TABLE statement would rename the department_name column to dept_name in the departments table:

ALTER TABLE departments
RENAME COLUMN department_name to dept_name;

give 發表在 痞客邦 留言(0) 人氣()

除了寫程式之外,資料庫的應用也是蠻重要的,而SQL語法,用法大致相同,但各公司所出的資料庫還是有所差別,而ORACLE SQL給了相當多的函數應用,下面列了一些函法的名稱和用法,並且會舉幾個例子,可以直接將SQL貼到ORACLE資料庫環境下試試.

1.常用函數
1.1 字元函數
=============================================================
1.1.1 ASCII
ASCII(char)

select ASCII(’A'), ASCII(’ABC’) from dual
=============================================================
1.1.2 CHR
CHR(n [USING NCHAR_CS])

select CHR(68), CHR(68 USING NCHAR_CS) from dual
=============================================================
1.1.3 CONCAT
CONCAT(string1, string2)
兩個字串的連結, 等同於使用連接運算子( || ).

select CONCAT(’Good’,’ Morning’), ‘Good’ || ‘ Morning’ from dual
=============================================================
1.1.4 INITCAP
INITCAP(string)
將一個字串中每個單字的第一個字母, 改變為大寫, 而將其它字母變成小寫.

select INITCAP(’good MORNING’) from dual
=============================================================
1.1.5 INSTR
INSTR(string1, string2,[, n[ ,m]])
搜尋string1, 以便找到string2, 並回傳在string1 中該字元的位置,
亦即string2 在 string1 中的開始之處.

select INSTR(’easy com , easy go’, ‘easy’) from dual
select INSTR(’easy com , easy go’, ‘easy’,1,2) from dual
=============================================================
1.1.6 LENGTH
LENGTH(string)
回傳字串中的字元數量

select length(’ABCD’) from dual
select length(’ABCD長度’) from dual
=============================================================
1.1.7 LOWER, UPPER
LOWER(string)
UPPER(string)
將字串中的所有字元轉換為大(小)寫.

select lower(’AbCd’) from dual
select upper(’AbCd’) from dual
=============================================================
1.1.8 RPAD, LPAD
RPAD(string1, n[string2])
LPAD(string1, n[string2])
填補字元(空白)至第N個位置

select rpad(’ABCD’,30,’A') from dual
select lpad(’ABCD’,30,’A') from dual
select rpad(’ABCD’,30) from dual
=============================================================
1.1.9 RTRIM, LTRIM, TRIM
LTRIM(string1,[,string2])
RTRIM(string1,[,string2])
TRIM(string1,[,string2])
移除所指定的字元, (預設值空白)

select rtrim(’ ABCD ‘) from dual
select ltrim(’ ABCD ‘) from dual
select trim(’ ABCD ‘) from dual
select trim(’ ABCD ‘) from dual
SELECT LTRIM(’JJJJJeryyyyyyJJ’,'J’) FROM DUAL
=============================================================
1.1.10 REPLACE
REPLACE(string, search_string, [,replacement_string])
字串取代

select replace(’I LOVE YOU’,'LOVE’,'HATE’) from dual
select replace(’I LOVE YOU’,'LOVE’) from dual
=============================================================
1.1.11 SUBSTR
SUBSTR(string, m [, n] )
回傳一個字串的一部份, m若為負值, 用法如同right function

select substr(’abcdefghijk’,3,2) from dual
select substr(’abcdefghijk’,-3,2) from dual
select substr(’abcdefghijk’,3) from dual
=============================================================
1.1.12 TRANSLATE
TRANSLATE(string, from_string, to_string)
將一個字元組轉換成另一個字元組, 來修改字串.

select translate(’smmfrr space’,'drmfslc’,'1234567′) from dual
=============================================================

1.2 轉換函式
=============================================================
1.2.1 TO_CHAR
TO_CHAR(d [, fmt [, ‘nlsparams’] ] )
將一個日期/時間的值, 轉換為一個以字元為基礎的值.
TO_CHAR(n [, fmt [, ‘nlsparams’] ] )
將一個數值轉換為一個以字元為基礎的值.

數字格式元�
9 用來控制要被顯示之數字的有效位數
0 前導0
$ 會以一個前置的錢字號來顯示
, 在輸出中放置一個逗號
. 標記小數點
B 強迫0值被顯示為空白
S 用於一個格式字串的開始或結束處, 來顯示(+/-)值

select to_char(’1234′,’9999′) from dual => 1234
select to_char(’1234′,’99999′) from dual => 1234
select to_char(’1234′,’999′) from dual => ####

select to_char(’1234′,’0000′) from dual => 1234
select to_char(’1234′,’000000′) from dual => 001234
select to_char(’1234′,’000′) from dual => ####

select to_char(’1234′,’S0999999′) from dual
select to_char(’1234′,’0999990S’) from dual
select to_char(’1234′,’$99999′) from dual
select to_char(’00120340′,’B999999′) from dual
select to_char(’1234′,’$99,999′) from dual
select to_char(’1234′,’S09999.99′) from dual
=============================================================
1.2.2 TO_DATE
TO_DATE(string [, fmt [, ‘nlsparams’]] )
將一個日期/時間值的字元字串, 轉換為date型別的值.

日期格式元�
格式元素 函式
DAY 日的名稱(Saturday, Sunday, Monday等)
DD 月份的天
DDD 年的天
DY 天的縮寫名稱(Sat, Sun, Mon等)
HH 一天的小時
HH12 一天的小時, 同HH
HH24 一天的小時, 24小時制
MI 分鐘
MM 月份數字
MON 三個字母的月份縮寫
MONTH 完整拼出的月份名稱
Q 一年中的季
SS 秒
WW 年的週
YYYY 四位數的年
YYY 年份的最後三位數
YY 年份的最後二位數
Y 年份的最後一位數

select to_date(’2004/03/10′,’YYYY/MM/DD’) from dual
select to_date(’2004/10/03′,’YYYY/DD/MM’) from dual
select to_date(’20040310′,’YYYYMMDD’) from dual
=============================================================
1.2.3 TO_NUMBER
TO_NUMBER(string [, fmt [, ‘nlsparams’] ] )
將字元型態轉換為數值型態

select * from user_tables order by to_number(INITIAL_EXTENT)
=============================================================
1.2.4 NVL
NVL(expr1, expr2)
如果一個給定的輸入值為null時, 會回傳一個另一值, 以便使用。假如expr1是null時, nvl會回傳expr2; 否則, 它會單純地回傳expr1.

select username, nvl(to_char(lock_date),’Not Locked’) from dba_users
=============================================================
1.2.5 DECODE
DECODE (expr , search , result [ , search , result…..] [ , default ] )
一個類似IF敘述的能力。

一般用法:
SELECT name, DECODE(
plugged_in,
0, ‘Not Plugged In’,
1,’Plugged In’,
‘Invalid plugged_in value’
) plugged_in
FROM v$datafile

進階用法:
SELECT SUM(DECODE(owner,’SYS’,1,0)), SUM(DECODE(owner,’SYSTEM’,1,0))
FROM dba_objects

巢式用法:
select owner, table_name, column_name,
DECODE(data_type,
‘VARCHAR2′,’VARCHAR2 (’ || TO_CHAR(DATA_LENGTH) || ‘)’,
‘NUMBER’, decode(data_precision,
NULL, ‘NUMBER’,
‘NUMBER (’ ||
TO_CHAR(DATA_PRECISION) || ‘,’ ||
TO_CHAR(data_scale || ‘)’ )))
from dba_tab_columns
where data_type in (’VARCHAR2′,’NUMBER’)

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

1.3 數字函式=============================================================
1.3.1 ABC
ABC(n)
回傳一個數字的絕對值

select ABS(-1), ABS(1) from dual
=============================================================
1.3.2 MOD
MOD (m,n)
回傳m除以n的餘數

select MOD(18,12), MOD(30,12), MOD(30,30) from dual
=============================================================
1.3.3 SIGN
SIGN(n)
回傳一個值, 以指出n的符號.
(-1 負數, 0 數字為零, 1 正數)

select SIGN(76), SIGN(0), SIGN(-76.17) from dual
=============================================================
1.3.4 GREATEST, LEAST
GREATEST (expr [ , expr…..] )
LEAST (expr [ , expr…..] )
從所提供之引數的列表中, 回傳最大(小) 值.

select GREATEST(1,2,3) from dual
select GREATEST(’One’,'Two’) from dual
select LEAST(1,2,3) from dual
select GREATEST(TO_DATE(’05/18/2004′,’MM/DD/YYYY’),
TO_DATE(’04/01/2004′,’MM/DD/YYYY’)) from dual

1.3.5 ROUND
ROUND(n, m)
把一個值進位到所指定之特定小數點的位數.
參數:
n: 指定一個將進位的值
m:
select ROUND(123.45), ROUND(123.45,1), ROUND(123.45,-1) from dual

give 發表在 痞客邦 留言(0) 人氣()

在創建GridView控件時,必須先為GridView的每一行創建一個GridViewRow對象,創建每一行時,將引發一個 RowCreated事件;當行創建完畢,每一行GridViewRow就要綁定數據源中的數據,當綁定完成後,將引發RowDataBound事件。如果說我們可以利用RowCreated事件來控制每一行綁定的控件,那麼我們同樣可以利用RowDataBound事件來控制每一行綁定的數據,也就是讓數據如何呈現給大家。

還舉同樣的例子,在數據表中,存在性別列,上面我們用DropListDown控件的DataBounding來表示出了中文的性別,但是畢竟不太美觀,我們現在可以利用Label控件和RowDataBound事件來實現完美的中文性別顯示。RowDataBound,

首先,還是把性別列,設置為模板列,並添加一個Label控件,將Label控件綁定到數據源的性別段,然後我們在GridView控件屬性的事件列表中雙擊RowDataBound,生成如下事件:

Example:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

//判斷當前行是否是數據行

if (e.Row.RowType == DataControlRowType.DataRow)

{ //用FindControl方法找到模板中的Label控件

Label lb1= (Label)e.Row.FindControl("Label1");

//因為RowDataBound是發生在數據綁定之後,所以我們可以

//判斷Label綁定的數據,如果是True,就更改其text屬性為男

if (lb1.Text== "True")

lb1.Text = "男";

else

lb1.Text = "female";

}

}

give 發表在 痞客邦 留言(0) 人氣()

一個月的第一天
代碼 (雙擊代碼複製到粘貼板)

SELECT to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd')
FROM dual


sysdate 為數據庫服務器的當前系統時間。
to_char 是將日期型轉為字符型的函數。
to_date 是將字符型轉為日期型的函數,一般使用 yyyy-mm-dd hh24:mi:ss格式,當沒有指定時間部分時,則默認時間為 00:00:00

dual 表為sys用戶的表,這個表僅有一條記錄,可以用於計算一些表達式,如果有好事者用 sys 用戶登錄系統,然後在 dual 表增加了記錄的話,那麼系統99.999%不能使用了。為什麼使用的時候不用 sys.dual 格式呢,因為 sys 已經為 dual 表建立了所有用戶均可使用的別名。


一年的第一天
代碼 (雙擊代碼複製到粘貼板)

SELECT to_date(
to_char(SYSDATE,'yyyy')||'-01-01','yyyy-mm-dd'
)
FROM dual


季度的第一天
代碼 (雙擊代碼複製到粘貼板)

SELECT to_date(
to_char(SYSDATE,'yyyy-')||
lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')||
'-01',
'yyyy-mm-dd')
FROM dual


floor 為向下取整
lpad 為向左使用指定的字符擴充字符串,這個擴充字符串至2位,不足的補'0'。

當天的半夜
SELECT trunc(SYSDATE)+1-1/24/60/60
FROM dual

trunc 是將 sysdate 的時間部分截掉,即時間部分變成 00:00:00
Oracle中日期加減是按照天數進行的,所以 +1-1/24/60/60 使時間部分變成了 23:59:59。
Oracle 8i 中僅支持時間到秒,9i以上則支持到 1/100000000 秒。

上個月的最後一天
代碼 (雙擊代碼複製到粘貼板)

SELECT trunc(last_day(add_months(SYSDATE,-1)))+1-1/24/60/60
FROM dual


add_months 是月份加減函數。
last_day 是求該月份的最後一天的函數。

本年的最後一天
代碼 (雙擊代碼複製到粘貼板)

SELECT trunc(
last_day(to_date(to_char(SYSDATE,'yyyy')||'-12-01','yyyy-mm-dd'))
)+1-1/24/60/60
FROM dual


本月的最後一天
代碼 (雙擊代碼複製到粘貼板)

select trunc(last_day(sysdate))+1-1/24/60/60
from dual



本月的第一個星期一
代碼 (雙擊代碼複製到粘貼板)

SELECT next_day(
to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd'),
'星期一'
)
FROM dual

next_day 為計算從指定日期開始的第一個符合要求的日期,這裡的'星期一'將根據NLS_DATE_LANGUAGE的設置稍有不同。

去掉時分秒
代碼 (雙擊代碼複製到粘貼板)

select trunc(sysdate)
from dual


顯示星期幾
代碼 (雙擊代碼複製到粘貼板)

SELECT to_char(SYSDATE,'Day')
FROM dual


取得某個月的天數
代碼 (雙擊代碼複製到粘貼板)

SELECT trunc(last_day(SYSDATE))-
to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd')+
1
FROM dual


判斷是否閏年
代碼 (雙擊代碼複製到粘貼板)

SELECT decode(
to_char(last_day(to_date(to_char(SYSDATE,'yyyy')||'-02-01','yyyy-mm-dd')),'dd'),
'28','平年','閏年'
)
FROM dual


一個季度多少天
代碼 (雙擊代碼複製到粘貼板)

SELECT last_day(to_date(
to_char(SYSDATE,'yyyy-')||
lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+3,2,'0')||
'-01','yyyy-mm-dd'
)
)
-
to_date(
to_char(SYSDATE,'yyyy-')||
lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')||
'-01','yyyy-mm-dd')
+1
FROM dual

give 發表在 痞客邦 留言(0) 人氣()

give 發表在 痞客邦 留言(0) 人氣()