文档库 最新最全的文档下载
当前位置:文档库 › c#编程技巧

c#编程技巧

本文由吕宏祥1贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
一、最小化窗口 点击“X”或“Alt F4”时,最小化窗口,如: protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE) { // User clicked close button this.WindowState = FormWindowState.Minimized; return; } base.WndProc(ref m); } 二、如何让 Foreach 循环运行的更快 foreach 是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示: using System; using System.Collections; namespace LoopTest { class Class1 { static void Main(string[] args) { // create an ArrayList of strings ArrayList array = new ArrayList(); array.Add("Marty"); array.Add("Bill"); array.Add("George"); // print the value of every item foreach (string item in array) { Console.WriteLine(item); } } } 你可以将 foreach 语句用在每个实现了 Ienumerable 接口的集合里。如果想了解更多 foreach 的用法,你可以查看.NET Framework SDK 文档中的 C# Language Specification。
在编译的时候,C#编辑器会对每一个 foreach 区域进行转换。 IEnumerator enumerator = array.GetEnumerator(); try { string item; while (enumerator.MoveNext()) { item = (string) enumerator.Current; Console.WriteLine(item); } } finally { IDisposable d = enumerator as IDisposable; if (d != null) d.Dispose(); } 这说明在后台,foreach 的管理会给你的程序带来一些增加系统开销的额外代码。 三、将图片保存到一个 XML 文件 WinForm 的资源文件中,将 PictureBox 的 Image 属性等非文字内容都转变成文本保存, 这是通过序列化(Serialization)实现的, 例子:// using System.Runtime.Serialization.Formatters.Soap; Stream stream = FileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None); SoapFormatter f = new SoapFormatter(); Image img = Image.FromFile("E:\\Image.bmp"); f.Serialize(stream,img); stream.Close(); 四、屏蔽 CTRL-V 在 WinForm 中的 TextBox 控件没有办法屏蔽 CTRL-V 的剪贴板粘贴动作,如果需要一个 输入框,但是不希望用户粘贴剪贴板的内容,可以改用 RichTextBox 控件,并且在 KeyDown 中屏蔽掉 CTRL-V 键,例子: private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.Control && e.KeyCode==Keys.V)
new
e.Handled = true; } ps: 网上摘抄,看了以后感觉不错,以后碰见好的再陆续发布
Tags: dotnet 技术 , c#开发技术 https://www.wendangku.net/doc/8410594133.html, 2.0 中使用 webpart 系列控件 Dot-Net 技术 | 阅读(144) | 评论(0) Oct 29 2005 [此文来源于互联网,牛 C 网只负责收集整理] 在现在的网站设计中, 更强调的是用户的个性化设置, 让用户可以自由的设置符合自己 喜好的页面成为网站开发人员的头号难

题,不过现在看来这个难题微软帮我们解决了。在 https://www.wendangku.net/doc/8410594133.html, 2.0 中新增加了一系列 webpart 控件,可以让用户很方便地对网页的各区域布局进行 调整。在一些 web 应用程序中,如果用户想自定义页面布局,比如一个新闻发布系统,想 让左,中,右三栏的位置进行调换的话,就可以使用 webpart 控件。 下面,我们来看下 https://www.wendangku.net/doc/8410594133.html, 2.0 中 webpart 系列控件的一些基本用法。 首先,在 https://www.wendangku.net/doc/8410594133.html, 2005 中的工具箱中,可以找到如下图所示的 webpart 系列控件,有很 多个,限于篇幅,本文介绍其中的一些重要的控件:
在 webpart 系列控件中,其中的 webpartmanager 控件用于统一管理各 webpart 控件。 而 webpartzone 控件,则是提供了各区域划分,在这些区域中,用户可以往里面放置各式各 样的控件,而当运行的时候,用户可以移动的就是这些 webpartzone 控件所在的区域。 为增强认识,我们先做个简单的例子。 1、首先使用 https://www.wendangku.net/doc/8410594133.html, 2005 beta 2(或者 RC1)新建一个 web 站点, 2、往窗体中拖拉一个 webpartmanager 控件,再建一个 3 列 1 行的表格,分别往每个单 元格里拖拉一个 webpartzone 控件,如下图:
3、往 webpartzone1 中拖拉放一个日历控件,并为这个日历控件选择一个合适的样式 4、切换到代码视图状态,将日历控件的 title 属性改为:today’s date。注意的是,日
历控件本身没有 title 属性, 但当一个控件加入到 webpartzone 区域中去后, 则该控件被自动 包装为 GenericWebPart 类型控件,这些类型的控件有 title 属性。 5、这时,我们可以按 F5 来运行该程序,运行如下图所示,可以看到,区域的右上角有 最小化和关闭,恢复的按钮。
接下来,我们介绍如何在 webpart 系列控件中,使用用户自定义的控件。 1、首先,我们为工程项目增加一个"google.ascx"的控件,并且在 images 目录下,添加 google 那张著名的 logo 图片。 接着, 往窗体中添加一个 2*2 行的表格, 再往其中的一个单元格添加一个 image 图象控 件,指定其图象为 google.gif,再添加一个文本框,一个按钮,如下图所示,其中,括号内 的是该控件的名称:
3、在 btnsearch 按钮的 click 事件中写入如下代码:
Response.Write(Page.IsValid) Dim queryStr As String = HttpUtility.UrlEncode(txtSearch.Text) Response.Redirect("https://www.wendangku.net/doc/8410594133.html,/search?q=" & queryStr) End Sub 4、这时,将写好的 google.ascx 控件,整个拖拉到我们刚才建立好的表格中的中间那个 单元格,如下图所示:
我们并且修改代码如下,修改其名称为 google serach:
<uc1:Google title="Google Search" runat="server" ID="Google1" /> 接下来,F5 运行,可以看到,可以在 googlesearch 所在的 webpart 里进行 google 搜索 了。 同时

,如果觉得 webpart 的那些关闭,恢复,最小化的按钮不大好看,还可以自定义按
钮,比如在 images 目录下,添加下面的图片:
然后,在 webpartzone1 的属性中,指定如下的属性就可以了。
CloseVerb.ImageUrl="Images/CloseVerb.gif" EditVerb.ImageUrl="Images/EditVerb.gif" MinimizeVerb.ImageUrl="Images/MinimizeVerb.gif" RestoreVerb.ImageUrl="Images/RestoreVerb.gif" 使 webpart 动起来 上面设计的 webpart 还没能动起来,要让 webpart 动起来的话,必须要将 webpar 设置 为 design display 模式。先为 webpart 添加下面的 radiobutton 选择框
<asp:RadioButtonList ID="rblMode" runat="server" AutoPostBack="True"> <asp:ListItem>Browse Display Mode</asp:ListItem> <asp:ListItem>Design Display Mode</asp:ListItem> </asp:RadioButtonList> 并且在 code-behind 的代码中,写入如下代码:
Protected Sub RadioButtonList1_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles rblMode.SelectedIndexChanged Select Case rblMode.SelectedIndex Case 0 : WebPartManager1.DisplayMode =WebPartManager.BrowseDisplayMode Case 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode End Select End Sub 运行上面代码,选择 design display mode,则可以象下图那样,自由拖动 webpart,
要注意的是,当移动各 webpart 的位置后,即使关掉浏览器,下次重新打开时,依然可 以看到各个控件保持原来的位置。其实,https://www.wendangku.net/doc/8410594133.html, 2.0 是使用在 aspnetdb.mdf 中的一个叫 aspnet_PersonalizationPerUser 的表来保存数据的,表的结构如下所示: Field Value
Id 928e121a-4042-4fb4-9520-21210b9b37c1 PathId 7c3b5dc0-04d0-48a2-bbb2-2b70286f22fe UserId 9bff14df-024f-4bda-9a0a-b4a19ab9e387 PageSettings <Binary data> LastUpdatedDate 10/06/2005 4:44:05 AM
如果想恢复各控件的原来位置, 只需要将该数据表中相应的行删除掉就可以了。 但有个 问题是, 如果使用每一个 webpart 的关闭按钮, 则很难再将其恢复 (当然删除数据表中的行, 但十分麻烦) 。在 https://www.wendangku.net/doc/8410594133.html, 2.0 中,提供了另一种 webpart,叫做 catlogzone 控件,下面介绍其 用法: 1、往窗体中拖拉一个 catlogzone 控件,如下图所视。
2 、 往 该 catlogzone 控 件 区 域 中 , 再 拖 放 三 个 webpart 系 列 的 控 件 , 分 别 是 DeclarativeCatalogPart, PageCatalogPart, and ImportCatalogPart , 如 下 图 所 示 。 其 中 , DeclarativeCatalogPart 控件的作用是,显示目前页面上有哪些可以用的 webpart 控件; PageCatalogPart 的作用是,可以让用户通过勾选的方式,选定将哪些控件添加转移到其他 webpart 区域中去。ImportCatalogPart 则可以通过外部磁盘文件的方式,加载其他做好了的 webpart 部件。
3、在 radiobutton 区域中,修改以下代码,增添一个 catalog display 的显示模式


