1. 打開新的窗口並傳送參數:
傳送參數:
response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")
接收參數:
string a = Request.QueryString("id");
string b = Request.QueryString("id1");
2.爲按鈕添加對話框
Button1.Attributes.Add("onclick","return confirm(’確認?’)");
button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}")
3.刪除表格選定記錄
int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()
4.刪除表格記錄警告
private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
{
switch(e.Item.ItemType)
{
case ListItemType.Item :
case ListItemType.AlternatingItem :
case ListItemType.EditItem:
TableCell myTableCell;
myTableCell = e.Item.Cells[14];
LinkButton myDeleteButton ;
myDeleteButton = (LinkButton)myTableCell.Controls[0];
myDeleteButton.Attributes.Add("onclick","return confirm(’您是否確定要刪除這條信息’);");
break;
default:
break;
}
}
5.點擊表格行鏈接另一頁
{
//點擊表格打開
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);");
}
雙擊表格連接到另一頁
{
string OrderItemID =e.item.cells[1].Text;
...
e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’");
}
雙擊表格打開新一頁
{
string OrderItemID =e.item.cells[1].Text;
...
e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)");
}
<%# DataBinder.Eval(Container.DataItem, "數據字段1")%>’ & name=’<%# DataBinder.Eval(Container.DataItem, "數據字段2")%>’ />
7.表格點擊改變顏色
{
e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’;
this.style.color=’buttontext’;this.style.cursor=’default’;");
}
寫在DataGrid的_ItemDataBound裏
{
e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’;
this.style.color=’buttontext’;this.style.cursor=’default’;");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;");
}
8.關於日期格式
我覺得應該在itembound事件中
9.獲取錯誤信息併到指定頁面
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");
}
Redirect會導致post-back的產生從而丟失了錯誤信息,所以頁面導向應該直接在服務器端執行,這樣就可以在錯誤處理頁面得到出錯信息並進行相應的處理
Response.Cookies("UserName").Expires = 0
11.自定義異常處理
using System;
using System.Diagnostics;
{
/// <summary>
/// 從系統異常類ApplicationException繼承的應用程序異常處理類。
/// 自動將異常內容記錄到Windows NT/2000的應用程序日誌
/// </summary>
public class AppException:System.ApplicationException
{
public AppException()
{
if (ApplicationConfiguration.EventLogEnabled)LogEvent("出現一個未知錯誤。");
}
{
LogEvent(message);
}
{
LogEvent(message);
if (innerException != null)
{
LogEvent(innerException.Message);
}
}
using System;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
{
/// <summary>
/// 事件日誌記錄類,提供事件日誌記錄支持
/// <remarks>
/// 定義了4個日誌記錄方法 (error, warning, info, trace)
/// </remarks>
/// </summary>
public class ApplicationLog
{
/// <summary>
/// 將錯誤信息記錄到Win2000/NT事件日誌中
/// <param name="message">需要記錄的文本信息</param>
/// </summary>
public static void WriteError(String message)
{
WriteLog(TraceLevel.Error, message);
}
/// 將警告信息記錄到Win2000/NT事件日誌中
/// <param name="message">需要記錄的文本信息</param>
/// </summary>
public static void WriteWarning(String message)
{
WriteLog(TraceLevel.Warning, message);
}
/// 將提示信息記錄到Win2000/NT事件日誌中
/// <param name="message">需要記錄的文本信息</param>
/// </summary>
public static void WriteInfo(String message)
{
WriteLog(TraceLevel.Info, message);
}
/// <summary>
/// 將跟蹤信息記錄到Win2000/NT事件日誌中
/// <param name="message">需要記錄的文本信息</param>
/// </summary>
public static void WriteTrace(String message)
{
WriteLog(TraceLevel.Verbose, message);
}
/// 格式化記錄到事件日誌的文本信息格式
/// <param name="ex">需要格式化的異常對象</param>
/// <param name="catchInfo">異常信息標題字符串.</param>
/// <retvalue>
/// <para>格式後的異常信息字符串,包括異常內容和跟蹤堆棧.</para>
/// </retvalue>
/// </summary>
public static String FormatException(Exception ex, String catchInfo)
{
StringBuilder strBuilder = new StringBuilder();
if (catchInfo != String.Empty)
{
strBuilder.Append(catchInfo).Append("/r/n");
}
strBuilder.Append(ex.Message).Append("/r/n").Append(ex.StackTrace);
return strBuilder.ToString();
}
/// 實際事件日誌寫入方法
/// <param name="level">要記錄信息的級別(error,warning,info,trace).</param>
/// <param name="messageText">要記錄的文本.</param>
/// </summary>
private static void WriteLog(TraceLevel level, String messageText)
{
try
{
EventLogEntryType LogEntryType;
switch (level)
{
case TraceLevel.Error:
LogEntryType = EventLogEntryType.Error;
break;
case TraceLevel.Warning:
LogEntryType = EventLogEntryType.Warning;
break;
case TraceLevel.Info:
LogEntryType = EventLogEntryType.Information;
break;
case TraceLevel.Verbose:
LogEntryType = EventLogEntryType.SuccessAudit;
break;
default:
LogEntryType = EventLogEntryType.SuccessAudit;
break;
}
//寫入事件日誌
eventLog.WriteEntry(messageText, LogEntryType);
catch {} //忽略任何異常
}
} //class ApplicationLog
}
12.Panel 橫向滾動,縱向自動擴展
13.回車轉換成Tab
if(event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type!=’submit’ && event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’);
event.keyCode=9;
</script>
15.DataGrid行隨鼠標變色
{
if (e.Item.ItemType!=ListItemType.Header)
{
e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=/""+e.Item.Style["BACKGROUND-COLOR"]+"/"");
e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=/""+ "#EFF3F7"+"/"");
}
}
16.模板列
www.knowsky.com
<ITEMTEMPLATE>
<ASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%>’ runat="server" width="80%" id="lblColumn" />
</ITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>
<HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE>
<ITEMTEMPLATE>
<ASP:CHECKBOX id="chkExport" runat="server" />
</ITEMTEMPLATE>
<EDITITEMTEMPLATE>
<ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
</EDITITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>
後臺代碼
{
//改變列的選定,實現全選或全不選。
CheckBox chkExport ;
if( CheckAll.Checked)
{
foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
{
chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
chkExport.Checked = true;
}
}
else
{
foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
{
chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
chkExport.Checked = false;
}
}
}
17.數字格式化
string s=i.ToString("###,###.00");
18.日期格式化
應該如何改?
B.以下正確的輸入格式:[0001-12-31], [9999 09 30], [2002/03/03]
【大小寫轉換】
HttpUtility.HtmlDecode(string)
19.如何設定全局變量
<MenuData ImagesBaseURL="images/">
<MenuGroup>
<MenuItem Label="內參信息" URL="Infomation.aspx" >
<MenuGroup ID="BBC">
<MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
<MenuItem Label="編制信息簡報" URL="NewInfo.aspx" LeftIcon="file.gif" />
......
最好將你的aspnetmenu升級到1.2版
{
TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
tb.Text....
}
23.在DataGrid中有3個模板列包含Textbox分別爲 DG_ShuLiang (數量) DG_DanJian(單價) DG_JinE(金額)分別在5.6.7列,要求在錄入數量及單價的時候自動算出金額即:數量*單價=金額還要求錄入時限制爲數值型.我如何用客戶端腳本實現這個功能?
<ItemTemplate>
<asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>’
onkeyup="DoCal()"
/>
</ItemTemplate>
</asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>’
onkeyup="DoCal()"
/>
</asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>’ />
</ItemTemplate>
</asp:TemplateColumn><script language="javascript">
function DoCal()
{
var e = event.srcElement;
var row = e.parentNode.parentNode;
var txts = row.all.tags("INPUT");
if (!txts.length || txts.length < 3)
return;
var p = txts[txts.length-2].value;
return;
p = parseFloat(p);
}
</script>
page.smartNavigation=true
25.在Datagrid中修改數據,當點擊編輯鍵時,數據出現在文本框中,怎麼控制文本框的大小 ?
{
for(int i=0;i<e.Item.Cells.Count-1;i++)
if(e.Item.ItemType==ListItemType.EditType)
{
e.Item.Cells[i].Attributes.Add("Width", "80px")
}
}
26.對話框
private static string ScriptEnd = "</script>";
{
string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}";
ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
//Response.Write(strScript);
}
27. 將時間格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日");
1.2 取當前年
1.3 取當前月
1.4 取當前日
1.5 取當前時
1.6 取當前分
1.7 取當前秒
1.8 取當前毫秒
28.自定義分頁代碼:
public static int curPageIndex=1; //當前頁面
下一頁:
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex+=1;
}
上一頁:
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex-=1;
}
直接頁面跳轉:
{
this.DataGrid1.CurrentPageIndex=a;
}
29.DataGrid使用:
{
foreach(DataGridItem di in this.DataGrid1.Items)
{
if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem)
{
((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’確認刪除此項嗎?’);");
}
}
}
樣式交替:
{
e.Item.Attributes["onmouseout"] = "this.style.backgroundColor=’#FFFFFF’;";
e.Item.Attributes["onmouseover"] = "this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes["onmouseout"] = "this.style.backgroundColor=’#a0d7c4’;";
e.Item.Attributes["onmouseover"] = "this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
}
添加一個編號列:
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));
{
dt.Rows[i]["number"]=(i+1).ToString();
}
DataGrid1.DataBind();
DataGrid1中添加一個CheckBox,頁面中添加一個全選框
{
foreach(DataGridItem thisitem in DataGrid1.Items)
{
((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
}
}
將當前頁面中DataGrid1顯示的數據全部刪除
{
if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
{
string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
Del (strloginid); //刪除函數
}
}
30.當文件在不同目錄下,需要獲取數據庫連接字符串(如果連接字符串放在Web.config,然後在Global.asax中初始化)
AppSettings["ConnStr"].ToString();
31. 變量.ToString()
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16進制)
12345.ToString("p"); //生成 1,234,500.00%
32、變量.Substring(參數1,參數2);
<!--
function gook(pws)
{
frm.submit();
}
//-->
<form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post">
<tr>
<td>
<input id="f_user" type="hidden" size="1" name="f_user" runat="server">
<input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
<input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server">
<INPUT id="tem" type="hidden" size="1" value="2" name="tem">
文本框的名稱必須是你要登陸的網頁上的名稱,如果源碼不行可以用vsniffer 看看。
name=Request.QueryString["EmailName"];
{
int a=name.IndexOf("@",0,name.Length);
f_user.Value=name.Substring(0,a);
f_domain.Value=name.Substring(a+1,name.Length-(a+1));
f_pass.Value=Request.QueryString["Psw"];
}
{
Script.Alert("錯誤的郵箱!");
Server.Transfer("index.aspx");
}
asp.net面試集合
Recordset對數據庫持續連接訪問ADO.NET提供對數據庫斷開連接
ADO.NET與ADO相比,優勢在於提供了數據集和數據適配器,有利於實現分佈式處理,降低對數據庫服務器資源的消耗。
頁面是編譯,執行速度快, 增加安全性和可靠性
,通過繼承機制來支持代碼的重用,提供聲明性服務器控件減少代碼行數
Asp需要解釋,執行速度慢,重用代碼不方便,沒有調試機制
sealed 修飾符主要用於防止非有意的派生,但是它還能促使某些運行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的實例的虛擬函數成員的調用可以轉換爲非虛擬調用來處理。
答 表示層 數據層 業務層
答:一般爲3層
數據訪問層,業務層,表示層。
數據訪問層對數據庫進行增刪查改。
業務層一般分爲二層,業務表觀層實現與表示層的溝通,業務規則層實現用戶密碼的安全等。
表示層爲了與用戶交互例如用戶添加表單。
優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。
缺點: 增加成本。
受管制的代碼:unsafe:非託管代碼。不經過CLR運行。
強類型系統 RTTI:類型識別系統。
裝箱就是把值類型到引用類型的轉換
拆箱就是引用類型到值類型的轉換
重載 方法名相同 不用個數的參數或者指定不同參數類型
CTS:通用語言系統。CLS:通用語言規範。CLR:公共語言運行庫。
class box{
int aa(object i)
{}
object bb()
{}
}
int bb=5
new box().aa(bb) //裝箱
int conver=(int)new box().zz(); //拆箱
//重載
public void aaa(int rad)
{ }
public void aaa(int len,int bre )
{ }
public void aaa(sting str)
{ }
20:列舉一下你所瞭解的XML技術及其應用
21 :ADO.net中常用的對象有哪些?分別描述一下。
Command 可以檢索和操縱數據庫中的數據
DataAdapter對象充當DataSet和數據源之間用於檢索和保存數據的橋接器
DataSet 對象從數據庫檢索的數據可以存儲在其中能夠以XML形式保存
DataReader 是查詢結果的一種只進。只讀的視圖 不具有DataSet的任何複雜功能
所以可以加快訪問和查看數據的速度 不提供斷開式訪問
msdn2005中是這樣解釋的:
委託具有以下特點:委託類似於 C++ 函數指針,但它是類型安全的。
委託允許將方法作爲參數進行傳遞。委託可用於定義回調方法
委託可以鏈接在一起;例如,可以對一個事件調用多個方法。
方法不需要與委託簽名精確匹配。
委託可以理解爲指向一個函數的引用。
是,是一種特殊的委託
24:UDP連接和TCP連接的異同。
答:System.Xml
wsdl 是web服務描述語言(web Services Description Language)
31:如何理解.net中的垃圾回收機制。
答 private : 私有成員, 在類的內部纔可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 在同一命名空間內可以訪問。
答. 1.使用QueryString,
源頁面
string url;
url="anotherwebform.aspx?name=" + TextBox1.Text
Response.Redirect(url);
Label1.Text=Request.QueryString["name"];
源頁面
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.aspx");
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
源頁面代碼:
public string Name
{
get {
return TextBox1.Text; }
}
//然後調用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("anotherwebform.aspx");
}
private void Page_Load
(object sender, System.EventArgs e)
{
WebForm1 wf1;
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
}
36:一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用遞歸算法實現。
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
答 :
override 與重載的區別。重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要
Override 是進行基類中函數的重寫。爲了適應需要。
38:請編程遍歷頁面上所有TextBox控件並給它賦值爲string.Empty?
答:
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
答:
int [] array = new int [*] ;
int temp = 0 ;
for (int i = 0 ; i < array.Length - 1 ; i++)
{
for (int j = i + 1 ; j < array.Length ; j++)
{
if (array[j] < array[i])
{
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
答:不是。可以用任意類型。
答:
int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i < Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum = Sum - I ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
當使用new B()創建B的實例時,產生什麼輸出?
答:X=1,Y=0;x= 1 y = -1
答:DataSet:數據存儲器。
DataCommand:執行語句命令。
DataAdapter:數據的集合,用於填充。
答:Windwos(默認)用IIS...
From(窗體)用帳戶
Passport(密鑰)
答:程序集。(中間語言,源數據,資源,裝配清單)
46:net Remoting 的工作原理是什麼?
答:服務器端向客戶端發送一個進程編號,一個程序域編號,以確定對象的位置
47:根據委託(delegate)的知識,請完成以下用戶控件中代碼片段的填寫:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//請在以下補齊代碼用來調用OnDBOperate委託簽名的OnNew事件。
}
}
}
答:if( OnNew != null
OnNew( this, e ;
48:SQLSERVER服務器中,給定表 table1 中有兩個字段 ID、LastUpdateDate,ID表示更新的事務號, LastUpdateDate表示更新時的服務器時間,請使用一句SQL語句獲得最後更新的事務號
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不會發生死鎖,(但有一點int是按值傳遞的,所以每次改變的都只是一個副本,因此不會出現死鎖。但如果把int換做一個object,那麼死鎖會發生)
a 產生一個int數組,長度爲100,並向其中隨機插入1-100,並且不能重複
答 :List L=new List();
Random random = new Random();
for (int i = 1; i <= 100; i++)
{
if (L.IndexOf(i) < 0)
{
L.Add(random.Next(1,100));
}
}
b 對上面生成的數組排序,需要支持升序、降序兩種順序
答 L.Reverse(L);
L.Sort(L);
try
{ //執行代碼,不確定是否會出錯 }
catch
{ //出錯處理 }
finally
{ //無論怎樣,都要執行 }
答 垃圾回收的原理是根據是否空引用,和該數據類型佔用內存來判斷該收回多少內存.強類型說白就是必須要有個數據類型.
答 FOR WHILE foreach do while
答 object
答 全局訪問緩存
答 INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
58:什麼是WEB控件?使用WEB控件有那些優勢?
答 web控件就是可以在服務器執行的控件,優勢在於可以回傳數據,帶有事件驅動
答 .net中提供了幾個數據驗證控件,可以在服務器端或者客戶端進行驗證。
答 主要用在字符串的匹配上面,與具體的語言環境無關。
61: ASP。NET中共有幾種類型的控件?各有什麼區別?
答 Html 控件 傳統的html標記
Web 控件 可以回傳數據,事件驅動
自定義 控件 在原有控件的基礎上增加功能
複合控件 多個子控件複合成一個新的控件
62: WEB控件可以激法服務端事件,請談談服務端事件是怎麼發生並解釋其原理?自動傳回是什麼?爲什麼要使用自動傳回。
答 通過實現IPostBack這個接口來執行事件。自動回傳就是AutoPostBack,使用自動回傳可以監視客戶端變化情況並將這種改變返回到服務器端
63: WEB控件及HTML服務端控件能否調用客戶端方法?如果能,請解釋如何調用?
答 能,服務器端控件在html中表現形式還是html標記,所以可以執行客戶端事件,有多種方式:1、control.Attributes["onclick"]="...;";
2、<script for="controlName" event="onclick"></script>
64: 請解釋ASP。NET中的web頁面與其隱藏類之間的關係?
答 繼承的關係
65: 什麼是viewstate,能否禁用?是否所用控件都可以禁用?
答 可以全部禁用,viewstate就是hidden input,只不過加上了微軟的編碼方式記錄控件的狀態
66: 當發現不能讀取頁面上的輸入的數據時很有可能是什麼原因造成的?怎麼解決
答 可能就是事件沒有關聯,或者根本就沒有寫讀取代碼。
解決 檢查代碼, 設斷點調試
67:請解釋一個WEB頁面中代碼執行次序。
答 參看.cs 知道最先執行OnInit(); 然後到Page_Load,最後到具體的執行事件。
68:請解釋什麼是上下文對象,在什麼情況下要使用上下文對象
答 HttpContext, 在類中調用的時候需要用到HttpContext
69:請解釋轉發與跳轉的區別?
答 Transfer 是轉發 包括HttpHandler對象
Redirect 就是跳轉
70: 請解釋ASP。NET中button linkbutton imagebutton 及hyperlink這四個控件之間的功別
答 button imagebutton 將數據傳遞迴服務器
hyperlinK 頁面之間的導航
linkbutton主要用於將數據保存到服務器或訪問服務器上的數據
答 這個傳遞方式不定,很多都是傳遞DataSet, XML也可以
72:如果出現ASP。NET中的事件不能觸發可能由於什麼原因造成?
答 事件丟失,特別是使用vss的時候最容易造成這種情況,原因不明
73:如果需要在datagride控件中的某一列中添加下拉列表框並綁定數據怎麼解決?
答 使用模板列來添加dropdownlist,綁定數據使用代碼前置的方式
74:請解釋asp.net中的數據綁定與傳統數據綁定有什麼區別?
答 更靈活 更方便
75:請解釋.net採用委託實現的事件模型與JAVA中採用接口實現的事件模型有什麼區別, 答 以圖示方式解釋。
76:請解釋接口的顯式實現有什麼意義?
答 規定強制執行,保持一致
答 客戶端表現用html控件,如果想和server端交互,那麼加上runat=server,它就成了服務器端控件,但它沒有web控件的很多方法和屬性,如果你需要用到,那麼還是用web controls
DataSet 導出EXECL 例子代碼
private void WriteToExcelFromDataGrid(string fileName)
{
//導入EXECL
if(this.DataGrid1.Items.Count==0)
{
Response.Write("<script>alert('對不起,你沒有查詢到任何記錄,不能導出數據')</script>");
}
else
{
string strFileName="Reports"+fileName+".xls";
Response.Buffer= false;
Response.Charset="UTF-8";
Response.AppendHeader("Content-Disposition","attachment;filename="+strFileName+"");
Response.ContentEncoding=System.Text.Encoding.GetEncoding("UTF-8");
//設置輸出流爲簡體中文
Response.ContentType = "application/vnd.ms-excel";
//設置輸出文件類型爲excel文件。
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
//this.DataGrid1.RenderControl(oHtmlTextWriter);
this.RenderChildren(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
}
}
ASP.NET編程中的十大技巧(轉載)
在本篇文件中,我們將討論編程人員在使用ASP.NET開發應用程序時需要注意的10個技巧,這些技巧涉及從缺省的控件、表單名的改變到StringBuilder類的使用,有助於編程人員能夠儘快地適應.NET環境。
1、在使用Visual Studio .NET時,除直接或非引用的對象外,不要使用缺省的名字。
.NET帶來的好處之一是所有的源代碼和配置文件都是純文本文件,能夠使用Notepad或WordPad等任意的文本編輯器進行編輯。如果不願意,我們並非一定要使用Visual Studio .NET作爲集成開發環境。但使用了Visual Studio .NET,我們可以在Windows文件管理器中看到文件,或在Visual Studio .NET之外從文本編輯器中瀏覽文件的內容。
使用Visual Studio .NET作爲集成開發環境有許多好處,其中最顯著的好處是它極大地提高了生產效率。使用Visual Studio. NET,我們能夠在付出較小代價的情況下更快地開發軟件。作爲集成開發環境一部分的IntelliSense提供自動的代碼完成、在輸入方法或函數時提供動態幫助、語法錯誤的實時提示,以及其他能夠提高生產效率的功能。
象其他複雜的工具那樣,在學會如何充分發揮它的作用和掌握其“習性”前,Visual Studio .NET也會使我們產生一種挫折感。有時,它象一個難以瞭解的黑盒子,會生成大量的文件和許多無用的代碼。
Visual Studio .NET的一個功能是,無論是類、控件或表單中的對象,它都能夠爲新對象提供缺省名字。例如,如果我們創建了一個新的ASP.NET Web Application,其缺省的名字將是WebApplication1。我們可以在“新工程”對話框中方便地改變該應用的名字,但同時改變的只是該應用程序的名字空間的名字及其所在的虛擬目錄,源代碼文件的缺省名字仍然是WebForm1.aspx和WebForm1.aspx.cs(C#工程)或WebForm1.aspx.vb(VB.NET工程)。
我們可以在方案瀏覽器中改變ASPX和代碼使用的文件名字,但Web頁類的名字仍然將是WebForm1。如果在該Web表單上生成一個按鈕,其缺省的名字將是Button1。事實上,所有控件的名字都是由控件的類型和數字組成的。
我們能夠,也應該將應用程序中所有的表單和控件的名字都修改成有意義的名字。對於較小的演示性程序而言,缺省的名字還能夠勝任,但如果應用程序由多個表單,每個表單上有許多按鈕和標籤時,象frmStartup、frmDataEntry和frmReports這樣的表單名就比Form1、Form2和Form3這樣的名字更易於理解和維護。
如果表單上控件要在代碼的其他地方引用,使它有一個有意義的名字就更重要了。btnOK、btnCancel和btnPrint這樣的名字使看代碼的人更容易理解,因而,也比名字爲Button1、Button2、Button3這樣的控件更容易維護。
修改一個工程中所有文件中出現的一個名字的一個好方法是,在Visual Studio .NET菜單中依次選擇“編輯”->“發現和替換”->“替換”命令。
在看二週前編寫的代碼時,我們經常就象第一次見到這些代碼一樣,因此使它們有一個有助於我們理解其含義的名字是十分有必要的。
2、即使不使用Visual Studio .NET進行編程,使用代碼支持文件也有利於提高應用程序的性能
在Web應用程序、Web服務或Web控件等所有的ASP.NET Web工程中,Visual Studio .NET都使用代碼支持文件。代碼支持文件使工程具有更好的組織、模塊性,更適合多人組成的開發團隊。另外,它還會帶來性能的提高。
代碼支持文件的內容被編譯成一個組合文件中的類,一般是一個DLL文件,有時也可以是EXE文件。該文件駐留在應用程序的組合體高速緩衝區中,在應用程序啓動時,可以立即得到它。
如果代碼是包含在<script>標記中或ASPX文件代碼中,它仍然會被編譯成一個Web頁類。在這種情況下,每當該網頁在應用程序對話中第一次加載時,都需要重新進行編譯,被編譯的類就會駐留在內存中。每當計算機啓動、IIS停止、重新啓動或者源代碼、配置文件改變時,該文件必須重新編譯。儘管不大,但這樣引起的性能損耗也是相當可觀的。
3、儘量減少表單回送
每當點擊Web網頁上的Button、LinkButton或ImageButton控件時,表單就會被髮送到服務器上。如果控件的AutoPostBack屬性被設置爲true,如果CheckBox、CheckBoxList等控件的狀態被改變後,也會使表單會發送回服務器。
每次當表單被髮送回服務器,就會被重新加載,啓動Page_Load事件,執行Page_Load事件處理程序中的所有代碼。把網頁的初始化代碼放在這裏是最合適不過的了。我們經常會希望在每次加載網頁時執行一些代碼,而希望只有在網頁第一次加載時執行另一些代碼,甚至希望一些代碼在除首次加載外的每次加載時執行。
可以利用IsPostBack特性來完成這一功能。在網頁第一次加載時,該屬性的值是false。如果網頁因回送而被重新加載,IsPostBack屬性的值就會被設置爲true。通過測試,可以在任意時候執行指定的代碼。下面是相關的C#代碼:
protected void Page_Load(Object sender, EventArgs e)
{
// 網頁每次加載時,執行的一些操作
if (!IsPostBack)
{
// 網頁第一次加載時執行的操作
}
else
{
// 回送時執行的操作
}
// 網頁每次加載時執行的操作
}
我們希望儘量不引起回送(每次回送都會要求服務器進行一系列的操作),即使引起回送後。也希望能夠執行儘量少的操作。大規模、浪費時間的操作(例如數據庫查找)尤其應當避免,因爲它們能夠延長應用程序的響應時間。
4、使用StringBuilder類
字符串在.NET框架中是不可變的,這意味着改變字符串的操作符和方法會返回字符串的改變後的拷貝,這意味着性能還有提高的空間。當進行大量的字符串操作時,使用StringBuilder類就是一種比較好的選擇了。
下面的C#代碼測試用二種方式從10000個子字符串中生成字符串所需要的時間。第一次使用了一個簡單的字符串串聯操作;第二次使用了StringBuilder類。要想查看結果字符串,可以去掉下面的代碼中註解行的註解符號:
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(Object Source, EventArgs E)
{
int intLimit = 10000;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole = "";
// 首先執行字符串連接操作
startTime = DateTime.Now;
for (int i=0; i < intLimit; i++)
{
strSub = i.ToString();
strWhole = strWhole + " " + strSub;
}
endTime = DateTime.Now;
elapsedTime = endTime - startTime;
lblConcat.Text = elapsedTime.ToString();
// lblConcatString.Text = strWhole;
// 使用stringBuilder類進行同樣的操作
startTime = DateTime.Now;
StringBuilder sb = new StringBuilder();
for (int i=0; i < intLimit; i++)
{
strSub = i.ToString();
sb.Append(" ");
sb.Append(strSub);
}
endTime = DateTime.Now;
elapsedTime = endTime - startTime;
lblBuild.Text = elapsedTime.ToString();
// lblBuildString.Text = sb.ToString();
}
</script>
<html>
<body>
<form runat="server">
<h1>String Concatenation Benchmark</h1>
Concatenation:
<asp:Label
id="lblConcat"
runat="server"/>
<br/>
<asp:Label
id="lblConcatString"
runat="server"/>
<br/>
<br/>
StringBuilder:
<asp:Label
id="lblBuild"
runat="server"/>
<br/>
<asp:Label
id="lblBuildString"
runat="server"/>
</form>
</body>
</html>
二種方式的差別是相當大的:使用StringBuilder類的Append方法的速度比使用字符串連接的速度快近200倍。比較的結果如下所示:
5、只在必要時使用服務器端控件
ASP.NET中新引入了一種在服務器端運行的被稱作Web Server Controls的控件,在代碼中,它們經常通過下面的語法被說明:
<asp:TextBox id="txtLastName" size="40" runat="server" />
它們有時也被稱作ASP控件。服務器端控件是由runat屬性指示的,它的值總是“server”。
通過添加runat屬性,一般的HTML控件可以被很方便地轉換到服務器端運行,下面是一個簡單的例子:
<input type="text" id="txtLastName" size="40" runat="server" />
可以通過id屬性中指定的名字,我們可以引用程序中的控件,可以通過編程的方式設置屬性和獲得值,因此,服務器端處理方式有較大的靈活性。
這種靈活性是有一定代價的。每種服務器端控件都會消耗服務器上的資源。另外,除非控件、網頁或應用程序明確地禁止view state,控件的狀態是包含在view state的隱藏域中,並在每次回送中都會被傳遞,這會引起嚴重的性能下降。
在這方面的一個很好的例子是,網頁上控件表格的應用,如果不需要在代碼中引用表格中的元素,則使用無需進行服務器端處理的HTML表格。我們仍然可以在HTML表格單元中放置服務器控件,並在代碼中引用服務器控件。如果需要引用任意的表格元素,例如指定的單元,則整個表格必須是服務器控件。
6. HyperLink控件、LinkButton控件的差別
對於Web訪問者而言,HyperLink、LinkButton控件是一樣的,但它們在功能方面仍然有較大的差異。
當用戶點擊控件時,HyperLink控件會立即將用戶“導航”到目標URL,表件不會回送到服務器上。LinkButton控件則首先將表件發回到服務器,然後將用戶導航到目標URL。如果在“到達”目標URL之前需要進行服務器端處理,則使用LinkButton控件;如果無需進行服務器端處理,則可以使用HyperLink控件。
7、註釋代碼
這一技巧並不是針對ASP.NET的,但它是一個良好的編程習慣。
註釋不僅僅應當說明代碼會執行什麼操作,還應當註明原因。例如,不要僅僅在註釋中說明是在遍歷數組,而是要說明遍歷數組是根據某一算法計算一個值,除非算法是相當簡單的,否則還應當對算法進行簡要的說明。
.NET工程中的不同的編程語言都有各自不同的註釋符號,下面是一個簡要的說明:
HTML <!-- 註釋 -->
JavaScript // 註釋
VBScript ' 註釋
VB.NET ' 註釋
C# // 註釋
/* 多行內容
的註釋
*/
SQL -- 註釋
在服務器控件的開始和結束標記中沒有註釋符號,但服務器能夠忽略掉所有它不能識別的屬性,因此我們能夠通過使用沒有定義的屬性來插入註釋。下面是一個例子:
<asp:TextBox
id="txtLastName"
size="40"
comment="這是我的註釋"
runat="server" />
在Visual Studio .NET中對源代碼進行註釋非常簡單。高亮度顯示需要註釋的行,然後按Ctrl+K+C組合鍵添加註釋。要刪除註釋,只需高亮度顯示被註釋的代碼,並按下Ctrl+K+U組合鍵。
在C#工程中,我們還可以通過在每行的開始處使用///輸入XML註釋小節。在註釋小節中,我們可以使用下面的XML標記組織註釋:
<summary></summary>
<remarks></remarks >
<param></param>
<returns></returns>
<newpara></newpara>
要在Visual Studio .NET中查看這些XML註釋的格式化的報告,我們可以首先選擇“工具”菜單項,然後選擇“建立註釋Web網頁”菜單項。
8、使用trace方法和trace屬性記錄Page目錄中網頁的執行情況
調試程序的一種古老的技術是在程序中的關健點插入輸出語句,通常情況下,輸出信息中會包含重要變量的值,相關信息可以輸出到屏幕、日誌文件或者數據庫。
在ASP.NET中,通過使用Page命令中的trace屬性,這種調試技術的使用更簡單了。Page命令是ASPX文件開始處的一行代碼,它提供編譯器的指示。Page命令中包含一個或多個屬性,向編譯器提供使用的編程語言、代碼支持文件的位置或要繼承的類的名字等信息。
Page命令中的屬性之一是trace,其值可能是true或false,下面是一個典型的Page命令,其中的trace屬性的值是true:
<%@ Page language="c#" trace="true" %>
如果trace屬性的值設置爲true,由ASPX文件生成的Web頁就會顯示出來,除了網頁本身外,關於該頁的大量其他信息也會顯示出來。這些信息以下面小節的形式顯示在一張表格中:
·Request細節 提供Session ID、請求時間和請求的狀態碼。
·Trace Information 包含跟蹤日誌、網頁生命週期中按時間先後順序各個步驟的列表。另外,也可以向其中添加定製信息。
·控件樹 以一種分層次的方式列出網頁上的所有控件,包括每個控件以字節計算的大小。
·Cookies集合 列出該網頁創建的所有Cookie。
·頭部集合 HTTP頭部以及它們的值。
·Server變量 與該網頁相關的Server環境變量。
包含在Trace Information小節中的跟蹤日誌是最有用的,在這裏我們可以插入自己的跟蹤命令。trace類中有2個方法能夠在跟蹤日誌中插入命令:Trace.Write和Trace.Warn,除了Trace.Warn命令用紅色字體顯示、Trace.Write命令用黑色字體顯示外,它們是相同的。下面是跟蹤日誌的一個屏幕快照,其中包含有幾個Trace.Warn命令。
跟蹤日誌中最方便的功能是我們可以在開發和測試過程中在整個代碼中插入Trace.Write和Trace.Warn語句,而在最終交付應用程序時,可以通過改變Page命令中trace屬性的值,禁止這些命令起作用,而無需在部署應用軟件前刪除這些輸出語句。
9、使用存儲過程
微軟公司的SQL Server和其他現代關係數據庫都使用SQL命令定義和處理查詢。一個SQL語句或一系列SQL語句提交給SQL Server,SQL Server會對命令進行解析,然後創建一個查詢計劃並對它進行優化,然後執行該查詢計劃,這都需要大量的時間。
存儲過程是一系列被查詢處理器預解析和優化的SQL命令,這些命令會被存儲起來,可以得到快速地執行。存儲過程也被稱作sprocs,它可以接收輸入參數,使一個單一的存儲過程能夠處理較大範圍的特定的查詢。
因爲sprocs是預先被解析的,對於複雜的查詢更顯得重要,其查詢計劃是預先優化的,因此調用查詢過程比執行相同功能的SQL語句速度要快得多。
10、使用.NET命令行
.NET命令行工具在命令提示符窗口中運行。爲了使命令能夠執行,它必須駐留在命令提示符的當前目錄中,或通過設置PATH環境變量。
.NET SDK在“啓動”菜單上安裝一個菜單項,該菜單項能夠打開一個正確設置了PATH環境變量的命令提示符窗口。我們可以通過依次點擊“開始”->“程序”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示符”,啓動命令提示符窗口。
通過在將該菜單項從菜單上拖到桌面上時,同時按Ctrl+C鍵,就可以將該菜單項的快捷方式拷貝到桌面上,使用起來會非常方便。
sql實用
1.掛起操作
在安裝Sql或sp補丁的時候系統提示之前有掛起的安裝操作,要求重啓,這裏往往重啓無用,解決辦法:
到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager
刪除PendingFileRenameOperations
2.收縮數據庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮數據和日誌
DBCC SHRINKDB
DBCC SHRINKFILE
3.壓縮數據庫
dbcc shrinkdatabase(dbname)
4.轉移數據庫給新用戶以已存在用戶權限
exec sp_change_users_login 'update_one','newname','oldname'
go
5.檢查備份集
RESTORE VERIFYONLY from disk='E:/dVBbs.bak'
6.修復數據庫
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
--CHECKDB 有3個參數:
--REPAIR_ALLOW_DATA_LOSS
-- 執行由 REPAIR_REBUILD 完成的所有修復,包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,以及刪除已損壞的文本對象。這些修復可能會導致一些數據丟失。修復操作可以在用戶事務下完成以允許用戶回滾所做的更改。如果回滾修復,則數據庫仍會含有錯誤,應該從備份進行恢復。如果由於所提供修復等級的緣故遺漏某個錯誤的修復,則將遺漏任何取決於該修復的修復。修復完成後,備份數據庫。
--REPAIR_FAST 進行小的、不耗時的修復操作,如修復非聚集索引中的附加鍵。這些修復可以很快完成,並且不會有丟失數據的危險。
--REPAIR_REBUILD 執行由 REPAIR_FAST 完成的所有修復,包括需要較長時間的修復(如重建索引)。執行這些修復時不會有丟失數據的危險。
--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY
7.SQL Server日誌清除的兩種方法
在使用過程中大家經常碰到數據庫日誌非常大的情況,在這裏介紹了兩種處理方法……
方法一:
一般情況下,SQL數據庫的收縮並不能很大程度上減小數據庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免數據庫日誌過大。
1、設置數據庫模式爲簡單模式:打開SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄-->選擇你的數據庫名稱(如論壇數據庫Forum)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然後按確定保存。
2、在當前數據庫上點右鍵,看所有任務中的收縮數據庫,一般裏面的默認設置不用調整,直接點確定。
3、收縮數據庫完成後,建議將您的數據庫屬性重新設置爲標準模式,操作方法同第一點,因爲日誌在一些異常情況下往往是恢復數據庫的重要依據。
方法二:
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE databasename -- 要操作的數據庫名
SELECT @LogicalFileName = 'databasename_log', -- 日誌文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想設定的日誌文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8.刪除數據庫中重複數據的幾個方法
數據庫的使用過程中由於程序方面的問題有時候會碰到重複數據,重複數據導致了數據庫部分設置不能正確設置……
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
方法二
有兩個意義上的重複記錄:
一是完全重複的記錄,也即所有字段均重複的記錄,
二是部分關鍵字段重複的記錄,比如Name字段重複,而其他字段不一定重複或都重複可以忽略。
A、對於第一種重複,比較容易解決,使用
select distinct * from tableName
就可以得到無重複記錄的結果集。
如果該表需要刪除重複的記錄(重複記錄保留1條),可以按以下方法刪除:
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
發生這種重複的原因是表設計不周產生的,增加唯一索引列即可解決。
B、這類重複問題通常要求保留重複記錄中的第一條記錄,操作方法如下
假設有重複的字段爲Name,Address,要求得到這兩個字段唯一的結果集。
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最後一個select即得到了Name,Address不重複的結果集(但多了一個autoID字段,實際寫時可以寫在select子句中省去此列)。
9.更改數據庫中表的所屬用戶的兩個方法
大家可能會經常碰到一個數據庫備份還原到另外一臺機器結果導致所有的表都不能打開了,原因是建表的時候採用了當時的數據庫用戶……
--更改某個表
exec sp_changeobjectowner 'tablename','dbo'
--存儲更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10.SQL Server中直接循環寫入數據
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
11.無數據庫日誌文件恢復數據庫方法兩則
數據庫日誌文件的誤刪或別的原因引起數據庫日誌的損壞。
方法一:
1.新建一個同名的數據庫;
2.再停掉SQL Server(注意不要分離數據庫);
3.用原數據庫的數據文件覆蓋掉這個新建的數據庫;
4.再重啓sql server;
5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的數據庫名);
6.完成後一般就可以訪問數據庫中的數據了,這時,數據庫本身一般還要問題,解決辦法是,利用。
數據庫的腳本創建一個新的數據庫,並將數據導進去就行了。
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的數據庫名'
Go
sp_dboption '置疑的數據庫名', 'single user', 'true'
Go
DBCC CHECKDB('置疑的數據庫名')
Go
update sysdatabases set status =28 where name='置疑的數據庫名'
Go
sp_configure 'allow updates', 0 reconfigure with override
Go
sp_dboption '置疑的數據庫名', 'single user', 'false'
Go
方法二:
設置數據庫爲緊急模式;
停掉SQL Server服務;
把應用數據庫的數據文件XXX_Data.mdf移走;
重新建立一個同名的數據庫XXX;
停掉SQL服務;
把原來的數據文件再覆蓋回來;
運行以下語句,把該數據庫設置爲緊急模式;
運行
“Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go”
執行結果:
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
已將配置選項 'allow updates' 從 0 改爲 1。請運行 RECONFIGURE 語句以安裝。
接着運行“update sysdatabases set status = 32768 where name = 'XXX'”
執行結果:
(所影響的行數爲 1 行)
重啓SQL Server服務;
運行以下語句,把應用數據庫設置爲Single User模式;
運行“sp_dboption 'XXX', 'single user', 'true'”
執行結果:
命令已成功完成。
做DBCC CHECKDB;
運行“DBCC CHECKDB('XXX')”
執行結果:
'XXX' 的 DBCC 結果。
'sysobjects' 的 DBCC 結果。
對象 'sysobjects' 有 273 行,這些行位於 5 頁中。
'sysindexes' 的 DBCC 結果。
對象 'sysindexes' 有 202 行,這些行位於 7 頁中。
'syscolumns' 的 DBCC 結果。
………
運行以下語句把系統表的修改選項關掉;
運行“sp_resetstatus "XXX"
go
sp_configure 'allow updates', 0
reconfigure with override
Go”
執行結果:
在 sysdatabases 中更新數據庫 'XXX' 的條目之前,模式 = 0,狀態 = 28(狀態 suspect_bit = 0),
沒有更新 sysdatabases 中的任何行,因爲已正確地重置了模式和狀態。沒有錯誤,未進行任何更改。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
已將配置選項 'allow updates' 從 1 改爲 0。請運行 RECONFIGURE 語句以安裝。
重新建立另外一個數據庫XXX.Lost;
DTS導出嚮導
運行DTS導出嚮導;
複製源選擇EmergencyMode的數據庫XXX,導入到XXX.Lost;
選擇“在SQL Server數據庫之間複製對象和數據”,試了多次,好像不行,只是複製過來了所有表結構,但是沒有數據,也沒有視圖和存儲過程,而且DTS嚮導最後報告複製失敗;
所以最後選擇“從源數據庫複製表和視圖”,但是後來發現,這樣總是隻能複製一部分表記錄;
於是選擇“用一條查詢指定要傳輸的數據”,缺哪個表記錄,就導哪個;
視圖和存儲過程是執行SQL語句添加的。
12.維護SQL Server中表的索引
在使用和創建數據庫索引中經常會碰到一些問題,在這裏可以採用一些另類的方法解決…
--第一步:查看是否需要維護,查看掃描密度/Scan Density是否爲100%
declare @table_id int
set @table_id=object_id('表名')
dbcc showcontig(@table_id)
--第二步:重構表索引
dbcc dbreindex('表名',pk_索引名,100)
--重做第一步,如發現掃描密度/Scan Density還是小於100%則重構表的所有索引
--楊錚:並不一定能達100%。
dbcc dbreindex('表名','',100)
13.SQL Server補丁版本的檢查
SQL Server的補丁版本檢查不如Windows 補丁版本檢查直接,一個系統管理員,如果不瞭解SQL Server版本對應的補丁號,可能也會遇到一點麻煩,因此在這說明一下,通過這樣的辦法判別機器是安全的辦法,不會對系統產生任何影響。
1、用Isql或者SQL查詢分析器登錄到SQL Server,如果是用Isql,請在cmd窗口輸入isql -U sa,然後輸入密碼,進入;如果是用SQL查詢分析器,請從程序中啓動,輸入sa和密碼(也可以用windows驗證)。
2、在ISQL中輸入:
Select @@Version;
go
或者SQL查詢分析器中輸入(其實如果不想輸入,只要打開幫助的關於就可以了:))
Select @@Version;
然後按執行;
這時會返回SQL的版本信息,如下:
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation EntERPrise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
其中的8.00.760就是SQL Server的版本和補丁號。對應關係如下:
SQL Server 2000 版本和級別 @@VERSION 產品級別
SQL Server 2000 原始版本 8.00.194 RTM
Database Components SP1 8.00.384 SP1
Database Components SP2 8.00.534 SP2
Database Components SP3、SP3a 或 MSDE 2000 Release A 8.00.760 SP3
Database Components SP4 8.00.2039 SP4
這樣我們就能看到SQL Server的正確版本和補丁號了。
我們也可以用xp_msver看到更詳細的信息。
14.Sql Server數據庫的備份和恢復措施
14.1、備份數據庫
1、打開SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server;
2、SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄;
3、選擇你的數據庫名稱(如論壇數據庫Forum)-->然後點上面菜單中的工具-->選擇備份數據庫;
4、備份選項選擇完全備份,目的中的備份到如果原來有路徑和名稱則選中名稱點刪除,然後點添加,如果原來沒有路徑和名稱則直接選擇添加,接着指定路徑和文件名,指定後點確定返回備份窗口,接着點確定進行備份。
14.2、還原數據庫
1、打開SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server;
2、SQL Server組-->雙擊打開你的服務器-->點圖標欄的新建數據庫圖標,新建數據庫的名字自行取;
3、點擊新建好的數據庫名稱(如論壇數據庫Forum)-->然後點上面菜單中的工具-->選擇恢復數據庫;
4、在彈出來的窗口中的還原選項中選擇從設備-->點選擇設備-->點添加-->然後選擇你的備份文件名-->添加後點確定返回,這時候設備欄應該出現您剛纔選擇的數據庫備份文件名,備份號默認爲1(如果您對同一個文件做過多次備份,可以點擊備份號旁邊的查看內容,在複選框中選擇最新的一次備份後點確定)-->然後點擊上方常規旁邊的選項按鈕;
5、在出現的窗口中選擇在現有數據庫上強制還原,以及在恢復完成狀態中選擇使數據庫可以繼續運行但無法還原其它事務日誌的選項。在窗口的中間部位的將數據庫文件還原爲這裏要按照你SQL的安裝進行設置(也可以指定自己的目錄),邏輯文件名不需要改動,移至物理文件名要根據你所恢復的機器情況做改動,如您的SQL數據庫裝在D:/Program Files/Microsoft SQL Server/MSSQL/Data,那麼就按照您恢復機器的目錄進行相關改動改動,並且最後的文件名最好改成您當前的數據庫名(如原來是bbs_data.mdf,現在的數據庫是forum,就改成forum_data.mdf),日誌和數據文件都要按照這樣的方式做相關的改動(日誌的文件名是*_log.ldf結尾的),這裏的恢復目錄您可以自由設置,前提是該目錄必須存在(如您可以指定d:/sqldata/bbs_data.mdf或者d:/sqldata/bbs_log.ldf),否則恢復將報錯;
6、修改完成後,點擊下面的確定進行恢復,這時會出現一個進度條,提示恢復的進度,恢復完成後系統會自動提示成功,如中間提示報錯,請記錄下相關的錯誤內容並詢問對SQL操作比較熟悉的人員,一般的錯誤無非是目錄錯誤或者文件名重複或者文件名錯誤或者空間不夠或者數據庫正在使用中的錯誤,數據庫正在使用的錯誤您可以嘗試關閉所有關於SQL窗口然後重新打開進行恢復操作,如果還提示正在使用的錯誤可以將SQL服務停止然後重起看看,至於上述其它的錯誤一般都能按照錯誤內容做相應改動後即可恢復。
14.3、收縮數據庫
一般情況下,SQL數據庫的收縮並不能很大程度上減小數據庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免數據庫日誌過大。
1、設置數據庫模式爲簡單模式:打開SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄-->選擇你的數據庫名稱(如論壇數據庫Forum)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然後按確定保存;
2、在當前數據庫上點右鍵,看所有任務中的收縮數據庫,一般裏面的默認設置不用調整,直接點確定;
3、收縮數據庫完成後,建議將您的數據庫屬性重新設置爲標準模式,操作方法同第一點,因爲日誌在一些異常情況下往往是恢復數據庫的重要依據。
14.4、設定每日自動備份數據庫
強烈建議有條件的用戶進行此操作!
1、打開企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器;
2、然後點上面菜單中的工具-->選擇數據庫維護計劃器;
3、下一步選擇要進行自動備份的數據-->下一步更新數據優化信息,這裏一般不用做選擇-->下一步檢查數據完整性,也一般不選擇;
4、下一步指定數據庫維護計劃,默認的是1周備份一次,點擊更改選擇每天備份後點確定;
5、下一步指定備份的磁盤目錄,選擇指定目錄,如您可以在D盤新建一個目錄如:d:/databak,然後在這裏選擇使用此目錄,如果您的數據庫比較多最好選擇爲每個數據庫建立子目錄,然後選擇刪除早於多少天前的備份,一般設定4-7天,這看您的具體備份要求,備份文件擴展名一般都是bak就用默認的;
6、下一步指定事務日誌備份計劃,看您的需要做選擇-->下一步要生成的報表,一般不做選擇-->下一步維護計劃歷史記錄,最好用默認的選項-->下一步完成;
7、完成後系統很可能會提示Sql Server Agent服務未啓動,先點確定完成計劃設定,然後找到桌面最右邊狀態欄中的SQL綠色圖標,雙擊點開,在服務中選擇Sql Server Agent,然後點擊運行箭頭,選上下方的當啓動OS時自動啓動服務;
8、這個時候數據庫計劃已經成功的運行了,他將按照您上面的設置進行自動備份。
修改計劃:
1、打開企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->管理-->數據庫維護計劃-->打開後可看到你設定的計劃,可以進行修改或者刪除操作
14.5、數據的轉移(新建數據庫或轉移服務器)
一般情況下,最好使用備份和還原操作來進行轉移數據,在特殊情況下,可以用導入導出的方式進行轉移,這裏介紹的就是導入導出方式,導入導出方式轉移數據一個作用就是可以在收縮數據庫無效的情況下用來減小(收縮)數據庫的大小,本操作默認爲您對SQL的操作有一定的瞭解,如果對其中的部分操作不理解,可以諮詢動網相關人員或者查詢網上資料。
1、將原數據庫的所有表、存儲過程導出成一個SQL文件,導出的時候注意在選項中選擇編寫索引腳本和編寫主鍵、外鍵、默認值和檢查約束腳本選項;
2、新建數據庫,對新建數據庫執行第一步中所建立的SQL文件;
3、用SQL的導入導出方式,對新數據庫導入原數據庫中的所有表內容;
利用數據庫日誌恢復數據到時間點的操作
由於不正常的數據丟失,而又不想使用備份數據還原,只要原來有備份且當前日誌保存完好,可以採用這個方法試試,說不定可挽回損失……
1,如果誤操作之前存在一個全庫備份(或已有多個差異備份或增量備份),首先要做的事就是進行一次日誌備份(如果爲了不讓日誌文件變大而置trunc. log on chkpt.選項爲1那你就死翹了);
backup log dbName to disk='fileName'
2,恢復一個全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個恢復;
restore database dbName from disk='fileName' with norecovery
3,恢復最後一個日誌備份即剛做的日誌備份,指定恢復時間點到誤操作之前的時刻。
restore log dbName from disk='fileName'
with stopat='date_time'
以上這些操作都可以在SQL SERVER企業管理器裏完成,難度不大。。。
當然,如果誤操作是一些不記日誌的操作比如truncate table,select into等操作,那麼是無法利用上述方法來恢復數據的...
15.SQL Server2000數據庫文件損壞時如何恢復
出現這樣的問題是比較嚴重的了,能否修復只能看你的運氣……
SQL Server2000中,如果數據庫文件(非系統數據庫文件)遇到錯誤的時候,僅適用於非master,msdb的數據庫。
說明如下:
1 建一個測試數據庫test(數據庫類型爲完全);
2 建一個表,插入點記錄:
create table a(c1 varchar(2))
go
insert into a values('aa')
go
insert into a values('bb')
go
3 作完全備份,到文件test_1.bak;
4 再作一點修改:
insert into a values('cc')
go
create table b(c1 int)
go
insert into b values(1)
go
insert into b values(2)
go
5 shutdown 數據庫服務器;
6 用ultraedit編輯數據庫文件test_data.mdf,隨便修改點字節內容,相當於數據庫遭到致命的損壞;
7 啓動數據庫,並且運行企業管理器,點開數據庫,看到test變成灰色,而且顯示置疑;
8 運行isql -SLocalhost -Usa -P:
1> backup log test TO DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKUP
est_2.bak' WITH NO_TRUNCATE
2>go
已處理 2 頁,這些頁屬於數據庫 'test' 的文件 'TEST_Log'(位於文件 1 上)。
BACKUP LOG 操作成功地處理了 2 頁,花費了 0.111 秒(0.087 MB/秒)。
9 進行恢復最老的完全備份:
1> RESTORE DATABASE test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQL
BACKUP est_1.bak' WITH NORECOVERY
2> go
已處理 96 頁,這些頁屬於數據庫 'test' 的文件 'TEST_Data'(位於文件 1 上)。
已處理 1 頁,這些頁屬於數據庫 'test' 的文件 'TEST_Log'(位於文件 1 上)。
RESTORE DATABASE 操作成功地處理了 97 頁,花費了 0.107 秒(7.368 MB/秒)。
10 恢復最近的日誌:
1> RESTORE LOG test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKU
P est_2.bak' WITH RECOVERY
2> go
已處理 2 頁,這些頁屬於數據庫 'test' 的文件 'TEST_Log'(位於文件 1 上)。
RESTORE LOG 操作成功地處理了 2 頁,花費了 0.056 秒(0.173 MB/秒)。
16.存儲過程編寫經驗和優化措施
一、適合讀者對象:
數據庫開發程序員,數據庫的數據量很多,涉及到對SP(存儲過程)的優化的項目開發人員,對數據庫有濃厚興趣的人。
二、介紹:
在數據庫的開發過程中,經常會遇到複雜的業務邏輯和對數據庫的操作,這個時候就會用SP來封裝數據庫操作。如果項目的SP較多,書寫又沒有一定的規範,將會影響以後的系統維護困難和大SP邏輯的難以理解,另外如果數據庫的數據量大或者項目對SP的性能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的SP要比一個性能差的SP的效率甚至高几百倍。
三、內容:
1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“databse.dbo.table_name”,因爲sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。
2、開發人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優化檢查。
3、高程序運行效率,優化應用程序,在SP編寫過程中應該注意以下幾點:
a)SQL的使用規範:
i. 儘量避免大事務操作,慎用holdlock子句,提高系統併發能力。
ii. 儘量避免反覆訪問同一張或幾張表,尤其是數據量較大的表,可以考慮先根據條件提取數據到臨時表中,然後再做連接。
iii. 儘量避免使用遊標,因爲遊標的效率較差,如果遊標操作的數據超過1萬行,那麼就應該改寫;如果使用了遊標,就要儘量避免在遊標循環中再進行表連接的操作。
iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、範圍大小來確定條件子句的前後順序,儘可能的讓字段順序與索引順序相一致,範圍從大到小。
v. 不要在where子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
vi. 儘量使用exists代替select count(1)來判斷是否存在記錄,count函數只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
vii. 儘量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之間的替換
ix. 注意表之間連接的數據類型,避免不同類型數據之間的連接。
x. 注意存儲過程中參數和數據類型的關係。
xi. 注意insert、update操作的數據量,防止與其他應用衝突。如果數據量超過200個數據頁面(400k),那麼系統將會進行鎖升級,頁級鎖會升級成表級鎖。
b)索引的使用規範:
i. 索引的創建要與應用結合考慮,建議大的OLTP表不要超過6個索引。
ii. 儘可能的使用索引字段作爲查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引。
iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。
iv. 在使用索引字段作爲條件時,如果該索引是聯合索引,那麼必須使用到該索引中的第一個字段作爲條件時才能保證系統使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護,週期性重建索引,重新編譯存儲過程。
c)tempdb的使用規範:
i. 儘量避免使用distinct、order by、group by、having、join、cumpute,因爲這些語句會加重tempdb的負擔。
ii. 避免頻繁創建和刪除臨時表,減少系統表資源的消耗。
iii. 在新建臨時表時,如果一次性插入數據量很大,那麼可以使用select into代替create table,避免log,提高速度;如果數據量不大,爲了緩和系統表的資源,建議先create table,然後insert。
iv. 如果臨時表的數據量較大,需要建立索引,那麼應該將創建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
v. 如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先truncate table,然後drop table,這樣可以避免系統表的較長時間鎖定。
vi. 慎用大的臨時表與其他大表的連接查詢和修改,減低系統表負擔,因爲這種操作會在一條語句中多次使用tempdb的系統表。
d)合理的算法使用:
根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,採用多種算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。