一. 查找重複記錄
1. 查找全部重複記錄
Select * From 表 Where 重複字段 In (Select 重複字段
From 表 Group By 重複字段 Having Count(*)>1)
2. 過濾重複記錄(只顯示一條)
Select * From HZT Where ID In (Select Max(ID) From HZT Group By Title)
注:此處顯示ID最大一條記錄
二. 刪除重複記錄
1. 刪除全部重複記錄(慎用)
Delete 表 Where 重複字段 In (Select 重複字段 From 表
Group By 重複字段 Having Count(*)>1)
2. 保留一條
Delete HZT Where ID
Not In (Select Max(ID) From HZT Group By Title)
三. 過濾select查詢得到的重複數據
1.
過濾一次select查詢中的重複數據:
select distinct HZD from t_Table where MZD in (...)
distinct
2.
過濾兩次select查詢中的重複數據:
select。。。where 。。(select 。。。。。。union select。。。。)
介紹幾個SQL指令:
UNION
,用於獲取兩個結果集的並集,會自動去掉結果集中的重複行,並會以第一列的結果進行排序
INTERSECT
,用於獲取兩個結果集的交集,並且以第一列排序
MINUS
,用於獲取結果集的差集(或者說補集),顯示第一個結果集存在的,第2個結果集不存在的數據
UNION ALL
,與UNION相似,不同的是UNION
ALL不會自動去處重複行,也不會以任何列排序
Ltrim,Rtrim
,去除左右的不同字符串
以上個指令的具體用法去查資料,在此做個備忘
2009年2月20日
從服務器上傳和下載
==============================================
上傳
==============================================
GetDb_IT myGetDb_IT = new GetDb_IT();
SqlDataReader dr;
string mysql = "";
string
DB_Path="";
string path = "";
DB_Path =
"Document/" + Path.GetFileName(myFU.PostedFile.FileName);
mysql =
"select 路徑 from 文檔管理 where 項目號='" + Session["PNO"].ToString() +
"'";
dr = myGetDb_IT.GetDataReader(mysql);
if
(dr.Read())
{
path =
Server.MapPath(DB_Path);
myFU.PostedFile.SaveAs(path);
//保存文件
myLBL.Text = "上傳成功!";
mysql =
"update 文檔管理 set 路徑='" + DB_Path + "',上傳人='" +
HttpUtility.UrlDecode(Request.Cookies["User"].Value).ToString().Trim()+"',上傳時間='"+System.DateTime.Now.ToShortDateString()+"'
where 項目號='"+Session["PNO"].ToString()+"'";
myGetDb_IT.Update(mysql);
}
dr.Close();
myGetDb_IT.close();
===============================================
下載
===============================================
string fileName =
HttpUtility.UrlEncode("aaaa.xls").ToString();
string filePath =
Server.MapPath(dr["路徑"].ToString());//路徑
FileInfo fileInfo = new
FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" +
fileName);
Response.AddHeader("Content-Length",
fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding =
System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
2009年2月11日
推薦一個操作Zip文件的開源類庫:DotNetZip (轉)
DotNetZip 是一個短小易用的用來操作 zip 文件的 .NET 類庫,支持.NET的任何語言,可很方便的創建,讀取,和更新zip文件。而且還可以使用在.NETCompact Framework中。
下面是一些簡單的例子:
1.加密壓縮:
using (ZipFile zip = new ZipFile())
{
zip.Password = sPassword; //set pwd
zip.AddDirectory(sZipDir);
zip.Save(sSavePath + @"/" + sSaveName);
}
2.向壓縮文件中添加:
using (ZipFile zip = new ZipFile("Backup.zip" ))
{
zip.Password= "123456!" ;
zip.AddFile("ReadMe.txt" );
zip.AddFile("7440-N49th.png" );
zip.AddFile("2005_Annual_Report.pdf" );
zip.Save();
}
3.解壓縮到制定目錄:
using (ZipFile zip = ZipFile.Read("D://test//2007.zip" ))
{
foreach (ZipEntry e in zip)
{
Console.WriteLine("file name:{0}" , e.FileName);
Console.WriteLine(e.Comment);
e.Extract("D://test//pwdata" , true ); // overwrite == true
}
}
其他詳細的使用請參考:http://www.codeplex.com/DotNetZip
原文:http://www.cnblogs.com/carysun/archive/2009/02/11/dotnetzip.html
2008年12月22日
在線勸說:7種說服人們網絡購買的方法
說服不是什麼高科技。它需要理解人性的各方面,這些方面通常是自動的或在人類潛意識層面工作。以下是7種說服人們的方法。
1.Show what others are doing 向人們展示其他人在做什麼
人們觀察他人,並經常模仿他人的行爲,尤其是在一些他們不確定的事情上。這種心理現象被稱爲“社會證明”。人們會感覺安心,並且經常以他人的行爲爲基礎進行決策。他們假設他人擁有更多的知識或者比他們自己知道得更多。
你能夠通過以下方式增強在線社會證明:
- 展示最熱門的條目。
- 展示“買了這些了顧客還買了哪些”。
- 展示最暢銷的東西。
- 展示證明書或者獎狀。
另外,人們會做那些他們所喜歡的人正在做的事。
2.Show user-generated reviews 提供用戶評論
用戶評論會對人們的購買決策產生巨大的影響。由於web 2.0和社會性媒體的快速成長,用戶評論成爲網站設計的必要組成部分。讓你的用戶在網站上寫評論,讓他們對產品和服務進行總體評級——畢竟,這些是你網站的免費內容。與營銷 人員相比,網絡用戶更願意相信那些像他們一樣的用戶所說的話。對於旅遊和電子產品網站來說,評論尤其重要。
人們通常需要查看用戶評論,如果他們在你的網站上找不到評論,他們會到別處去看。在網絡上沒有任何東西可以隱藏起來,因爲你必須將他們保存在你的網站上。Figleaves15和UK Apple store16在這方面就做得很好。
另外,不要害怕負面評論。用戶在一英里之外就能聞得出來這個網站是否被“編輯”過,這會讓他們不相信你說的任何話。你應該準備好對顧客的負面評論進行快速的反應,而不是刪除。
3.Show scarcity of products 展示商品的稀缺性
稀缺產生需求,並鼓勵人們更快地購買。人們想要那些他們認爲他們不能擁有的東西,社會心理學表明,失去是一種比得到更強烈的感情。因此,一個失去100元的人所推動的滿足感是一個僥倖獲得100元的人所得到的滿足感的2倍左右。
你能夠通過展現以下的詞語來表現稀缺:
-僅剩1星期
-只有兩個庫存
-最後清倉
-暫無商品,添加至期望清單
-此商品還剩2天4小時3分17秒售罄 (可用計時器)
Webcredible在它的網站上展示剩餘培訓課程的數量。該數量每日遞減,只到這些課程都被預訂出來。這樣做給訪問者一種緊迫的感覺,他們需要在這些課程都賣出去之間預訂。關於決策的研究也表明,與人們從來沒有擁有某樣物件相比,當人們感覺他即將失去該物時,他會認爲此物更有價值。
4. Persuade with pictures & videos 通過圖片和視頻來說服
在產品銷售 方面,尤其對高價值和奢侈性產品,圖像是一種非常具有說服性的工具。因此,確保提供商品的高清晰圖片。他讓人們對其將要購買的產品放心大有幫助。
圖片必須:
-擁有專業的質量
-提供不同的觀察視角
-可放大的
-說服大小和使用場景
Oli17是一個賣衣服的網站,已經走在了前面。他們有一個15秒鐘的視頻片段,讓模特們身穿他們的衣服,走着貓步,這讓你對商品的外觀擁有更好的感覺和感受。隨着帶寬的增長,這可能是一些網站未來的發展趨勢。看視頻比閱讀所需要的努力少得多,並能夠提供更豐富的體驗。記得讓用戶能夠選擇,而不是在打開網站時,自動播放視頻。
5. Cross- and up-sell 交叉銷售 和提升銷售
那個建議“嘿,爲什麼我們不問顧客是否要點炸土豆條?”的人會變得更強。一旦人們決定要購買,說服他們買更多的東西將會變得容易,因爲他們的一隻腳已經踏進門裏了。在網絡上,這一原理仍然有效。
不要低估交叉銷售 和提升銷售所帶來的潛在利潤。像在真實商店裏一樣,向用戶展示相關商品和額外產品。這會使人們更快和更容易的購買更多商品。例如,瀏覽一下Ocado18上的百吉餅,他們仍然會在你付帳的時候向你展示奶油乾酪。他們展示任何你可能錯過的東西,一個說服你買更多東西的聰明策略。
6. Show authority 展示權威
權威原理表明,我們更容易被權威所說服。如果Tiger Woods對你的完全高爾夫教程提供一些建議,你更傾向於聽他而不是你的同學Bob給出的同樣建議。同樣,展示權威和專家的網站更容易被相信。對於B2B網站來說,這更重要。
你可以通過以下方式展示權威:
-表明你是一個專家
-展示第三方網站的數據和鏈接
-參考政府和權威機構
-展示權威的符號和圖片
7. Allay people's fears 緩和人們的擔心情緒
如果我想退貨怎麼辦?存在隱性的成本嗎?這些是購物者可能有的一些擔心情緒。你需要降低這種情緒如果你想說服人們和你做生意。提前、快速地回答人們這些顧慮能夠對人們產生積極的影響,並減少他們的擔心。
Conclusion 結論
簡單來說,說服就是給你的用戶提供做出適當選擇時所需要的信息,幫助他們信任你並減輕他們的任何顧慮。它不是操縱。記住,這些說服策略只能做到如此——你的網站仍然需要提供好的服務。
2008年9月8日
DataGrid實現自增列、單選、多選 (轉載)
(1)實現自增列
只需要在前臺添加一個模板列,綁定ItemIndex+1就可以了
<asp:TemplateColumn
HeaderText="選擇">
<ItemTemplate>
<%#
Container.ItemIndex+1%>
</ItemTemplate>
</asp:TemplateColumn>
(2)實現單選
在上面的基礎上,爲這個列加一個radio
<asp:TemplateColumn HeaderText="選擇">
<ItemTemplate>
<%# Container.ItemIndex+1%>
<input type=radio name="rad" value='<%#
Container.ItemIndex+1%>'>
</ItemTemplate>
</asp:TemplateColumn>
radio的值也就是自增的1-PageSize
再創建一個按鈕(名字叫單選),爲之添加如下代碼
this.Label1.Text = "選擇的行號:" +
Request.Form["rad"].ToString();
這樣簡單的幾步雖然實現了顯示選擇的行號,但是在按下按鈕以後,radio的選擇是不能被保留的,原因是這個radio不是runat=server的,我們需要再爲這個頁面放置一個隱藏域(需runat=server)用來在點擊按鈕的時候保存選擇的radio,在前臺添加<input
type="hidden" id="rd" runat="server"
name="rd">(注意,不要把這個添加到DataGrid中),然後再在剛纔那個按鈕中添加rd.Value =
Request.Form["rad"].ToString();(如果vs.net沒有爲這個HtmlInputHidden申明的話你自己加上protected
System.Web.UI.HtmlControls.HtmlInputHidden
rd;)。到現在爲止還沒有完成,雖然HtmlInputHidden裏面已經保存了選擇的行號,但是還需要在頁面Load的時候讓這個radio爲選擇狀態,修改Page_Load()爲
private void
Page_Load(object sender, System.EventArgs e)
{
string js = "";
js+="<script>/r/n";
js+="function ld(){/r/n";
js+="for(i=0;i<document.getElementsByName('rad').length;i++)/r/n";
js+="if(document.getElementsByName('rad')[i].value==";
js+="document.getElementById('" + this.rd.ClientID + "').value) ";
js+="document.getElementsByName('rad')[i].checked=true/r/n";
js+="}/r/n";
js+="window.οnlοad=ld/r/n";
js+="</script>/r/n";
this.RegisterStartupScript("js",js);
if(!IsPostBack)
{
SetBind();
}
}
下面分析一下以上的這段代碼:
問:爲什麼不把代碼放在 if(!IsPostBack)中呢?
答:放不放還需要明確 if(!IsPostBack)的意思(具體見
http://blog.csdn.net/lovecherry/archive/2005/02/25/301441.aspx
中的說明),其實確切的說應該把這段代碼放到 if(!IsPostBack){}else{放到這裏}來,因爲第一次加載頁面的時候,隱藏域裏面是不可能有東西的(第一次加載頁面你都選擇並且點擊按鈕提交,怎麼會有東西呢?)
問:/r/n是什麼東西?
答:這個是換行,放不放對代碼運行沒有影響,但是如果放了換行的話,在客戶端的呈現可以更加清晰
問:爲什麼取rd的值要用document.getElementById('" + this.rd.ClientID +
"').value不用document.getElementById('rd').value 呢?
答:其實在這裏你可以後者,但是要知道一點,就是rd是服務端的控件,在某些情況下,id在客戶端的呈現不是在aspx中你指定的id了,而是控件.ClientID,比如在DataGrid中放置的一些服務器端控件,查看一下源代碼可以看到id是類似DataGrid1__ctl5_Hyperlink1而不是你指定的id了
問:這裏爲什麼不用RegisterClientScriptBlock呢?
答:在這裏,這也是無所謂的你可以使用RegisterClientScriptBlock,因爲這段js是自運行的(js+="window.οnlοad=ld/r/n";這句)的,所以不管在form的開始或是結束呈現都不會影響到結果
(3)實現多選
首先在前臺加入如下的代碼(添加一列)
<asp:TemplateColumn>
<ItemTemplate>
<input type="hidden"
id="SelectedID" runat="server"
value='<%# Container.ItemIndex%>'
NAME="SelectedID"/>
<asp:CheckBox ID="chkExport" Runat="server"
/>
</ItemTemplate>
</asp:TemplateColumn>
爲頁面加入一個按鈕(名字叫多選),爲之添加以下代碼
foreach(DataGridItem di in
this.DataGrid1.Items)
{
if(((CheckBox)di.FindControl("chkExport")).Checked==true)
{
this.Label1.Text+=this.DataGrid1.DataKeys[int.Parse(((HtmlInputHidden)di.FindControl("SelectedID")).Value)]+"<br>";
}
}
點擊了這個按鈕就在label的位置顯示了所有選擇的項目對應的數據表主鍵的值,可以利用這個值進行一些數據庫的操作
比如:
string
s="";
foreach(DataGridItem di in this.DataGrid1.Items)
{
if(((CheckBox)di.FindControl("chkExport")).Checked==true)
{
s+=this.DataGrid1.DataKeys[int.Parse(((HtmlInputHidden)di.FindControl("SelectedID")).Value)]+",";
}
}
SqlConnection conn=new
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand comm=new SqlCommand("delete from tb1 where ID in (",conn);
comm.CommandText+=s.Substring(0,s.Length-1)+")";//刪除最後一個逗號
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
SetBind();
你可以再添加兩個按鈕,一個叫選擇所有,一個叫取消所有選擇,爲之分別添加如下代碼
foreach(DataGridItem di in
this.DataGrid1.Items)
{
((CheckBox)di.FindControl("chkExport")).Checked=true;
}
foreach(DataGridItem di in
this.DataGrid1.Items)
{
((CheckBox)di.FindControl("chkExport")).Checked=false;
}
下面分析以上上面的代碼:
問:選擇所有和取消所有選擇的按鈕是提交到服務器的,能否不提交實現?
答:首先明確,模板列中的checkbox是runat=server的,上面說了,在客戶端的呈現id是類似DataGrid1__ctl9_chkExport這樣的,所以在客戶端js取的時候我們只能通過控件.ClientID來取,如果在Page_Load的時候來取的話是取不到的,因爲checkbox是放在DataGrid模板列中的,在Page_Load的時候DataGrid還沒有Created。解決辦法就是同上面單選的一樣,統一使用一個server端的隱藏域來保存多選的項目,然後替換模板列中的<asp:CheckBox>爲html的checkbox,在選擇時候來更改隱藏域中的值(通過js,所以不會提交頁面),同樣在點擊多選按鈕的時候,通過讀取隱藏域中的值來得到選擇的項目,這樣其實是一個代碼以服務端爲主到客戶端爲主的一個轉變,在有的時候服務端和客戶端的交互通過隱藏域是非常方便的。在後續文章中會詳細給出跨頁面多選,同時也實現了客戶端選擇所有和取消所有選擇的例子。