<asp:RadioButtonList ID="rblMode" runat="server" AutoPostBack="True"> <asp:ListItem>Browse Display Mode</asp:ListItem> <asp:ListItem>Design Display Mode</asp:ListItem> <asp:ListItem>Catalog Display Mode</asp:ListItem> </asp:RadioButtonList> 然后,在 code-behind 的代码中,将代码修改为如下:
Protected Sub rblMode_SelectedIndexChanged( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles rblMode.SelectedIndexChanged Select Case rblMode.SelectedIndex
Case 0 : WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode Case 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode Case 2 : WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode End Select End Sub 4、在 DeclarativeCatalogPart 任务菜单上,点击右上角的智能感知按钮,然后选"edit templates"的链接,进入模版编辑状态,如下图:
再往其中的 webpartstemplate 区域中拖拉一个 google.ascx 控件,如下图,这将允许用 户在运行时,可以自由地往页面增加这样的 google 搜索控件。
5、然后修改代码如下:
<ZoneTemplate> <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1" runat="server"> <WebPartsTemplate> <uc1:Google title="Google Search" ID="Google2" runat="server" /> </WebPartsTemplate> </asp:DeclarativeCatalogPart> 6、运行程序,可以看到,当选择 catalog display mode 时,会显示如下图所示的 catalog zone,其中列出了当前可用的有哪些 webpart 控件,我们可以把这个 google 的控件加到其他 的 webpart 区域,也可以尝试将已经存在的 webpart 控件关闭,然后在 catalog zone 区域中 的控件列表中,把它们再加回到页面中去。
此外,在运行期间,还可以动态地修改 webpart 控件的外观等属性,如下: 1) 往窗体中添加一个 editor zone 的区域控件,往其中再拖放一个 appearanceEdiotrPart 控件,该控件可以在运行时,让用户动态改变各 webpart 控件的属性。
2) 我们再修改 radiobutton 选择框的代码如下,则加一个编辑模式:
<asp:RadioButtonList ID="rblMode" runat="server" AutoPostBack="True"> <asp:ListItem>Browse Display Mode</asp:ListItem> <asp:ListItem>Design Display Mode</asp:ListItem> <asp:ListItem>Catalog Display Mode</asp:ListItem> <asp:ListItem>Edit Display Mode</asp:ListItem> </asp:RadioButtonList> 3) 修改 code-behind 代码如下:
Protected Sub rblMode_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles rblMode.SelectedIndexChanged Select Case rblMode.SelectedIndex Case 0 : WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode Case 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode Case 2 : WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode Case 3 : WebPartManager1.DisplayMode = WebPartMa

nager.EditDisplayMode End Select End Sub 4) 运行程序,选择 edit display mode 模式,这时,会发现每个控件的右上角,会多了一 个"edit"的按钮,点该按钮,弹出如下图的窗体,用户可以修改每个控件的外观等属性。
最后,我们看下,webpart 控件之间还可以进行相互之间的通信,下面的例子中,要实 现的是,在一个日历控件中点选某一个日期,会在已经做好的 googlesearch 的 webpart 控件 的文本框中显示其日期,达到通信的目的,下面介绍其实现步骤: 1、为了使两个 webpart 控件之间进行通信,必须先声明一个公共的接口。往工程项目 里增加一个叫 ISelectedDate.vb 的类文件,放在 app_code 目录下,写入如下代码:
Imports Microsoft.VisualBasic Public Interface ISelectedDate ReadOnly Property SelectedDate( ) As Date End Interface 这里,我们返回一个只读的日期属性 selectedDate. 2、再创建一个日历控件 CalendarUC.ascx,其中拖拉一个普通的日历控件即可。然后写 入如下代码:
Partial Class CalendarUC_ascx Inherits https://www.wendangku.net/doc/8410594133.html,erControl Implements ISelectedDate Public ReadOnly Property SelectedDate( ) As Date Implements ISelectedDate.SelectedDate Get Return Calendar1.SelectedDate.Date End Get End Property <ConnectionProvider("SelectedDate", "SelectedDate")> _ Public Function GetSelectedDate( ) As ISelectedDate Return Me End Function End Class 上 面 的 代 码 , 首 先 实 现 了 已 经 声 明 了 的 IselectedDate 接 口 , 要 留 意 的 是 < ConnectionProvider("SelectedDate", "SelectedDate")>中的写法。由于在这个例子中,日历控 件要为其他的控件提供信息,因此,该日历控件是一个 provider(提供者),而另外的接收信 息的控件,是 consumer(消费者)。而两者为了要通信,必须要提供一个通信接入点,就象一 个 电 插 头 , 要 找 到 合 适 的 电 插 板 一 样 。 因 此 , < ConnectionProvider("SelectedDate", "SelectedDate")>中的第一个参数,定义了两者的接口点,第二个参数,则是要传递给 consumer 的参数,本例是 selectedDate。 3、接下来,我们在已经做好的 google.ascx 控件的代码中,编写如下代码:
Private _selectedDate As ISelectedDate <ConnectionConsumer("SelectedDate", "SelectedDate")> _ Sub setSearchText(ByVal SearchText As ISelectedDate) Me._selectedDate = SearchText End Sub Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender If _selectedDate IsNot Nothing Then txtSearch.Text = _selectedDate.SelectedDate.ToShortDateString End If End Sub 可 以 看 到 < ConnectionConsumer("SelectedDate", "SelectedDate") > 的 定 义 必 须 和
provider 中的定义一样。 4、再修改如下代码,将两个控件的命名变得通俗易懂
<ZoneTemplate> <uc1:Google title="Google Search" r

