標籤:產生 orm 變數 text 運行 pen ram 哪些 format
今天在做東西,更新資料庫,資料庫更新成功了,可是sqldatasource卻求支援,於是我找了所有可能的原因,最後終於解決了。就是更新完資料庫一定要記得更新sqldatasource!雖然不是什麼大錯,但是改了,頁面才會百分百不出錯,看著也舒服些麼!下面就是更新它的一個簡單舉例:
SqlDataSource1.UpdateCommand = "UPDATE PlayList SET PlayTime="+time2+", PlayBorder="+border+"";
下面來看看原因吧:
SqlDataSource控制項
SqlDataSource控制項是一個資料來源控制項,代表與一個關係型資料存放區(諸如SQL Server或Oracle或任何一個可以通過OLE DB或ODBC橋樑訪問的資料來源)的串連。
我們使用兩個主要屬性建立資料存放區的串連:ConnectionString和ProviderName。前一個屬性工作表示連接字串,包含了開啟與底層引擎會話所需的足夠資訊。後一個屬性規定此操作使用的ADO.NETManaged 提供者的命名空間。ProviderName屬性預設為System.Data.SqlClient,這表示預設的資料存放區是SQL Server。例如,要瞄準一個OLE DB提供者,則使用System.Data.OleDb字串。
該控制項既可以使用資料配接器也可以使用命令對象檢索資料。根據我們的選擇,擷取的資料將被封裝到一個DataSet對象或一個資料閱讀器中。如下代碼片斷說明了啟用一個綁定到一個SQL Server資料庫的SQL資料來源控制項所需的最少代碼:
<asp:SqlDataSource runat="server" ID="MySqlSource"
ProviderName=‘<%$ ConnectionStrings:LocalNWind.ProviderName %>‘
ConnectionString=‘<%$ ConnectionStrings:LocalNWind %>‘
SelectCommand="SELECT * FROM employees" />
<asp:DataGrid runat="server" ID="grid" DataSourceID="MySqlSource" />
1. SqlDataSource控制項的編程介面
表9.10列出的屬性群組提供了關聯的視圖類所支援的資料操作。
表9.10 配置資料操作的屬性
屬性群組
描述
DeleteCommand, DeleteParameters,
DeleteCommandType
獲得或設定用來刪除底層資料存放區中的資料行的SQL語句、相關參數以及類型(文本或預存程序)。
FilterExpression, FilterParameters
獲得或設定用來建立使用Select命令擷取的資料之上的過濾器的字串(和相關參數)。只有當控制項通過DataSet管理資料時才起作用。
InsertCommand, InsertParameters,
InsertCommandType
獲得或設定用來在底層資料存放區中插入新行的SQL語句、相關參數和類型(文本或預存程序)。
SelectCommand, SelectParameters,
SelectCommandType
獲得或設定用來從底層資料存放區中擷取資料的SQL語句、相關參數和類型(文本或預存程序)。
SortParameterName
獲得或設定一個命令的預存程序將用來儲存資料的一個輸入參數的名稱。(這種情況下的命令必須是預存程序。)如果缺少該參數,則會引起一個異常。
UpdateCommand, UpdateParameters,
UpdateCommandType
獲得或設定用來更新底層資料存放區中的資料行的SQL語句、相關參數和類型(文本或預存程序)。
每個命令屬性都是一個字串,包含將要使用的SQL文本。命令可以有選擇地包含關聯參數集中列出的參數。Managed 提供者及其底層的關聯式引擎決定SQL要使用的確切文法以及嵌入參數的文法。例如,如果資料來源控制項指向SQL Server,則命令參數名必須以@symbol為首碼。如果目標資料來源是一個OLE DB提供者,則參數是無名的,用一個?預留位置符號標識,並且按位置進行定位。如下代碼片斷展示了一個更複雜的資料來源控制項,其中啟用了參數化刪除和更新命令:
<asp:SqlDataSource runat="server" ID="MySqlSource"
ConnectionString=‘<%$ ConnectionStrings:LocalNWind %>‘
SelectCommand="SELECT * FROM employees"
UpdateCommand="UPDATE employees SET [email protected]"
DeleteCommand="DELETE FROM employees WHERE [email protected]"
FilterExpression="employeeid > 3">
<!-- parameters go here -->
</asp:SqlDataSource>
FilterExpression屬性適用的文法與DataView類的RowFilter屬性適用的文法相同,而後者又類似於SQL WHERE子句使用的文法。如果FilterExpression需要是參數化的,則可以通過FilterParameters集合指明參數。只有在DataSourceMode設定為DataSet時才能啟用過濾功能。
注意 注意過濾器運算式和Select命令上的參數之間的區別。該命令上的參數影響資料存放區返回的結果集;而過濾器運算式限制通過Select命令返回的結果集的顯示內容。
表9.11詳細描述了SqlDataSource類的其他動作屬性。該列表沒有包括與緩衝相關的屬性,稍後再介紹這些屬性。
表9.11 SqlDataSource類的其他屬性
屬性
描述
CancelSelectOnNullParameter
指示如果一個參數等於null是否撤銷資料檢索操作。預設值為true。
ConflictDetection
決定該控制項在一次刪除或更新操作期間應如何處理資料衝突。在預設情況下,同時發生的變更被覆蓋。
ConnectionString
串連到資料庫的連接字串。
DataSourceMode
指示應如何返回資料:通過DataSet還是通過資料閱讀器。
OldValuesParameterFormatString
獲得或設定一個格式字串,該格式字串應用於傳遞給Delete或Update方法的任何參數的名稱。
ProviderName
指示將要使用的ADO.NETManaged 提供者的命名空間。
有趣的是,這些屬性中有很多映射了實際視圖類上定義的相同屬性,如前面的圖9.10所示。
SqlDataSource對象有幾個方法和事件,在大多數情況下所有的資料來源組件都有這些方法和事件。其中方法包括Delete, Insert, Select和Update,並且它們是作為底層資料來源檢視類的對應方法的惟一封裝器實現的。這些事件成對存在:Deleting/Deleted、Inserting/Inserted、Selecting/Selected和Updating/Updated,並且在上述方法之前和之後激發。過濾操作的開始通過Filtering事件發出訊號。
如前所述,ASP.NET 2.0特有的控制項是惟一真正地利用資料來源控制項的能力的控制項。因而,後面兩章專門介紹GridView, DetailsView和FormView控制項,到時將會看到大量範例程式碼,它們說明了如何使用SqlDataSource控制項進行選擇、更新、分頁和排序。在本章中,我們將花更多的時間來討論該控制項的其他特徵,這些特徵特別適合在實際應用中使用。
2. 聲明性參數
每個命令屬性都有自己的參數集——ParameterCollection集合類的一個執行個體。ASP.NET 2.0支援不少參數類型,如表9.12所示。
表9.12 ASP.NET 2.0中的參數類型
參數
描述
ControlParameter
從一個伺服器控制項的任何公用屬性獲得該參數值。
CookieParameter
根據指定的HTTP cookie的內容設定參數值。
FormParameter
從HTTP請求表單的指定輸入欄位中擷取該參數值。
Parameter
擷取由代碼分配的參數值。
ProfileParameter
從根據應用程式的個人化機制建立的設定檔對象中的指定屬性擷取該參數值。
QueryStringParameter
從請求查詢字串中的指定變數擷取該參數值。
SessionParameter
根據指定的工作階段狀態槽的內容設定該參數值。
每個參數類都有一個Name屬性以及它的作用和實現特有的屬性集。為了理解資料來源控制項中的聲明性參數,讓我們看看如下代碼:
<asp:SqlDataSource runat="server" ID="MySource"
ConnectionString=‘<%$ ConnectionStrings:LocalNWind %>‘
SelectCommand="SELECT * FROM employees WHERE employeeid > @MinID">
<SelectParameters>
<asp:ControlParameter Name="MinID" ControlId="EmpID"
PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>
該查詢包含一個名為@MinID的預留位置。該資料來源控制項用ControlParameter對象返回的資訊自動地填充該預留位置。控制項參數的值由給定控制項上的給定屬性所決定。PropertyName屬性規定了該屬性的名稱;而該控制項的ID在ControlId屬性中。為了使前面的代碼起作用,頁面開發人員必須保證該頁麵包含一個具有給定的ID和屬性的控制項;否則,拋出一個異常。在本例中,EmpID控制項上的Text屬性的值被用作匹配參數的值。
形參(命令文本中的預留位置)和實際值之間的綁定,取決於底層的Managed 提供者如何處理和辨認參數。如果提供者類型支援有名的參數(象SQL Server和Oracle那樣),則這種綁定涉及將佔位符的名稱與參數的名稱進行匹配。否則,這種匹配是基於位置的。因此,第1個預留位置綁定到第1個參數,以此類推。這就是使用OLE DB訪問資料時發生的情況。
3. 衝突檢測
SqlDataSource控制項能夠以兩種方法之一有選擇地執行資料庫侵入的操作(刪除和更新)。資料來源控制項與資料繫結控制項相聯絡,因此,同時讀取資料,也許還要在用戶端進行修改,然後進行更新,這種思想並不是牽強的。在多個使用者擁有對資料庫的讀/寫訪問的情況下,如果他們企圖操作的記錄同時被修改了,則更新/刪除方法的行為應怎樣呢?
SqlDataSource控制項使用ConflictDetection屬性確定在執行更新和刪除操作時要做什麼。該屬性被聲明為ConflictOptions枚舉類型;其預設值是OverwriteChanges,這就是說,無論該行中的值自上一次被讀取以來有沒有發生變化,任何侵入操作都會發生變化。另一個值是CompareAllValues,它只是確保SqlDataSource控制項將從資料庫讀取得未經處理資料,傳給底層視圖類的Delete或Update方法。
除非這樣編寫刪除或更新語句,即如果該行中的資料不匹配最初讀取的資料,則命令失敗,否則改變ConflictDetection的值不會產生任何顯著效果,注意到這一點是重要的。為做到這一點,應如下面這樣定義命令:
UPDATE employees SET [email protected]
WHERE [email protected] AND [email protected]_firstname
換句話說,我們必須顯式地向命令添加一個額外的子句,檢查正被修改的欄位的當前值是否仍然匹配最初讀取的值。這樣,多個使用者同時輸入的中間變更使WHERE子句失敗,從而使命令失敗。我們自己負責調整命令文本;把ConflictDetection設定為CompareAllValues是不夠的。
如何格式化表示舊值的參數的名稱?SqlDataSource控制項使用OldValuesParameterFormatString屬性格式化這些參數名。預設值是original_{0}。
如果使用CompareAllValues選項,則可以處理資料來源控制項上的Deleted或Updated事件,以檢查多少行受到影響。如果該操作沒有影響任何記錄,則可能會發生並發違規(concurrency violation):
void OnUpdated(object sender, SqlDataSourceStatusEventArgs e)
{
if (e.AffectedRows == 0) {
...
}
}
4. 緩衝行為
一個資料繫結控制項與它的資料來源組件之間的資料繫結是自動完成的,並在由資料繫結控制項引起的每次頁面回傳時發生。假設一個頁面有網格、一個資料來源控制項和一個按鈕。如果以編輯模式開啟該網格,則Select命令運行;如果單擊該按鈕(在資料繫結控制項的邊界之外),則根據檢視狀態重建該網格的UI,並且不會運行任何Select語句。
為了在每次回傳時儲存一個查詢,可以要求資料來源控制項緩衝給定期間內的結果集。在資料被緩衝的時間裡,Select方法從緩衝(而不是底層資料庫)中檢索資料。在該緩衝期滿時,Select方法從底層資料檢索資料,並新資料存回到緩衝中。SqlDataSource的緩衝行為由表9.13中的屬性所控制。
表9.13 SqlDataSource上的緩衝屬性
屬性
描述
CacheDuration
指示資料應當在緩衝中保留多久(以秒為單位)。
CacheExpirationPolicy
指示緩衝期限是絕對的還是可調整的。如果是絕對的,則在規定的秒數之後使緩衝中的資料無效。如果是可調整的,則使那些在指定期限內沒有用過的資料無效。
CacheKeyDependency
指示使用者定義的緩衝鍵的名稱,該緩衝鍵連結到資料來源控制項建立的所有快取項目。通過終止該鍵,可以清楚該控制項的緩衝。
EnableCaching
啟用或禁用緩衝支援。
SqlCacheDependency
獲得或設定一個用分號分隔的字串,指示哪些資料庫和表用於SQL Server緩衝依賴。
SelectCommand、ConnectionString和SelectParameters的每種不同組合建立一個快取項目。如果多個SqlDataSource控制項正好裝載相同資料庫中的相同資料,則它們可以共用相同的快取項目。通過CacheKeyDependency屬性可以控制由資料來源控制項管理的快取項目。如果該屬性設定為非null字串,則強制SqlDataSource控制項在使用者定義的鍵和該控制項建立的所有快取項目之間建立依賴性。這時,要清除該控制項的緩衝,只需給依賴鍵分配一個新值:
Cache["ClearAll"] = anyInitializationValue;
SqlDataSource1.CacheKeyDependency = "ClearAll";
...
Cache["ClearAll"] = anyOtherValue;
SqlDataSource控制項只有在DataSet模式下工作時才能快取資料。如果DataSourceMode設定為DataReader,並且緩衝被啟用,則會得到一個異常。
最後,SqlCacheDependency屬性將SqlDataSource控制項緩衝的資料與指定資料庫表(通常與提供快取資料的表是同一個表)的內容聯絡起來:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
CacheDuration="1200"
ConnectionString="<%$ ConnectionStrings:LocalNWind %>"
EnableCaching="true"
SelectCommand="SELECT * FROM employees"
SqlCacheDependency="Northwind:Employees">
</asp:SqlDataSource>
解決:C#除非指定UpdateCommand,否則資料來源SqlDataSource不支援更新操作