In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-03-26 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/03 Report--
This article will explain in detail how to create a custom Database in ASP.NET 2.0. the editor thinks it is very practical, so I share it with you as a reference. I hope you can get something after reading this article.
Introduction:
The site map feature of ASP.NET 2.0 allows page developers to define the site map of a web program in some persistent media (persistent medium), such as a XML file. Once defined, we can access it through the SiteMap class class of the System.Web namespace or through some Web navigation control, such as SiteMapPath, Menu, or TreeView. The site map system uses the provider model pattern, so you can create different site map and apply it to a web application. The default site map provider for ASP.NET 2.0, whose structure is an XML file.
The default XML (XML-based)-based site map provider works when the structure of site map is static, just like this series of tutorials. But most of the time we need dynamic site map. As shown in the site map in figure 1, each category and the products belonging to that category are distributed hierarchically in the structure of the website. In this site map, when you visit the web page of the root directory, all categories are listed; when you visit the root directory of a specific category, all products that belong to that category are listed; and when you visit a specific product, the details of that product are listed.
Figure 1:Categories and Products constitute the hierarchical structure of Site Map.
This category-and product-based structure can be hard-coded to Web.sitemap files. The file needs to be updated whenever category or product is added, deleted, renamed, and so on. Naturally, if the structure is obtained through the database or, more ideally, from the business logic layer, then the maintenance of site map is simple. In that case, as long as you add, delete, or rename products and categories, site map will automatically update to reflect these changes.
Since the site map of ASP.NET 2.0 is based on the provider schema, we can create a custom site map provider to get data from the database or some layer. In this article, the provider we created will fetch data from the business logic layer. Let's get started!
Note: the custom site map provider created in this article depends only on the layer of the system and its data schema (data model). Jeff Prosise's article "Storing Site Maps in SQL Server" (http://msdn.microsoft.com/msdnmag/issues/05/06/WickedCode/)
And "The SQL Site Map Provider You've Been Waiting For."
(http://msdn.microsoft.com/msdnmag/issues/06/02/wickedcode/default.aspx)
The method of storing site map data in SQL Server is investigated.
Step 1: create a user-customized Site Map Provider page
Before creating a user-customized Site Map Provider, add the ASP.NET page that will be used in this chapter. First add a folder named SiteMapProvider, and then add the following page to the folder to ensure that you use the master Site.master:
Default.aspx
ProductsByCategory.aspx
ProductDetails.aspx
Again, add CustomProviders to the App_Code folder
Figure 2: add related ASP.NET pages.
Since there is only one article in this section, there is no need for the Default.aspx page to list the articles in this section; we will use a GridView control in Default.aspx to list the categories, which is discussed in the second step.
Then, update the Web.sitemap to include a reference to the Default.aspx page. Specifically, add the following code after "Caching":
After completing the Web.sitemap update, take the time to log in to the page in your browser and the entries for this tutorial are included in the menu on the left.
Figure 3:Site Map now contains entries for this chapter
This tutorial focuses on how to create a user-defined site map provider and how to set up a web application to include the site map provider. Specifically, the site map (site map) it returns contains not only the root node, but also each category node and product node, as shown in figure 1. In general, each node in the site map corresponds to a specific URL. As far as our site map is concerned, the URL of the root node is ~ / SiteMapProvider/Default.aspx, which lists all products and categories; the corresponding URL of each category node is ~ / SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID, which lists all products of that category according to the specified categoryID; finally, the URL of each product is ~ / SiteMapProvider/ProductDetails.aspx?ProductID=productID, which lists the details of the product according to the specified productid value.
First, let's create Default.aspx, ProductsByCategory.aspx, and ProductDetails.aspx pages. We will create these pages in steps 2, 3, and 4, respectively. Because the focus of this article is site map providers, and this kind of master / slave page has been discussed in the previous tutorial, we will mention it in steps 2 to 4, if you are not very familiar with this kind of master / slave page, please refer to the previous tutorial 9 "Master/Detail Filtering Across Two Pages".
Step 2: display the Categories
Open the Default.aspx page in the folder SiteMapProvider, drag a GridView control from the toolbox to the page in design mode, and set its ID to Categories. From its smart tag, bind it to an ObjectDataSource named CategoriesDataSource and set it to use the GetCategories method of the CategoriesBLL class. Because the GridView control only displays categories and does not modify data, select "(None)" in the UPDATE, INSERT and DELETE tags.
Figure 4: setting ObjectDataSource to return Categories using the GetCategories method
Figure 5: select "(None)" in the UPDATE, INSERT, and DELETE tags
After setting up, Visual Studio automatically adds the bound columns CategoryID, CategoryName, Description, NumberOfProducts and BrochurePath (BoundField), modifies GridView to contain only CategoryName and Description columns, and changes the HeaderText property of the CategoryName bound column to "Category".
Then, add a HyperLinkField, place it on the far left, set its DataNavigateUrlFields property to CategoryID;DataNavigateUrlFormatString property to ~ / SiteMapProvider/ProductsByCategory.aspx?CategoryID= {0}, and set the Text property to "View Products".
Figure 6: adding a HyperLinkField for GridView
After creating the ObjectDataSource and customizing the columns of the GridView control, the declaration code for the two controls should look similar to the following:
Figure 7 shows the Default.aspx page viewed in the browser. Clicking on the "View Products" link of a class will take you to the ProductsByCategory.aspx?CategoryID=categoryID page, which we will create in step 3.
Figure 7: each class has a "View Products" link
Step 3: show all products of the specified category
Open the ProductsByCategory.aspx page and add a GridView control, setting its ID to ProductsByCategory. From its smart tag, bind it to an ObjectDataSource; named ProductsByCategoryDataSource to set it to use the GetProductsByCategoryID (categoryID) method of the ProductsBLL class; select "(None)" in the UPDATE, INSERT, and DELETE tags.
Figure 8: using the GetProductsByCategoryID (categoryID) method of the ProductsBLL class
The last step of the setup wizard is to specify the parameter source of categoryID, because this information is passed through the query string (querystring field) CategoryID, so select QueryString in the parameter source and type "CategoryID" in QueryStringField; click Finish to complete the setting as shown in figure 9.
Figure 9: specify CategoryID Querystring Field for the parameter categoryID
When the setting is complete, Visual Studio will add the corresponding bound column and CheckBo column for GridView; delete the columns except ProductName, UnitPrice, and SupplierName. Set the HeaderText property of the three columns to "Product", "Price", and and "Supplier", respectively, and format the UnitPrice column as currency.
Then, add a HyperLinkField column and place it on the far left; set its Text property to "View Details", its DataNavigateUrlFields property to ProductID;, and its DataNavigateUrlFormatString attribute to ~ / SiteMapProvider/ProductDetails.aspx?ProductID= {0}.
Figure 10: add a "View Details" HyperLinkField to link to ProductDetails.aspx
When complete, the declaration code for GridView and ObjectDataSource is:
Go back to the Default.aspx page and click the "View Products" link of Beverages, which will go to the ProductsByCategory.aspx?CategoryID=1 page and display names, prices, and suppliers information for all products in the beverage category (see figure 11). Feel free to improve the page by adding a link to make it easier for users to return to the previous page (Default.aspx). You can also add a DetailsView or FormView control to display the name and description of the category.
Figure 11: displaying Names, Prices, Suppliers information for the Beverages class
Step 4: display details of the product
The final page to be created, ProductDetails.aspx, is used to display the details of the specified product. Open the ProductDetails.aspx page, drag a DetailsView control from the toolbox to the page, set its ID to ProductInfo, and clear its Height and Width property values. In its smart tag, bind to an ObjectDataSource named ProductDataSource and set the ObjectDataSource to use the GetProductByProductID (productID) method of the ProductsBLL class. Select "(None)" in the UPDATE, INSERT, and DELETE tags.
Figure 12: setting up the ObjectDataSource control to call the GetProductByProductID (productID) method
Finally, you need to set the source of the parameter productID. Since the data is passed through the query string ProductID, select QueryString in the parameter source drop-down list and enter "ProductID" in the QueryStringField dialog box. Finally, click the Finish button to complete the setting.
Figure 13: setting parameter productID is derived from the query string
After completing the settings, Visual Studio will add the appropriate bound and CheckBox columns for the DetailsView control, remove ProductID, SupplierID, and CategoryID columns, and set the rest of the columns as you like. I've made some optimizations to the interface so that the declaration code looks like this:
To test the page, return to the Default.aspx page, click the "View Products" link of the category Beverages, and then click the "View Details" link of the product Chai Tea. This takes you to the ProductDetails.aspx?ProductID=1 page, which displays the details of Chai Tea (figure 14).
The Supplier, Category, Price and other information of the figure 14:Chai Tea is displayed.
Step 5: understand the internal processing mechanism of Site Map Provider
Site map presents a set of SiteMapNode instances (a collection of SiteMapNode instances) derived from some hierarchy. It must have a root node, all non-root nodes have a parent node, and each node can have any number of child nodes. Each SiteMapNode object corresponds to some part of the website architecture. These sections usually have corresponding web pages, so the SiteMapNode class class has properties such as Title, Url, and Description, which are used to describe information about the corresponding parts of the SiteMapNode.
There is also a Key attribute that uniquely identifies these SiteMapNode;, as well as ChildNodes, ParentNode, NextSibling, PreviousSibling, and so on.
Figure 15 shows the overall structure of the site map corresponding to figure 1, but in more detail.
You can access the RootNode property of the site map; class through the SiteMap class class of the namespace System.Web to return the SiteMapNode instance of the root directory of the site map; the CurrentNode property returns this kind of SiteMapNode, and its Url property happens to match the URL of the current request page. ASP.NET 2.0's Web navigation control will use the SiteMap class class inside.
When accessing the properties of the SiteMap class class, the hierarchical structure of the site map must be transferred from some medium to memory (memory). The SiteMap class class does not handle the logical relationship of the site map by "hard coding", but works through some kind of site map provider. By default, the XmlSiteMapProvider class class is used, which reads the structure of the site map from a standard XML file. However, we can create our own site map provider with a little work.
All site map providers inherits from the SiteMapProvider class class, which contains the most basic methods and properties used by site map providers, but omits many implementation details. The second class to be used by site map providers is the StaticSiteMapProvider class class, which extends the SiteMapProvider class class to include more necessary functions. Inside, StaticSiteMapProvider stores the SiteMapNode instance of the site map in a hash table (Hashtable) and includes AddNode (child, parent), RemoveNode (siteMapNode), Clear () and other methods to add and delete the SiteMapNodes in the hash table. In addition, XmlSiteMapProvider also inherits from StaticSiteMapProvider.
When creating a custom site map provider, you need to extend StaticSiteMapProvider and overrid two abstract methods-BuildSiteMap and GetRootNodeCore. For BuildSiteMap, as its name implies, the structure of the sitemap is loaded into memory hierarchically from some medium, while GetRootNodeCore returns the root directory of the sitemap.
When using a site map provider, you need to register in the application's configuration file (registered)
. By default, the XmlSiteMapProvider class class is registered as AspNetXmlSiteMapProvider. Net. To register the additional site map providers, you can add the following code to the Web.config file:
...
The name property assigns an easy-to-read name to the site map provider; the type attribute determines the type of the site map provider. When we have created our custom site map provider, we will assign values to the name and type properties in step 7.
When accessing site map provider for the first time from a SiteMap class class, the site map provider class class should be instantiated and reside in memory throughout the life cycle of the web application.
Based on the consideration of performance, we should cache the data of the site map structure that resides in memory. Every time we call the method of BuildSiteMap, we directly return the cached data without re-retrieving the data. In any case, if we do not cache the website structure corresponding to the BuildSiteMap, we need to retrieve the product and category information through the "layer" each time we call it (this will eventually lead to the query of the database). We discussed the "obsolete" problem of cached data in the previous caching section, for which we either use time-based or SQL cache dependency-based caching technology.
Note: a site map provider can override the Initialize method method arbitrarily. The initialize method is called when site map provider is first instantiated and can pass to it the user-defined attribute values that we assigned in the elements of the Web.config file, such as:. This is useful when a page developer wants to specify various site map provider-related settings but does not want to modify the site map provider code. For example, if we want to read category and products data directly from the database without going through the layer, we certainly want the page developer to call the database connection string in the Web.config file instead of using the "hard-coded" value in the site map provider code. We are not going to override the Initialize method in the custom site map provider created in step 6. See Jeff Prosise's article "Storing Site Maps in SQL Server" (http://msdn.microsoft.com/msdnmag/issues/05/06/WickedCode/))
Step 6: create a custom Site Map Provider
To create a custom site map provider to build a site map derived from categories and products information in the Northwind database, we need to create a class that extends StaticSiteMapProvider. Earlier, we added a CustomProviders folder to the App_Code folder, added a new class named NorthwindSiteMapProvider to the folder, and added the following code to the class:
Using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Web.Caching;public class NorthwindSiteMapProvider: StaticSiteMapProvider {private readonly object siteMapLock = new object (); private SiteMapNode root = null; public const string CacheDependencyKey = "NorthwindSiteMapProviderCacheDependency" Public override SiteMapNode BuildSiteMap () {/ / Use a lock to make this method thread-safe lock (siteMapLock) {/ / First, see if we already have constructed the / / rootNode. If so, return it... If (root! = null) return root; / / We need to build the site map! / / Clear out the current site map structure base.Clear (); / / Get the categories and products information from the database ProductsBLL productsAPI = new ProductsBLL (); Northwind.ProductsDataTable products = productsAPI.GetProducts (); / / Create the root SiteMapNode root = new SiteMapNode (this, "root", "~ / SiteMapProvider/Default.aspx", "All Categories"); AddNode (root) / Create SiteMapNodes for the categories and products foreach (Northwind.ProductsRow product in products) {/ / Add a new category SiteMapNode, if needed string categoryKey, categoryName; bool createUrlForCategoryNode = true; if (product.IsCategoryIDNull ()) {categoryKey = "Category:None"; categoryName = "None"; createUrlForCategoryNode = false;} else {categoryKey = string.Concat ("Category:", product.CategoryID); categoryName = product.CategoryName;} SiteMapNode categoryNode = FindSiteMapNodeFromKey (categoryKey) / / Add the category SiteMapNode if it does not exist if (categoryNode = = null) {string productsByCategoryUrl = string.Empty; if (createUrlForCategoryNode) productsByCategoryUrl = "~ / SiteMapProvider/ProductsByCategory.aspx?CategoryID=" + product.CategoryID; categoryNode = new SiteMapNode (this, categoryKey, productsByCategoryUrl, categoryName); AddNode (categoryNode, root);} / Add the product SiteMapNode string productUrl = "~ / SiteMapProvider/ProductDetails.aspx?ProductID=" + product.ProductID SiteMapNode productNode = new SiteMapNode (this, string.Concat ("Product:", product.ProductID), productUrl, product.ProductName); AddNode (productNode, categoryNode);} / / Add a "dummy" item to the cache using a SqlCacheDependency / / on the Products and Categories tables System.Web.Caching.SqlCacheDependency productsTableDependency = new System.Web.Caching.SqlCacheDependency ("NorthwindDB", "Products"); System.Web.Caching.SqlCacheDependency categoriesTableDependency = new System.Web.Caching.SqlCacheDependency ("NorthwindDB", "Categories") / / Create an AggregateCacheDependency System.Web.Caching.AggregateCacheDependency aggregateDependencies = new System.Web.Caching.AggregateCacheDependency (); aggregateDependencies.Add (productsTableDependency, categoriesTableDependency); / / Add the item to the cache specifying a callback function HttpRuntime.Cache.Insert (CacheDependencyKey, DateTime.Now, aggregateDependencies, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, new CacheItemRemovedCallback (OnSiteMapChanged)); / / Finally, return the root node return root;}} protected override SiteMapNode GetRootNodeCore () {return BuildSiteMap () } protected void OnSiteMapChanged (string key, object value, CacheItemRemovedReason reason) {lock (siteMapLock) {if (string.Compare (key, CacheDependencyKey) = = 0) {/ / Refresh the site map root = null;} public DateTime? CachedDate {get {return HttpRuntime.Cache [CacheDependencyKey] as DateTime?;}
Let's look at the BuildSiteMap method of this class, which has a lock statement declaration. Lock statement only allows single-thread operations (one thread at a time to enter) at a time to avoid conflicts between multithreaded operations.
The SiteMapNode variable-root, which belongs to the class-level, is used to cache the sitemap structure. When the site map is "structured" for the first time, or the "source data" is changed for the first time "structured", the root is null, and in the process of "structuring", root is assigned to the root node of the site map, so when the BuildSiteMap method is called for the second time, root is no longer the null value. Naturally, as long as the root is not null, the sitemap structure is returned directly without having to recreate it.
If root is null, the site map structure will be created based on product and category information. For this reason, we should first create a SiteMapNode instance, then call the AddNode method method of the StaticSiteMapProvider class class to build the hierarchical system of the site map, and then store the SiteMapNode instance in a hash table. Before we build the hierarchy, we first call the Clear method method to empty the internal hash table, and then call the GetProducts () method of the ProductsBLL class class to store the returned ProductsDataTable in the local variable.
Creating a sitemap structure starts with creating a root node and assigning a value to root. The SiteMapNode's constructor overload used in this chapter accepts the following information:
A reference to a site map provider (this).
Key value of SiteMapNode: this undetermined value must be unique for each SiteMapNode.
URL value of SiteMapNode: Url is optional, but once specified, the URL value of each SiteMapNode must be unique.
Title value of SiteMapNode: this is required.
The AddNode (root) method method adds SiteMapNode root to the site map as the root node. Then, iterate through all the ProductRow in the ProductsDataTable, and if the SiteMapNode corresponding to the category of the current product already exists, then if the SiteMapNode; does not exist, create a new SiteMapNode for the category, and call the AddNode (categoryNode, root) method method to add it as a child node of the SiteMapNode root. When the SiteMapNode corresponding to category is found or created, a SiteMapNode corresponding to the current product is created and added as a child node of category SiteMapNode by AddNode (productNode, categoryNode) method. Notice that the Url attribute of category SiteMapNode is ~ / SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID; and the Url attribute of product SiteMapNode is ~ / SiteMapNode/ProductDetails.aspx?ProductID=productID.
Note: for products with a null CategoryID, they are all classified as a category, and the Title property of the corresponding category SiteMapNode can be set to "None"; the Url property can be set to an empty string. I set its Url to an empty string because the GetProductsByCategory (categoryID) method of the ProductBLL class class cannot return products whose Category ID value is NULL. However, I encourage you to extend this tutorial so that the Url property of the category SiteMapNode corresponds to a ProductsByCategory.aspx page dedicated to displaying products whose CategoryID is NULL.
When you have finished building the site map, add an AggregateCacheDependency object object to the data cache that uses SQL cache dependency technology based on Categories and Products tables. We discussed SQL cache dependencies in the previous tutorial, but our custom site map provider uses the overloaded (overload) data cache Insert method, which takes a delegate as an input parameter. Specifically, we will pass in a CacheItemRemovedCallback delegate that points to the OnSiteMapChanged method method, which is defined in the NorthwindSiteMapProvider class class
Note: the site map representation in memory is cached in a class-level variable root. Since there is only one instance of site map provider (instance) and is shared to the threads of the web application, this class-level variable is used as a cache service. The BuildSiteMap method method also uses data cache, but only as a way to detect changes in the data in the Categories or Products table. Note that only the current date and time are added to data cache, and the actual site map data is not added to data cache.
The BuildSiteMap method method finally returns the root node of the site map.
The rest of the methods are easy to understand. The BuildSiteMap NodeCore method is used to return the root node. Because BuildSiteMap returns the root node root, the GetRootNodeCore method only returns the return value of the BuildSiteMap method. When the cache barcode is cleared, the OnSiteMapChanged method sets root to null; when root is null, and the next time BuildSiteMap is called, the map site structure will be recreated. Finally, if date and time values are stored in data cache, the CachedDate property returns these values. Page developers can use this property to detect when site map data was recently cached.
Step 7: register NorthwindSiteMapProvider
To use the NorthwindSiteMapProvider site map provider we created in step 6, we need to register in the section of the Web.config file. Specifically, add the following code to the section of the Web.config file:
The above code illustrates the following two facts: first, it indicates that the "built-in" AspNetXmlSiteMapProvider is the default site map provider; second, and it registers the user-defined site map provider we created in step 6 as "Northwind".
Note: for site map providers located in the App_Code folder, the value of the type property is the name of the class. Alternatively, we can use a separate class library project to create a custom site map provider and place its compilation file in the / Bin directory; in that case, the type property becomes "Namespace.ClassName, AssemblyName".
After updating the Web.config file, take some time to log on to any page of this tutorial in the browser, we notice that the navigation interface on the left is the same as before, that is because we use AspNetXmlSiteMapProvider as the default provider, in order to make the navigation user interface use our custom NorthwindSiteMapProvider, we should explicitly specify the use of "Northwind" site map provider, which we will finish in step 8.
Step 8: use a customized Site Map Provider to display site map information
After registering our customized site map provider with the Web.config file, we can add navigation controls to the Default.aspx, ProductsByCategory.aspx, and ProductDetails.aspx pages in the SiteMapProvider folder. First, open the Default.aspx page and enter design mode and drag a SiteMapPath control from the toolbox to the page. The control is located in the navigation area of the toolbox.
Figure 16: add a SiteMapPath control to the Default.aspx page
The SiteMapPath control contains a breadcrumb that displays the location of the current page in the site map. We added a SiteMapPath control at the top of the template page in Chapter 3, template Page and site Navigation.
Take some time to log on to the page in the browser. The SiteMapPath control we added in figure 16 uses the default sitemap provider, which fetches data from the Web.sitemap file, so the breadcrumb is displayed as "Home > Customizing the SiteMap". As shown below:
Figure 17:Breadcrumb uses the default Site Map Provider
To make the SiteMapPath added in figure 16 use our custom site map provider, set its SiteMapProvider property attribute to "Northwind", which is the name we assigned to NorthwindSiteMapProvider in the Web.config file. However, the default site map provider is still used in the designer, but if you log in to the page in the browser, you will see that breadcrumb uses our custom site map provider.
Figure 18:Breadcrumb now uses our customized NorthwindSiteMapProvider
The SiteMapPath control will show a more functional user interface on the ProductsByCategory.aspx and ProductDetails.aspx pages. Add a SiteMapPath control to these two pages and set its SiteMapProvider property to "Northwind". Click the "View Products" link of the Beverages class in the Default.aspx page, and then click the "View Details" link of Chai Tea. As shown in figure 19, breadcrumb shows the current site map node ("Chai Tea") and its parent nodes: "Beverages" and "All Categories".
Figure 19:Breadcrumb now uses our customized NorthwindSiteMapProvider
In addition to SiteMapPath, you can also use other navigation controls, such as Menu and TreeView controls. In the download code of this chapter, the Default.aspx, ProductsByCategory.aspx, and ProductDetails.aspx pages all contain Menu controls (see figure 20). For a more in-depth understanding of the navigation controls and site map architecture in ASP.NET 2.0, please refer to the "Examining ASP.NET 2.0 Site Navigation Features" and "Using Site Navigation Controls" sections of the "ASP.NET 2.0 QuickStarts" series (http://quickstarts.asp.net/QuickStartv20/aspnet/).
Figure 20:Menu control lists all Categories and Products
As mentioned earlier in this tutorial, the site map structure can be accessed through the SiteMap class class, and the following code returns the default provider root SiteMapNode:
SiteMapNode root = SiteMap.RootNode
Since AspNetXmlSiteMapProvider is the default provider, the above code returns the root node defined in the Web.sitemap file. To reference other sitemap provider, use the Providers property attribute of the SiteMap class class, such as:
SiteMapNode root = SiteMap.Providers ["name"] .RootNode
Where name is the name of the user-customized site map provider ("Northwind" for the purposes of this article)
To access a specific site map provider, use SiteMap.Providers ["name"] to get an instance of the provider and convert it to the appropriate type. For example, to show the CachedDate property property of NorthwindSiteMapProvider, use the following code:
NorthwindSiteMapProvider customProvider = SiteMap.Providers ["Northwind"] as NorthwindSiteMapProvider;if (customProvider! = null) {DateTime? LastCachedDate = customProvider.CachedDate; if (lastCachedDate! = null) LabelID.Text = "Site map cached on:" + lastCachedDate.Value.ToString (); else LabelID.Text = "The site map is being reconstructed!" } this is the end of the article on "how to create a custom Database in ASP.NET 2.0". I hope the above content can be of some help to you, so that you can learn more knowledge. if you think the article is good, please share it for more people to see.
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.