unat="server" ID="Google1" /> <uc3:CalendarUC title="Calendar Web Part" runat="server" ID="CalendarUC1" /> </ZoneTemplate> 5、最后,为了使两者能互相通信,必须在 default.aspx 页中修改如下代码:
<asp:WebPartManager ID="WebPartManager1" runat="server"> <StaticConnections> <asp:WebPartConnection ID="Connection" ProviderID="CalendarUC1" ProviderConnectionPointID="SelectedDate" ConsumerID="Google1" ConsumerConnectionPointID="SelectedDate" /> </StaticConnections> </asp:WebPartManager> 6、在页面代码中,增加一个 radiobutton,用作显示 connection 模式,并写入如下代码:
Case 4 : WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode 7、运行程序,选择 connect displaymode 模式。再选择 GOOGLE SEARCH 的那个 webpart 控件,点右上角的"conenct"按钮,此时,会显示如下图所示,提示你要选择从那个控件中得 到信息,这里选择日历控件,按确定。那么,当点选日历控件的某个日期值的时候,GOOGLE SEARCH 的那个文本框里,就会显示相应的日期了。
小结: 本文主要介绍了在 https://www.wendangku.net/doc/8410594133.html, 2.0 中,如何使用基本的 webpart 系列控件,以达到改变页面 布局以及如何使页面的各 webpart 控件相互之间通信。 Tags: dotnet 技术 , c#开发技术 用 C#与 XML 创建动态分层菜单 Dot-Net 技术 | 阅读(164) | 评论(0)
Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] Author:unknown From:Internet 从在复杂的 B2B 交易中的交换数据到为应用程序提供配置文件结构,XML 在许多方面 大显身手! 由于 XML 不断地获得软件的支持, 我们完全能够预见: XML 的应用将不断增加。 本文就介绍这样一种应用程序, 它使用 XML 创建类似于 Windows 开始菜单的分层菜单系统, 从而向终端用户提供更满意的 Web 体验。 这个应用程序将使用 C#、XML 和服务器端 Microsoft .Net 框架,创建一个 DHTML 结 构,IE4 或更高版本的浏览器可以操作它并在客户端动态显示。由于我们可以快速地访问服 务器上的 XML,并且 XML 能够描述层次之间的关系,因此它成为标记“父/子菜单”数据的 一个最佳选择。
(一个三层菜单系统,可点击放大) 除了学习如何使用 XML 创建一个菜单应用程序外,我们还要介绍 .Net 框架的主要 XML 类,它们位于 System.Xml 集合中。 什么是.Net 集合(Assembly) 要在 C# 文件中使用 XML, 就必须引用一个特定的名称空间。 .Net 平台中的一个名称 空间是作为一个程序组件的组织系统使用的, 它对于解决命名冲突很重要, 这一点很象 XML 中的 名称空间。这个基于 XML 的菜单系统是用位于 System.Xml 集合中的 System.Xml 名称 空间创建的。.Net SDK 是这样定义集合的:一个集合就是一个类型和资源的汇集信息,这

些 类和资源一起使用,形成一个功能的逻辑单元,即一个“逻辑”dll。 一个集合需要许多物理文件,如界面、类、资源文件等等,并且创建了关于文件如何 一起工作的元数据。集合中还可能包含版本及安全信息。集合有许多好处,其中之一就是可 以在 https://www.wendangku.net/doc/8410594133.html, 应用程序中使用,而无须用 regsvr32.exe 向注册文件中增加一个类识别号 (CLSID) 。这样以来,集合的升级操作与将适当的集合复制到一个 https://www.wendangku.net/doc/8410594133.html, 应用程序的 bin 目录中一样简单。 现在我们就来仔细看一看那些建立在 System.Xml 名称空间和集合中的类。 如果你以前使用过 Microsoft 的 MSXML3 分解器,就会发现使用 System.Xml 集合中的 类相当简单。这里的菜单应用程序只使用了这些主要集合类中的一部分:XmlNode、 XmlDocument、 XmlNodeList、 XmlNamedNodeMap、 DocumentNavigator、 XmlTextReader 和 XmlTextWriter。
XmlDocument、 XmlNodeList 和 XmlNode 类用来创建传递给客户端浏览器的菜单应用 程序的结构。用 XmlDocument 类以一种安全线程(thread-safe)的方式从服务器上装载和分 解本地或远程 XML 文档。建立在一个字符串中的 XML 标记也可以被装载或分解,从而在 一个文档中创建、移动节点或取消节点的移动。XmlNodeList 类可以使我们列举一个节点的 集合来访问一个特定属性,如名称、值或名称空间。最后,XmlNode 类可以用来在 XML 文 档中向一个用于检验的 XmlNode 对象分配一个特定节点。 XmlNamedNodeMap 类 用 来 列 举 建 立 在 一 个 元 素 类 型 选 择 中 的 属 性 集 合 。 DocumentNavigator、 XmlTextReader 和 XmlTextWriter 类提供与 XML 一起使用所需要的额外 功能。要特别说明的是,DocumentNavigator 可以用来执行 XPath 查询,它被包含在 XSLT 转 换中。XmlTextReader 类提供对 XML 节点的只向前(forward-only) 、无缓存的访问,从而使 XML 节点对大型 XML 文档也同样生效。 XmlTextWriter 类提供一个快速、 只向前的指针模型, 实现将 XML 内容写到一个流或一个文件中的目的。 在菜单应用程序中使用的 XML 文档相对来说是较小的, 因此我们可以在服务器端使用 文档对象模式(DOM)来存取 XML 文档中的不同节点。当分解大型 XML 文档时,就需要使 用 XmlTextReader 类所含有的只向前模型。 XML 代码 菜 单 应 用 程 序 使 用 了 3 个 XML 文 档 : menuItems.xml 、 menuItems2.xml 和 menuItems3.xml, 它们用于标记单独的菜单项目。 的处理和操作由一个叫做 xmlMenus.dll XML 的集合完成, 这个集合被服务器端的一个 https://www.wendangku.net/doc/8410594133.html, 文件 createMenus.aspx 所使用。 在客户端 的动态 HTML (DHTML)内容使用了一个层叠格式表文件和一个 JavaScript 文件, 这些文件联合 在一起生成了本文开始部分的图示结果

。 我们在 List 1 的代码显示了用来标记单独菜单项目的 XML 文档的一部分。 文档中的主元素命 名为 menuItem,它可以包含一个名字和超级链接元素以及额外的 menuItem 子元素。这种 关系可以用来创建包含子菜单的菜单系统,就象 Windows 的开始菜单一样。 由于 XML 已经标出了分层关系,因此就可以利用循环在不同元素之间行走:当使用 XmlDocument、XmlNode 和 XmlNodeList 类创建子节点时,我们可以反复调用 WalkTree() 函 数以颠倒父/子关系。其它的类如 ArrayList 和 StreamWriter 用于将相关菜单归类到数组中, 然后在适当时间将所生成的菜单结构写入一个文件中。 XmlMenus 集合的代码开始时要声明一个 XmlHierMenu 名称空间,接下来要引用 System、 System.Xml、 System.Collections 和 System.IO 名称空间: using System; using System.Xml; using System.Collections;
using System.IO; 在这部分代码之后要创建 3 个构造器。 一个构造器不接收变量, 只对变量进行初始化。 下一个构造器接收一个图象文件的定制路径。最后一个构造器在不经常对 XML 菜单进行刷 新的情况下, 允许将由集合生成的输出存储到一个文件中。 最后一个构造器所生成的文件可 以被静态地包含在一个 https://www.wendangku.net/doc/8410594133.html, 文件中,而不是在各个 Web 页面请求时随时地生成。 在构造器之后,开始定义 CreateMenu()方法,具体请看 List 2 中的代码。 这个方法负责进行 XML 文档的装载和解析, 找到根节点, 然后在根的子节点之间循环。 如果发现一个子节点本身还有子节点,就调用 WalkTree() 方法,并且把这些子节点都传递 到其中。如果这些子节点还有子节点,就再次调用 WalkTree()。这个过程循环进行直到不再 发现增加的子节点。Walktree()方法的代码可以参看 List 3。 在调用 WalkTree()方法并且对不同的节点进行分析的同时,要解析 menuItem 节点, 将来自其超级链接和名字节点的数据放在数组列表中。对整个 XML 文档都进行解析之后, 数组列表的内容就被传递回调用的 https://www.wendangku.net/doc/8410594133.html, 的页面,然后使用 Response 对象写出信息。从 这时起,客户端的 JavaScript 代码就开始控制 DHTML 菜单了。 在服务器端,我们使用一个 https://www.wendangku.net/doc/8410594133.html, 页面来开始菜单的创建过程。这个页面输入了与 集合相关联的名称空间 XmlHierMenu: <%@ page language="C#" %> <%@ Import Namespace="XmlHierMenu" %> 然后,将样式表文件和 JavaScript 文件包含在文件的 代码区中。最后,在 https://www.wendangku.net/doc/8410594133.html, 页 面底部的代码用来引用上面提到的 CreateMenu() 方法与 WalkTree()方法,请看 List 4。 在 https://www.wendangku.net/doc/8410594133.html, 页面中所找到的 C# 代码只是建立了到不同的 XML 文档的路径,并且对 XmlMenu 类进行了例示。一旦对这个类进行了例示,就对 CreateMenu()方法进行调用

。这 个方法接收菜单名以及到这个菜单的 XML 文档的文件路径。在本例中,要创建 3 个名为 menu1、 menu2 和 menu3 的菜单,然后在一个 https://www.wendangku.net/doc/8410594133.html, 页面中使用。这个应用程序在一 个给定页面中可以支持无穷多的菜单, 但是我们建议菜单数目不要过多, 因为每增加一个菜 单,发送到客户端的文件规模都会增加。 编译 C# 文件 现在我们已经看到了菜单应用程序的结构,接下来讨论一下使用哪些开关可以将 C# 文件编译到一个集合中。在 .Net SDK 文档中,我们可以查询到一个所有编译开关的完整列 表。 要想正确地编译 C# 文件以使它能用于一个 https://www.wendangku.net/doc/8410594133.html, 页面中,编译器就必须要知道包
含了 System.Xml 集合。这可以通过使用 /r 开关并在后面加上到集合的完整路径来完成。 由于将要创建的 dll 是一个库,因此就必须指定 /t 开关,这样编译器就不再寻找一个静态 的 Main() 方法。最后一个需要的开关是 /out ,它将告诉编译器输出的文件名是什么,以 及将其放在哪里。 所有对 C# 编译器的调用都以 csc (C# 编译器)开始,然后指定适当的开关。编译 器语法的最后一部分包括到已创建的 .cs 文件的路径。请看下面的编译文件的完整语法格 式: C:\>csc /r:System.Xml.dll / t:library /out:d:\inetpub\wwwroot\ xml\bin\xmlMenus.dll d:\inetpub\ wwwroot\xml\menus\xmlMenus.cs 这行命令告诉编译器包含 System.Xml 集合、将文件作为一个库进行编译、将文件输 出到 bin 目录中、输入文件命名为 xmlMenus.cs,输出文件名叫 xmlMenus.dll。当输入回车 键后,.cs 文件就进行编译,生成的 dll 将被放置在适当的文件夹中。 结束语 本文通过讲解一个应用程序的思路及实现代码, 使我们对于使用 Microsoft .Net 平台中 的一些集合和类有了一个很好的了解。随着进一步的学习,我们将看到,还会有其它一些集 合和类可以以多种方式与本地和远程 XML 文档一起工作。
Tags: dotnet 技术 , c#开发技术 C#语言函数参数的传递 Dot-Net 技术 | 阅读(118) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] 就像 C 语言众多的后世子孙一样,C#的函数参数是非常讲究的。首先,参数必须写在 函数名后面的括号里, 这里我们有必要称其为形参。 参数必须有一个参数名称和明确的类型 声明。 该参数名称只在函数体内部可见。 因此在该函数体以外的任何地方使用同样的变量名 是不会引起冲突的。每当调用函数的时候,必须将一个实参传递给函数定义中的形参。默认 情况下,C#的参数传递是值传递。这种方式的优点和缺点同样明显。另外,在传送引用类型 的时候还时不时引起一些小误会。更加使人困惑的是,既然 CLR 不支持指针类型

,那么我们 以前在 C/C 中的那些关于指针传递的妙用应该如何实现呢?不必发愁,本文将会逐一回答 上述这些疑问。 首先我们会讨论默认情况下的值传递以及这种方式的优缺点, 解释默认情况
下传递引用类型时容易产生的误解。然后,我们讨论如何利用 ref 关键字把一个值类型作为 引用类型传递给参数。最后,我们尝试着让一个函数可以返回多个值,在 C/C 中我们经常 利用指针达到这一目的,这里我们将会利用 out 关键字重温这种美妙的感觉。 值传递 每当调用一个函数的时候, 我们就必须为该函数的每一个形参传递一个实参。 默认情况 下,采用值传递的机制。也就是说,实参的值会被拷贝到形参里面,这样我们在函数内部得 到一个本地变量, 该变量的值和传递进来的那个实参的值相等, 但是它们存放在不同的存储 空间。因此,我们对函数参数所做的一切实际上都是对函数提内本地变量的操作,绝对不会 影响到作为实际参数传递过来的那个函数体外的变量。 看下面的例子, 我就不再多费口舌了。 using System; namespace CS 语言函数参数的传递 { /// /// Class1 的摘要说明。 /// class Example { static void Main(string[] args) { int argument = 5; Example exp = new Example(); System.Console.WriteLine(argument); exp.fun1(argument); System.Console.WriteLine(argument); } public Example() { } public void fun1(int parameter) { //对 parameter 的操作实际上是对本地变量的修改 //不会影响到函数体外作为实参传递过来的变量 parameter = 5; System.Console.WriteLine(parameter); }
} } 但是值传递的机制有一个明显的缺点。 主要表现在值类型的传递方面。 我们对参数的修 改会在函数体执行结束之际消失。 如果我们希望将这种变化影响到作为实参传递过来的那个 函数体以外的变量就必须把值类型作为引用类型传递。 后边会具体讨论。 值传递机制的另一 个缺点,或许你会认为这是一个优点,表现在引用类型的传递方面。按照值传递的机制传递 一个引用类型的变量, 实际上只是完成了一次浅拷贝。 请不要误认为对整个对象进行了深拷 贝。函数参数得到的只是实参的 handle 的值。也就是说,本地的参数实际上只是一个引用 类型的 handle, 和作为实参传递过来的那个变量的 handle 具有相同的值, 指向同一个 object (两个 handle 指向堆上的相同位置) 这样我们在函数内部对参数所做的修改会直接影响到 。 堆上的 object。当函数结束之后,本地的参数消失,而对于堆上的 object 的修改会成为持久 的修改而继续保留下来。 把值类型作为引用类型传递 有一些时候,我们不惜望函数对于参数的修改随着函数的结束而消失。作为

引用类型, 作到这一点其实一点都不难,就像我们上面说的那样。但是,如果是值类型的参数,似乎就 有一点麻烦了。从前在 C/C 里面可以采取传递指针的方法来达到这个目的。但是 CLR 已经 明确取消了指针。作为补偿,C#为我们提供了 ref 关键字。ref 关键字通知编译器,参数的实 参是作为引用类型而非值类型进行传递。下面的这段程序帮助我们说明问题。 using System; namespace CS 语言函数参数的传递 { class Example { static void Main(string[] args) { int argument = 5; Example exp = new Example(); //首先显示 argument System.Console.WriteLine(argument); exp.fun2(ref argument);//传递参数时必须使用 ref 关键字 System.Console.WriteLine(argument); System.Console.ReadLine(); } public void fun1(int parameter) { //对 parameter 的操作实际上是对本地变量的修改
//不会影响到函数体外作为实参传递过来的变量 parameter = 5; System.Console.WriteLine(parameter); } public void fun2(ref int parameter) { parameter = 5; System.Console.WriteLine(parameter); } } } 函数 fun2 要求一个 int 类型的参数,并且伴有关键字 ref。在 Main()函数内定义了一个 整形变量 argument,它将会作为实参传递给函数 fun2()。在调用该函数之前,首先显示了变 量 argument,其值等于 5。紧接着调用函数 fun2(),并且传递 argument 给参数 parameter。 这时函数得到的是一个本地的, 指向整形变量 argument 的 handle。 在函数内部, parameter 把 加 5,然后显示它。这时其值为 10。函数返回后再一次显示 argument,其值同样为 10。 让函数返回多个返回值 有些时候我们可能会希望一个函数可以返回多个返回值。 事实上, 这是不可能的因为一 个函数只能返回一个返回值。但是我们确实办法达到这种效果。最简单的是下面这种方法。 public int fun3(ref int i, int j) { i = j; return i } 我们这样调用这个函数。 int i; int sum = exp.fun3(ref i, 10); System.Console.WriteLine(i); System.Console.WriteLine(sum); 这样在执行过函数 fun3()之后,我们实际上得到了 i 的值和 i j 的值。实际上起到了利 用一个函数返回两个值的作用。另外有一个关键字也是非常重要的。那就是 out 关键字。该 关键字允许向参数传递一个没有分配空间的引用类型。 利用这个关键字同样可以达到返回多 个值的目的。 public void fun4(ref int i, out object obj) j;
{ i =5; obj = i.ToString(); System.Console.WriteLine(i); System.Console.WriteLine(obj); } 上面这个方法要求两个参数。 第二个参数要求一个 object 类型的变量。 该参数前面有一 个 out 关键字。编译器会认为该参数的实参没有被分配存储空间。Out 参数在未被赋值之前 不能使用。可以这样调用该函数: int i = 5; object obj; exp.fun4(ref i, out obj); Sys

tem.Console.WriteLine(i); System.Console.WriteLine(obj); 输出为 4 个 10。说明我们在调用该函数之后得到了变量 i 和 obj 两个变量的值。
Tags: dotnet 技术 , c#开发技术 使用 C#语言操作 ADO 数据库 Dot-Net 技术 | 阅读(125) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] 访问数据库是大多数应用程序的一部分,而且随着 C#和 https://www.wendangku.net/doc/8410594133.html, 的发布,这个过程已经 变得相当的简单.本文将展示下面四个基本的数据库操作: 1.读数据.这包括诸如整数,字符串和日期等不同的数据类型. 2.写数据.就象读数据一样我们会写这些通常的数据类型.这是通过 SQL 语句来实现的. 3.更新或是修改数据.我们还是使用简单 SQL 语句. 4.删除数据.使用 SQL.
这些操作是对一个微软 Access 2000 数据库进行的,但是 SQL 或是其它 ADO 数据源可以 通过简单的改变连接字符串来使用. 开始第一步 为了使用 ADO 类,我们需要包括进 https://www.wendangku.net/doc/8410594133.html, 命名空间(namespace)和一些精巧的日期类. 在你要进行数据库操作的地方加入下列几行代码.它应该被放置在命名空间引入代码行的下
面而在类定义的上面. using System.Data; // 申明变量 using System.Data.ADO; // 数据库 using System.Globalization; // 日期 根据你所参与的工程的类型,你可能需要增加对 System.Data 命名空间的引用.你可以根 据在你添加上面的代码以后编译器是否产生错误来判断.要添加 System.Data 命名空间,你可 以: 1.在 Solution explorer-References 分支中右键单击. 2.选择"添加引用" 3.选择.NET Framework 标签. 4.双击 System.data.dll 条目 5.单击 OK 6.System.Data 现在应该出现在了 Solution explorer 的引用列表中了. 因为连接字符串在大多数操作中都要使用,所以我建议你将它设置成你要编写的类的成 员.注意:在你的程序中,数据库文件的路径有可能不同. //属性 public const string DB_CONN_STRING = "Driver={Microsoft Access Driver (*.mdb)}; " "DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb"; 读数据 现在一切都变得有趣起来.读数据可以通过 ADODataReader 类来实现.(参看 Chris Maunder 的文章"https://www.wendangku.net/doc/8410594133.html, ADODataReader 类"来获取关于这个类的更多信息.)读数据的步骤 如下: 1.我们用 ADOConnection 来打开一个数据库. ADOConnection conn = new ADOConnection(DB_CONN_STRING); conn.Open(); 2.我们编写一个 SQL 语句来定义将要取出的数据.这个数据执行的结果是返回一个 ADODataReader 对象.注意 Execute 方法中的 out 关键字.这在 C#中意味着通过引用传递参数. ADODataReader dr; ADOCommand cmd = new ADOCommand( "SELECT * FROM Person", conn ); cmd.Execute( out dr);
3.我们循环遍历 ADODataReader 中的每一个记录直到我们完成要做的工作.注意:数据被 直接作为一个字符串返回同时数据域名称用来指明读的数据域. whil

e( dr.Read() ) { System.Console.WriteLine( dr["FirstName"] ); } 4.我们收工 但是,作为好的程序员我们还需要加进许多 try/catch/finally 语句来确保我们处理了所有 的错误. try { …… 数据库操作 …… } catch( Exception ex ) { System.Console.WriteLine( "READING:" ); System.Console.WriteLine( " ERROR:" ex.Message ); System.Console.WriteLine( " SQL :" sSqlCmd ); System.Console.WriteLine( " Conn.:" DB_CONN_STRING ); } finally { // 关闭连接 if( conn.State == DBObjectState.Open ) conn.Close(); }
读取不同的数据类型 dr["stuff"]这个语句通常能够返回一个数据.但是要返回一个 int 或者 DateTime 对象的话通常 需要进行数据转换.这通常可以通过使用 ADODataReader 许多内建转换器中的一个来实现.也 就是: int nOrdinalAge = dr.GetOrdinal( "Age" ); int nAge = dr.GetInt32( nOrdinalAge ); DateTime tUpdated = (DateTime)dr["Updated"];
注意 GetOrdinal 定位数据域用名字来读取数据的用法.如果数据域是空白的(还没有填入 任何数据),上面的代码会抛出一个异常.要捕捉这种情况,我们可以用 IsNull 方法检查是否有 数据存在,如下所示: int nOrdinalAge = dr.GetOrdinal( "Age" ); if( dr.IsNull( nOrdinalAge ) ) { System.Console.WriteLine( " Age : Not given!" ); } else { int nAge = dr.GetInt32( nOrdinalAge ); System.Console.WriteLine( " Age : " nAge ); }
插入,修改,删除和其他 SQL 命令 插入,修改,删除过程可以非常容易的通过 SQL 语句来实现.下面的代码执行一条 SQL 命令 来插入一条记录. // SQL 命令 String sSQLCommand = "INSERT INTO Person (Age, FirstName, Description, Updated) " "VALUES( 55, 'Bob', 'Is a Penguin', '2001/12/25 20:30:15' );"; // 创建 command 对象 ADOCommand cmdAdder = new ADOCommand( sSQLCommand, DB_CONN_STRING); cmdAdder.ActiveConnection.Open(); // Execute the SQL command int nNoAdded = cmdAdder.ExecuteNonQuery(); System.Console.WriteLine( "\nRow(s) Added = " nNoAdded "\n" ); 注意:try/catch 代码没有在上面的例子里出现,但是应该包括上面的代码. 插入 上面的代码通过建立一个 SQL 命令然后执行它来插入一条记录.一些在编写 SQL 命令时 应注意的事项如下: 1.数值数据应该直接表示.没有单引号(').
2.字符串的表示应该包括在单引号中('blah'). 3.确保字符串中不包含任何嵌入的单(双)引号.这会使事情混淆. 4.日期和时间数据用包裹在单引号中的国际通用形式来表示 ('YYYY/MM/DD HH:MM:SS'). 修改 UPDATE 命令指明要修改的数据和修改的动作.ExecuteNonQuery()的返回值指出改变的 记录的个数,所以如果有 5 个 Peter's 在表单中的话下面的代码将返回 5. String sSQLCommand = "UPDATE Person SET Age = 27 WHERE FirstName = 'Peter'"; 删除 DELETE 命令指明要删除的记录.ExecuteNonQuery()的返回值指出改变的记录的个数,所 以如果有 2 个 Bobo 在表单中的话下面的代码将返回

2.两个 Bobo 都会被删除. String sSQLCommand = "DELETE FROM Person WHERE FirstName = 'Bobo'"";
Tags: dotnet 技术 , c#开发技术 C#中一些字符串操作的常用用法 Dot-Net 技术 | 阅读(132) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] //获得汉字的区位码 byte[] array = new byte[2]; array = System.Text.Encoding.Default.GetBytes("啊"); int i1 = (short)(array[0] - ''\0''); int i2 = (short)(array[1] - ''\0''); //unicode 解码方式下的汉字码 array = System.Text.Encoding.Unicode.GetBytes("啊"); i1 = (short)(array[0] - ''\0''); i2 = (short)(array[1] - ''\0''); //unicode 反解码为汉字 string str = "4a55";
string s1 = str.Substring(0,2); string s2 = str.Substring(2,2);
int t1 = Convert.ToInt32(s1,16); int t2 = Convert.ToInt32(s2,16); array[0] = (byte)t1; array[1] = (byte)t2; string s = System.Text.Encoding.Unicode.GetString(array);
//default 方式反解码为汉字 array[0] = (byte)196; array[1] = (byte)207; s = System.Text.Encoding.Default.GetString(array); //取字符串长度 s = "iam 方枪枪"; int len = s.Length;//will output as 6 byte[] sarr = System.Text.Encoding.Default.GetBytes(s); len = sarr.Length;//will output as 3 3*2=9 //字符串相加 System.Text.StringBuilder sb = new System.Text.StringBuilder(""); sb.Append("i "); sb.Append("am "); sb.Append("方枪枪"); ///////////////////////////////////////////////////////////////////// string --> byte array byte[] data=Syste.Text.Encoding.ASCII.GetBytes(string); string --> byte byte data = Convert.ToByte(string); byte[]-->string string string = Encoding.ASCII.GetString( bytes, 0, nBytesSize );
Tags: dotnet 技术 , c#开发技术 https://www.wendangku.net/doc/8410594133.html, 性能优化 Dot-Net 技术 | 阅读(112) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] (一).选择会话状态存储方式 在 Webconfig 文件配置: https://www.wendangku.net/doc/8410594133.html, 有三种方式存储会话状态信息: 1. 存储在进程中: 属性 mode = InProc 特点: 具有最佳的性能,速度最快,但不能跨多台服务器存储共享. 2. 存储在状态服务器中: 属性 mode = "StateServer" 特点: 当需要跨服务器维护用户会话信息时,使用此方法。但是信息存储在状态服 务器上,一旦状态服务器出现故障,信息将丢失 3. 存储在 Sql Server 中: 属性 mode="SqlServer" 特点: 补充一点: I. 由于某些页面不需要会话状态,则可以将会话状态禁用: 代码如下: <%@ Page EnableSessionState="false" %> II.如果页面需要访问会话变量但不允许修改它们,可以设置页面会话状态为只读: 代码如下: <%@ Page EnableSessionState="false" %> 使用时可以根据具体情况选择某种方式 (二).使用 Page.IsPostBack Page.IsPostBack 表示是否是从客户端返回的. 初次运行时,不是从客户端返回,它的值 工作负载会变大,但信息不会丢失.
为 false,当触发页面上的事件或刷新页面时,Pa

ge.IsPostBack 由于是回发的,值变为 true; 一般在: Page_Load 方法中用: private void Page_Load(Object sender,EventArgs e) { if(!Page.IsPostBack) { ……; //初始化页面的代码。这些代码第一次页面初始化时执行,当第二次回 发时, //不会再执行。提高效率。 } } 往往很多时候不得不用 IsPostBack, 因为有些控件初始化后,要保持它的状态. 例如: DropDownList,如果每次都初始化,则用户无论选择其选项,都会被初始化为默认 值. (三).避免使用服务器控件 1.一般的静态显示信息,尽量不要用服务端控件显示. 因为服务端控件需要回发服务端 执行,会降低程序执行效率,一般用
显示即可. 如果用了服务端控件,将: runat="server" 去掉,也会提高效率. 2.禁用服务端控件的状态视图,有些控件不需要维护其状态,可以设置其属性: EnableViewState=false; 如果整个页面控件都不需要维持状态视图,则可以设置整个页面的状态视力为 false: 代码如下: <%@ Page EnableViewState="false"%> 3.在 Web.Config 文件中配置: https://www.wendangku.net/doc/8410594133.html, Sessionss 可以在 Web.config 或 Machine.config 中的 Sessionsstate 元素中 配置。 下面是在 Web.config 中的设置的例子: (四).避免使用 DataGrid 大家都知道 DataGrid 功能强大。 但是功能强大的同时,增加了性能上的开销。 一般 用其它控件: DataList 或 Repeater 控件能实现的,尽量不用 DataGrid.
(五).字符串操作 1.避免装箱操作. 装箱操作运行效率比较低. 例如运行两个代码段: string test=""; for(for int i=0;i<10000;i ) { test = test i; } 和 string test=""; for(for int i=0;i<10000;i ) { test = test i.ToString(); } 下面的代码段显然效率要高.因为 i 是整型的,系统要先把 i 进行装箱转换为 string 型的,再进行连接. 需要时间,读者可以 Copy 到自己机器上测试一下. 2.使用 StringBulider 类 在进行字符串连接时: string str = str1 str2 ……;
一般超过三项连接, 最好用 StringBuilder 来代替 String 类. StringBuilder 可以避免重 新创建 String 对象造成的性能损失. 一般用于组装 Sql 语句时用到: StringBulider.读者可以到自己机器上测试一下. (六)https://www.wendangku.net/doc/8410594133.html, 使用方面优化 1.数据库连接打开和关闭。 在需要连接时打开,当访问完数据库要立刻关闭连接. 举例说明,还是看两个代码段: I. DataSet ds = new DataSet(); SqlConnection MyConnection = new SqlConnection("server=localhost; uid=sa; pwd=; database=NorthWind"); SqlCommand myCommand = new SqlCommand(strSql,MyConnection); SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr); MyConnection.Open(); //打开连接 for(int i=0;i<1000;i ) //for 循环模拟取得数据前的商业逻辑操作 { Thread.Sleep(1000);
} myAdapter.Fill(ds); for(int i=0;i<1000;i ) //for 循环模拟取得数据后的商业逻辑操作 { Thread.Sleep(1000); }

MyConnection.Close(); //关闭连接 II. DataSet ds = new DataSet(); SqlConnection MyConnection = new SqlConnection("server=localhost; uid=sa; pwd=; database=NorthWind"); SqlCommand myCommand = new SqlCommand(strSql,MyConnection); SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr); for(int i=0;i<1000;i ) //for 循环模拟取得数据前的商业逻辑操作 { Thread.Sleep(1000); } MyConnection.Open(); //打开连接 myAdapter.Fill(ds); MyConnection.Close(); //关闭连接 for(int i=0;i<1000;i ) ////for 循环模拟取得数据后的商业逻辑操作 { Thread.Sleep(1000); } 显示 II 代码比 I 代码好的多,I 中早早占着连接不放,如果用户很多的话,容易出 现连接池满情况。严重时出现死机现象. 2.数据库查询 I. 直接生成 SQL 语句。 Sql Server 每次都要对其进行编译,在性能方面不会有 很大的提高。 另外也不够安全。容易被攻击. II. 使用带参数的 SQL 命令。这种方式 Sql Server 只对其编译一次,对于不同的参 数可以重复使用编译后的命令。提高了性能. III.使用 Sql Server 存储过程. 编译一次. 具有独立性,便于修改和维护. 一次能 完成用语句发送多次的功能.减少了网络的流量。 并不一定存储过程一定比语句效率要高, 如果商业逻辑很复杂的话,有时候用语句比存储过程效率要高. (六).缓存优化 缓存分为两种: 页面缓存和 API 缓存.
1.使用页面缓存和片段缓存 <%@ OutputCache Duration="5" VaryByParam="None"%> <%@ OutputCache Duration=60 VaryByParam=”TextBox1,TextBox2” %> 说明: Duration 是设置 Cache 的过期时间; VarByParam 是设置是否根据参数而变化,None 时所有参数使用同一 Cache,设置 TextBox1 时则根据 TextBox1 的不同值分别缓存;当有多个参数时则要组合缓存; 2.API 缓存。用于在应用程序中使用 I. 一个 Cache 使用的例子: https://www.wendangku.net/doc/8410594133.html,/chengking/archive/2005/10/03/494545.aspx II.使用时注意 Page.Cache 和 HttpContext.Current.Cache 区别: 它们指的同一个对象,在 Page 里,用 Page.Cache,如果在 global.asax 或自己的 类 里 用 :HttpContext.Current.Cache , 在 有 些 事 件 中 , 由 于 其 没 有 HttpContext , 就 用 HttpRuntime.Cache. 不对的地方请读者批评指正!
Tags: dotnet 技术 , c#开发技术 利用数据库模版创建方便部署的.Net 项目调试环境 Dot-Net 技术 | 阅读(122) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] 本文以 Petshop 为示例, 详细介绍了如何利用 Visutal Studio .Net 中的数据库模版将该项 目的数据库设计放到项目的解决方案中,并借助该方法将整个 Petshop 项目的数据库从 SQL SERVER 快速移植到 MSDE 上。 注:本文并没有就 Petshop 本身的技术进行任何的讨论,仅仅只是利用它的数据库做为 一 个 普 通 示 范 。 Petshop 网 上 宠 物 商

店 范 例 的 源 码 下 载 地 址 为 : https://www.wendangku.net/doc/8410594133.html,/team/compare。 引言: SQL SERVER 方便强大的查询,管理工具让它成为了我们开发.Net 数据库应用的上上之
选,甚至即使你并非开发基于 SQL SERVER 的应用,你也会喜欢利用它独有强大的查询分析 器来帮助你完成项目。 但是使用 SQL SERVER 开发项目应用有一个不方便的地方,就是当需要将做了一半的项目转 移到别的机器上的时候,假如你并不是很熟悉 SQL SERVER 你将会发现你几乎束手无策,因 为 SQL SERVER 并不像 ACCESS 那样将整个数据库放在一个文件中, 可以方便的放到你的项目 文件夹中打包带走。你也许会说可以利用 SQL SERVER 企业管理器生成创建脚本,然后进行 数据导出备份等等,虽然可行,但是总归是不太方便。 利用数据库模版项目, 便能将你的数据库表创建脚本, 数据文件以及存储过程同你的项 目放在一起,这样,转移到任何地方都能很容易重新构建好调试程序所需要的数据库环境, 并能在你的 Visual Studio .Net 集成调试环境中直接对脚本和存储过程进行修改。 下面将详细介绍如何为 Petshop 添加数据库模版项目, 并将 Petshop 数据库的创建脚本, 数据文件和存储过程导出到模版中同项目一起打包,然后导出到 MSDE 桌面数据引擎中。 创建数据库模版项目: 首先, 我们需要先有一个安装好的 Petshop 项目 (具体的安装事项和步骤请参考 Petshop 的说明文档) ,然后在 Visual Studio .Net 中打开它的项目文件,在"文件"菜单中选择"新建项 目", 在对话框中选择"其他项目"的"数据库项目", 并在右侧的模版列表中选择"数据库项目", 并选择"添入解决方案",名称和路径如下图所示:
点击确定后,出现数据连接对话框,选择 Petshop 数据库:
确定后,在解决方案中我们就可以看见为 Petshop 新创建的数据库模版项目,如下图所 示:
生成创建脚本和存储过程: 选择左边的服务器资源管理器,右键点击 Petshop 的数据连接,选择"生成创建脚本", 如下图所示:
在接下来的对话框中选择全部表和全部的存储过程:
保存路径选择数据库模版项目中的"Create Scripts":
如果没有什么意外情况发生的话,你的 Create Scripts 下已经生成了许多的 SQL 脚本文 件。 然后在数据连接中按住 Shift 键一次选择所有的表,右键点击选择"导出数据":
数据同样放在"Create Scripts"下。 生成命令文件: 在项目管理器中选上数据库模版项目,然后在主菜单的"项目"中选择"生成命令文件", 如下图所示:
如果需要导出数据则可以选择右下脚的"添加数据"按纽来选择那些表需要导出数据。 点 击确定后便可以看

见在项目中生成了一个名为 PetshopDB.cmd 的命令文件。 到这里,我们就创建了一个完整的 Petshop 数据库模版项目,并能在 Visual Studio .Net 中方便的对脚本进行编辑修改。 接下来, 我们将要把数据导入 MSDE 桌面数据库, 然后将 Petshop 的数据库改为 MSDE, 模拟数据库移植过程。 将数据库移植到 MSDE: 首先, 使用 SQL SERVER 的查询分析器或者企业管理器在 MSDE 中创建一个名为 petshop 的数据库,在刚才生成的 PetshopDB.cmd 上点击右键,选择"运行":
在弹出的对话框中,填入 MSDE 的服务器及 petshop 数据库:
点击确定后,我们就可以看到数据库的创建和数据复制过程:
最后,我们打开 MSDE 中的 petshop 数据库,就能看见所有的数据表,存储过程和完整 的数据。 好了,最后我们来测试一下成果,看看我们的 Petshop 是不是已经从 SQL Server 上移植到了 MSDE 上,我们修改一下 Petshop 的 Web.Config 文件中的数据连接字符串,如下图所示:
保存后运行程序,呵呵,我们又看见了那对熟悉的大鹦鹉,虽然这次它们是在 MSDE 上 安的家,不过看上去还是那么可爱。 总结: 利用数据库模版项目, 便能将你的数据库设计和数据从数据库独立出来, 并能放在你的 项目文件中,简化数据库的转移和分发过程,方便快速的移植和部署你的应用项目。
Tags: dotnet 技术 , c#开发技术 net 下安装、调试的常见问题与错误 Dot-Net 技术 | 阅读(119) | 评论(0) Oct 28 2005 [此文来源于互联网,牛 C 网只负责收集整理] Q:新建项目时出错: Visual Studio .NET 已检测到指定 Web 服务器运行的不是 https://www.wendangku.net/doc/8410594133.html, 1.1 版。 您将无法运行 https://www.wendangku.net/doc/8410594133.html, Web 应用程序或服务。 A: 对于这个错误有很多可能的原因,您可以参考下面几篇 KB 和文章的解决方案: “prb: "The specified Web server is not running https://www.wendangku.net/doc/8410594133.html, version 1.1" error message when you create an https://www.wendangku.net/doc/8410594133.html, 1.1 application and you have both https://www.wendangku.net/doc/8410594133.html, 1.1 and https://www.wendangku.net/doc/8410594133.html, 1.0 installed” https://www.wendangku.net/doc/8410594133.html,/default.aspx?scid=kb;en-us;817267 “troubleshoot "Visual Studio .NET has detected Web server is not running https://www.wendangku.net/doc/8410594133.html, 1.1"” https://www.wendangku.net/doc/8410594133.html,/default.aspx?scid=555132 “prb:创建 https://www.wendangku.net/doc/8410594133.html, 1.1 应用程序时出现错误信息“The Specified Web Server Is Not Running https://www.wendangku.net/doc/8410594133.html, Version 1.1” (指定的 Web 服务器未运行 https://www.wendangku.net/doc/8410594133.html, 1.1 版本) ” https://www.wendangku.net/doc/8410594133.html,/kb/817267/zh-cn
Q: 关于无法创建 aps.web 项目的解决办法 A: https://www.wendangku.net/doc/8410594133.html,/develop/Read_Article.asp?Id=19725 Q: aspx 项目不能调试 A: 1、已经启动了一个调试进程(同时打开了两个项目,且有一个已经在调试) :同时只能启动 一个; 2、配置文件中 debug="false":改成 true; 3、虚拟目录没有建立应用程序(或者名称为空)

:在虚拟目录属性中“应用程序”点击创建 4、项目配置为 Release:点菜单“生成”-配置,选择“debug” 5、 “你没有调试服务器权限” :修改 IE 的安全设置, “自动使用当前用户名和密码登录” 如果还不行,参考 ms 的解决方法: 对 照 你 的 错 误 信 息 , 应 该 在 这 个 文 档 中 能 找 到 解 决 办 法 https://www.wendangku.net/doc/8410594133.html,/team/csharp/learn/whitepapers/howtosolvedebuggerproblems.doc q:把.net 程序部署到没有安装.net Framwork 的机器上 A: https://www.wendangku.net/doc/8410594133.html,/China/Community/program/originalarticles/TechDoc/deployNETApp. mspx
Q:安装 https://www.wendangku.net/doc/8410594133.html, 2003 的时候,遇到 "无法访问 windows 安装程序组件"的错误 A: 根据提示,应该 windows installer 出了问题。 需要重新安装 windows installer。 执行如下操作: 一、先用 msiexec /unregserver 停掉 windows installer 服务。 二、下载 InstMsiW.exe,用 winrar 解压开。进入目录。 三、右击 msi.inf ,点击安装。 四、安装 https://www.wendangku.net/doc/8410594133.html, 2003 q:vc 软件包不可用或未注册 A: 症状: 当建立一个 WinForms 应用程序时,收到下述错误信息:"VC 软件包不可用或未注册".这个错误 甚至会在看上去一个成功的安装之后出现. 起因: 如果 Visual https://www.wendangku.net/doc/8410594133.html, 安装程序发现一些 TLB 文件和 DLL 文件已经存在的话,就不会再次在计
算机中注册这些文件,因此 就有可能发生"VC 软件包不可用或未注册"的提示. 在多数情况下,旧版本的的 Visual Studio .NET 容易引起这个错误,尤其是旧版本安装在另一个 操作系统下.
解决方案: 要解决这个问题,需要运行 Visual Studio .NET 修复程序.由于修复程序会强制注册一些安装程 序中没有被注册的项目,因此能更有效地解决这个问题. 按照下列步骤运行修复程序: 在开始中,指向"设置",点击控制面板,然后点击"添加/删除程序"; 在列出的已安装程序列表中,点击 Visual Studio .NET,然后点击"更改/删除"; 点击 Visual Studio .NET 安装对话框 1 2 3 项目中的第二项; 点击"修复/重装",然后按照屏幕提示操作. 更多相关信息: 重现这个问题的做法 要重现这个问题,最好有装在独立分区上的两个操作系统.两个 Windows XP Professional 会达 到这个目的. 在一个操作系统下安装 Visual Studio .NET; 在另一个操作系统下 Visual Studio .NET,安装过程中改变安装的缺省路径,以匹配第一次安装 的路径. 两次安装结果都会宣告成功. 然后启动第二次安装的 Visual Studio .NET(你就会发现这个问题的重现). 这种安装形式是永远不推荐的,即使两次安装选项完全相同,而且你也会以此节省磁盘空间, 但这种方法出现潜在问题的机会是很大的.如果一个 visual Studio .NET 改变了文件和注册选 项,这些改变不会记录到另一个 Visual Studio .NET 中,以致造成出现不可预

料结果的潜在危险. 引 自 :https://www.wendangku.net/doc/8410594133.html,/blogs/archives/000045.html https://www.wendangku.net/doc/8410594133.html,/default.aspx?scid=https://www.wendangku.net/doc/8410594133.html,:80/support/kb/ar ticles/q320/4/27.asp&NoWebContent=1 q:不能启动调试, 灾难性错误(在 Visual Studio .NET 中调试 https://www.wendangku.net/doc/8410594133.html, 应用程序时出现的常见 错误) A: https://www.wendangku.net/doc/8410594133.html,/?id=306172 q:在生成安装和部署项目时收到“unrecoverable Build Error” (不可恢复的生成错误)错误信 息 A: https://www.wendangku.net/doc/8410594133.html,/?id=329214
q:unable to start debugging on the web server A:如果遇到这些错误,则需要考虑以下几个问题: 要检查的内容 远程服务器上的 Web 应用程序 存储在 Visual SourceSafe 中并使用 FrontPage 服务器扩展的 Web 应用程序 手动附加 要检查的内容 如果得到“无法在 Web 服务器上启动调试”错误,请尝试检查下列内容: 您是否正在运行一个允许 Visual Studio 调试器自动附加到 Web 应用程序的 Windows 版 本?如果不是,则需要启动应用程序而不调试,然后手动附加到它。 (有关更多信息,请参 阅手动附加和 https://www.wendangku.net/doc/8410594133.html, 调试:系统要求。 ) 您的 Web 应用程序是否具有 Web.config 文件? Web.config 文件是否通过将 debug 属性设置为 true 而启用了调试模式?有关更多信息, 请参阅 https://www.wendangku.net/doc/8410594133.html, 应用程序中的调试模式。 Web.config 是否包含任何语法错误?您可以通过运行 Web 应用程序而不调试来检查是否 存在语法错误。 (从“调试”菜单中,选择“开始执行(不调试)。 ”)如果在 Web.config 中 存在语法错误,则会显示详细信息。 您是否是“调试器用户”(Debugger Users) 组的成员?如果您作为管理员登录,则管理员是 否在该组中? 您是否是通过指定特定的 IP 地址(如 100.20.300.400)而创建了项目?调试 Web 服务器 要求 NTLM 身份验证。 默认情况下, 地址被假定为 Internet 的一部分, IP 而在 Internet 上 不进行 NTLM 身份验证。若要更正这一问题: 创建项目时,指定 Intranet 上计算机的名称。 -或将 IP 地址 http://100.20.300.400) 添加到您的计算机上的受信任站点列表中。 (从 Internet Explorer 的“工具”菜单中,选择“Internet 选项” ,然后选择“安全”选项卡) 。 运行 IIS 服务器的计算机是否已安装了 Visual Studio .NET 远程组件? IIS 是 否 是 在 安 装 了 Visual Studio .NET 之 后 才 被 安 装 在 本 地 计 算 机 ( 即 运 行 Visual Studio .NET 的计算机) 上的?IIS 应在安装 Visual Studio .NET 之前安装。 如果它是后来安装 的,则可能需要修复 .NET 框架。 修复 .NET 框架 插入 Visual Studio .NET 光盘并运行 :\wcu\dotNetFramework\dotnetfx.exe c:\temp\netfx.msi" -或-
/t:c:\temp
/c:"msiexec.exe
/fvecms
插入 Visual Studio .NET Windows 组

相关文档