c# winform最小化到托盘,也就是最小化到右下角,其实很简单,winform中有专门的控件 - 要每天开心 - 博客园

mikel阅读(1152)

来源: c# winform最小化到托盘,也就是最小化到右下角,其实很简单,winform中有专门的控件 – 要每天开心 – 博客园

C# winform最小化到托盘,也就是最小化到右下角,其实很简单,winform中有专门的控件。
2010年04月12日 星期一 15:23

C# winform最小化到托盘,也就是最小化到右下角,其实很简单,winform中有专门的控件。

下面是完整的代码,没太多需要解释的。

先在winform中添加notifyIcon控件,然后激活相应事件,添加代码。因为屏蔽了关闭窗体事件,可以设定一个全局变量bool变量来分辨是哪里引起的close事件。

//设置全局变量bool closeTag = true;

        //最小化
private void form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
NormalToMinimized();
}
}
//close时最小化
private void form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
NormalToMinimized();
}
//单击显示窗体
private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.MinimizedToNormal();
}
}
private void MinimizedToNormal()
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
notifyIcon.Visible = false;

        }
private void NormalToMinimized()
{
this.WindowState = FormWindowState.Minimized;
this.Visible = false;
this.notifyIcon.Visible = true;
}
private void frmMain_FormClosing(object sender, FormClosingEventHandler e)
{
if (closeTag)
{
e.Cancel = true;
NormalToMinimized();
}
}
//托盘右键关闭事件
private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
closeTag = false;
Application.Exit();
}

ChromiumWebBrowser [链接] - 亚特凯瑟琳 - 博客园

mikel阅读(2716)

来源: ChromiumWebBrowser [链接] – 亚特凯瑟琳 – 博客园

 

  1. 谷歌出品,必属精品——嵌入式Chromium框架(cef)     Cefsharp使用教程四( js回调,C#方法)     IRequestHandler.OnResourceResponse Method  chromiumembedded
  2. Using HTML as a UI Elements in a WinForms Application with Chrome / Chromium Embedded Framework (CEF)
  3. WebDocument.h       Getting DOM from page using Chromium/WebKit      chrome://version/     Chromium (CefSharp) Tor Browser
  4. c#中如何向chromewebbrowser写入html  DSkin 的WebUI开发模式介绍,Html快速开发Winform的UI  WinForms can’t load local html file
  5. 一个小巧、轻量的浏览器内核,用来取代wke和libcef   屌炸天的内核来袭,史上最小chromium内核miniblink!    Chromium (CefSharp) Tor Browser
  6. Cefsharp cookie独立,多开窗口,mp3,mp4播放    How do I read a cookie value?  CEF 获取Cookie例子 CefCookieManager C++
  7. CEF 中获取浏览器Cookie  CefSharp ChromiumWebBrowser设置Cookie的方式   Cef Cookie clear  Cefsharp clearing cache,cookies and browser data in wpf  Delete cookies, how? CEF.SetCookie() does not set cookie #102
  8.  基于.net开发chrome核心浏览器【三】  ChromiumWebBrowser Disable Right-Click Context Menu C#  Cefsharp how to get current URL address? c# CefSharp ChromiumWebBrowser初始化完成后加载网址  CefSharp 删除 Cookie 的方法  CEF设置cookie
  9.  How to save cookies in CefSharp  Cef.GetGlobalCookieManager().VisitAllCookies are different from Chrome browser
  10.  CefSharp中ChromiumWebBrowser打开新页面处理(_blank)    CefSharp(二) 文件下载功能    使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler
  11.  Force CEFSharp to download without showing dialog   How change header “Accept-Language”    CEF Forum • Accept-Language not workingNov 11, 2559 BE
  12. CEF Forum • Detecting OS language within browserSep 22, 2558 BE   CEF Forum • Browser language settings – MAGPCSS Web PortalAug 14, 2558 BE   CEF Forum • How change header “Accept-Language”
  13. Close tab on window.close() #1084  CefSharp/CefSharp/ILifeSpanHandler.cs   【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)     How to handle mouse click in CefSharp to navigate back and forward
  14. CefSharp之三-如何获取request和response CefSharp之二–如何看懂demo中的例子,以及按照例子进行开发  解决CefSharp的CefReturnValue问题
  15. Chrome not making a real post request – “CAUTION: Provisional headers are shown”    How to use CefSharp (chromium embedded framework c#) in a Winforms application

    IDialogHandler.OnFileDialog Method  CefSharp/CefSharp.Example/TempFileDialogHandler.cs  How can I read uploaded file in CefSharp?   cef / JavaScriptIntegration   CefSharp 与 js 相互调用   [Winform]CefSharp ——js调用c#方法

    how-do-you-expose-a-net-class-to-javascript  BoundObject    tooltipText not display(web element title)  Send POST data to URL with CefSharp C#   ClientHandler::OnBeforeBrowse – no POST data?

  16.  Add support for browser-side navigation (PlzNavigate)   CefSharp禁止弹出新窗体,在同一窗口打开链接,并且支持带type=”POST” target=”_blank”的链接
  17.  使用 CEFPython 打造自己的浏览器视图     让基于CEF的应用支持自定义协议  易语言CEF支持库增强模块   如何在网页中POST任意内容并跳转  使用POST请求跳转页面  Chromium Post
  18.  OnBeforePopup return false but new windows open [a target=”_blank”]?   First you need to create a custom BrowserRequestHandler class such as this:
  19.  Chrome not making a real post request – “CAUTION: Provisional headers are shown”   CefSharp使用教程三(Cookie处理)   CefSharp how to store cookies 使用CEF类库处理HTTP请求

    Javascript Binding v2 #2246  CefLifeSpanHandler, customized OnBeforePopup problem  ClientAdapter.cpp  TempFileDialogHandler  List of Chromium Command Line Switches

  20. How to implement drag & drop with CefSharp WinForms CefSharp中文帮助文档  第一次使用CEF做个Demo  MenuHandler.cs  WinForm — CEF的使用和一些坑处理
  21. How to set Frame Name of new browser when handling OnBeforePopUp in CEFSharp  基于.net开发chrome核心浏览器【三】 Xilium.CefGlue  Chromium Embedded Framework (CEF) Automated Builds  
  22. SharpBrowser   解决cef加载flash时弹出黑框的问题 Popup handler in Cefsharp  CefGlue 加载FLASH 使用HOOK方式 解决CEF加载PPAPI FLASH插件时弹出CMD命令行窗口的问题
  23.  Capturing a pop up window using LifeSpanHandler and CefSharp DownloadHander – Hide current browser How to get browser object outside of OnAfterCreated …
  24.  Output files description table (Redistribution)  CEF 中的那些坑  正解,但需要将 msvcp120.dll msvcr120.dll 拷贝至C:\Windows\System32
  25.  cefsharp如何支持flash插件  用Tchromium替换webbrowser   CefSharp中文帮助文档    10. 当我重新发布使用CefSharp的应用程序时,需要包括什么文件?请参阅: Output files description (Redistribution)
  26.  CefSharp.MinimalExample  Chrome浏览器中手动设置Cookie的值

    CefSharp配置,添加指定flash插件支持(不能播放Flash的解决方法)

  27.  CefSharp 与 js 相互调用  cefsharp 关于C# 调用JavaScript的一个坑

  28. General Usage

  29. ===插件开发

  30. Chrome插件(Extensions)开发攻略

WordPress 5.3.1自动更新失败 手动更新解决办法-主机吧

mikel阅读(982)

来源: WordPress 5.3.1自动更新失败 手动更新解决办法-主机吧

WordPress作为全球最受欢迎的开源程序由于种种原因国内访问官网一直很垃圾,虽然有中文版,但是并没有中文官网,经常性访问不了,不仅插件经常性更新失败,而版本更新也经常失败。

比如这次主机吧更新WordPress 5.3.1就出现了安装失败,其根本原因是国内网络根本访问不了wordpress.org。

Notice: 发生了预料之外的错误。WordPress.org或是此服务器的配置可能出了一些问题。如果您持续遇到困难,请试试支持论坛。 (WordPress无法建立到WordPress.org的安全连接,请联系您的服务器管理员。) in /www/wwwroot/zhujib.com/wp-admin/includes/update.php on line 139

正在从https://downloads.wordpress.org/release/zh_CN/wordpress-5.3.1.zip下载更新…

下载失败。: Too Many Requests

安装失败

解决办法只能手动更新了,下载WordPress 5.3.1 到本地电脑。

1.把WordPress 5.3.1压缩包的里的wp-content目录删掉

 

2.进FTP或主机管理后台删除根目录下的wp-includes和wp-admin文件夹。

3.上传删除后的压缩包到网站服务器上并覆盖现有的WordPress 文件

4.在浏览器里面运行:https://你的博客地址/wp-admin/upgrade.php,回车访问,执行升级,点击继续升级数据库,升级完成即可。

 

 

WordPress问题解决: 要执行请求的操作, WordPress需要访问您网页服务器的权限 - 简书

mikel阅读(1496)

来源: WordPress问题解决: 要执行请求的操作, WordPress需要访问您网页服务器的权限 – 简书

WordPress安装插件的时候, 可能会遇到错误:

要执行请求的操作,WordPress需要访问您网页服务器的权限。 请输入您的FTP登录凭据以继续。 如果您忘记了您的登录凭据(如用户名、密码),请联系您的网站托管商。

要执行请求的操作WordPress需要访问您网页服务器的权限

原因: 网站目录权限不够

解决方案: 修改网站目录权限为755, 并且将所有者改为www用户

Xshell运行以下命令:
chmod -R 755 /home/wwwroot/wmsoho.com
chown -R www: /home/wwwroot/wmsoho.com

wmsoho.com域名以及网站目录替换成你自己的.

作者:外贸SOHO笔记
链接:https://www.jianshu.com/p/70a98eb679fe
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CodeSmith模板代码生成实战详解 - 张龙豪 - 博客园

mikel阅读(1505)

来源: CodeSmith模板代码生成实战详解 – 张龙豪 – 博客园

前言

公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的。然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉。为了尽可能的在结构层避免出现这种混乱的现象,我们就做了一个决定,使用一个统一的架子结构,让项目管理变的简单起来。

这样一来,结构中各层就会有很多重复的代码或者重复的逻辑出现,为啦提高开发效率,节约开发时间,我们采用了codesmith根据自定义模板,生成代码功能。让单表的增删改查功能从数据访问层到ui展示层一键批量生成。下面就开始我的codeSmith模板编写历程回顾。

CodeSmith安装下载

官网地址:http://www.codesmithtools.com

下载地址:http://www.codesmithtools.com/downloads

我使用的,带破解注册工具的codesmith链接:http://pan.baidu.com/s/1dDdndsd

傻瓜式安装,不做介绍。只不过你安装完需要很多码。那么烦啦,就用我百度云里面的。带注册软件,安装完之后,不要急于打开codesmith,先去用注册软件注册下。

安装完成,破解成功。

打开codesmith主界面如下。

Note:打开新建Csharp template,然后后缀名为cst的就是模板文件,自己写的模板代码,就在这种后缀格式的文件中。然后光标放在模板文件中,F5即可生成你要代码的文件。

写自己的codesmith模板代码。

1、自定义参数模板

Note:从这里我们能看到参数的声明,与基本语法的使用规则,需带<%%>。熟悉之后,在右下角给参数赋值,然后光标放入模板中,点击f5生成代码,看下,推敲下。

2、遍历数据库中表的模板

 

Note:图片展示的是怎么设置数据库配置

模板代码如下

复制代码
<%--引入c#模板--%>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="False" Description="Create an enum of tables." %>
<%--声明数据库的参数,在左下角的Database属性中,选择要操作的数据库名称--%>
<%@ Property Category="Database" Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Optional="False" Description="Database the table enums will come from." %>
<%--引入下面的类库,操作数据库必备的。不要纠结加入就行啦。--%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--SourceDatabase, 是你选择数据库的属性类,涵盖数据库的名称,创建时间,字符串链接,描述等等,自己可以点点看 --%>
public enum <%=SourceDatabase.Name %>Tables
{
<%-- 遍历数据库中的表集合 --%>
<% for(int x = 0; x < SourceDatabase.Tables.Count; x++) 
{ 
    TableSchema table = SourceDatabase.Tables[x];
    if (x < SourceDatabase.Tables.Count -1)
        //输出表名,这里是c#的注释,不会被写进生成的代码中。\t为换行符。
        Response.WriteLine("\t{0},", table.Name);
    else
        Response.WriteLine("\t{0}", table.Name);
}
%>    
}
复制代码

3、遍历数据库表中的字段,声明并使用自定义函数

复制代码
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="False" Description="Create a list of properties from database table." %>
<%--声明数据库表的参数,在左下角的表属性中,选择要操作的数据库表--%>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%--引入system类型转为c#的数据类型的映射字典 --%>
<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
<%--引入下面的类库,操作数据库必备的。--%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--遍历数据库表的字段属性--%>
<% foreach (ColumnSchema column in this.SourceTable.Columns) {  %>
<%--拼接字符串,输出c#中实体的属性--%>
public <%= ControlType(CSharpAlias[column.SystemType.FullName]) %> <%= StringUtil.ToPascalCase(column.Name) %>{ get; set; }

<% } %>
<script runat="template">
 //如果类型为int,或datetime类型输出可空类型
 public string ControlType(object val)
 {
     var ty=val.ToString();
     if(ty=="int")
     {
         return "int?";
     }
     if(ty=="System.DateTime")
     {
         return "System.DateTime?";
     }
     return ty;
 }
</script>
复制代码

4、批量生成文件,并指定生成文件位置

代码如下

复制代码
<%@ Template Language="C#" TargetLanguage="Text" %>
<%-- 注册要生成的模板 --%>
<%@ Register Name="TableEnumTemplate" Template="TableEnum.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%@ Register Name="TableClumTemplate" Template="TableProperties.cst" MergeProperties="Flase" ExcludeProperties=""%>

<%--声明数据库的参数,在左下角的Database属性中,选择要操作的数据库名称--%>
<%@ Property Category="Database" Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Optional="False" Description="Database the table enums will come from." %>
<%--Type数据类型为TableSchema,表明参数Table是一个表对象。--%>
<%@ Property Name="SourceTable" Type="TableSchema" DeepLoad="True" Optional="False" Category="Table" Description="Table Name"%>
<%-- 执行输出文件的函数 --%>
<% this.OutPutFile(); %>
<script runat="template">
    //输出文件
    private void OutPutFile()
    {
        //生成列举表名的模板
        CodeTemplate table =new TableEnumTemplate();
        //指定输出路径
        string tableFilePath = OutputDirectory +"\\"+ this.SourceDatabase.Name +".cs";
        //给子模板参数赋值
        table.SetProperty("SourceDatabase",this.SourceDatabase);
        table.RenderToFile(tableFilePath,true);
        
        //生成列表表字段的模板
        CodeTemplate cloumn =new TableClumTemplate();
        //指定输出路径
        string cloumnFilePath = OutputDirectory +"\\"+ this.SourceTable.Name +".cs";
         //给子模板参数赋值
        cloumn.SetProperty("SourceTable",this.SourceTable);
        cloumn.RenderToFile(cloumnFilePath,true);
    }
    //解决方案输出路径
    private string Directory = String.Empty;
    [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    [Optional, NotChecked]
    [DefaultValue("")]
    public string OutputDirectory 
    { 
        get
        {
            return Directory;
        }
        set
        {
            if (value.EndsWith("\\")) value = value.Substring(0, value.Length -1);
            Directory = value;
        } 
    }
</script>
复制代码

数据库表生成md文档模板

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%--目标语言C#--%>
<%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="" Debug="True" ResponseEncoding="UTF-8"%>
<%--Type数据类型为TableSchema,表明参数Table是一个表对象。--%>
<%@ Property Name="Table" Type="TableSchema" DeepLoad="True" Optional="False" Category="Table" Description="Table Name"%>
<%--引入数据库操作组件--%>
<%@ Assembly Name="SchemaExplorer"%>
<%@ Import Namespace="SchemaExplorer"%>
### <%=Table.FullName %>表描述
|字段名|数据类型|是否可空|数据库类型|长度|描述|
|--|--|--|--|--|--|
<%for(int i=0;i<Table.Columns.Count;i++){%>
|<%=Table.Columns[i].Name.ToString()%>|<%=Table.Columns[i].SystemType.ToString()%>|<%=Table.Columns[i].AllowDBNull?"Yes":"No" %> |<%=Table.Columns[i].NativeType.ToString() %>|<%=Table.Columns[i].Size %>|<%=Table.Columns[i].Description.ToString()%>|
<%}%>       

 

 

 

好啦,就这么多啦,能满足我的需求啦。

小结

如果你在看到本文后有什么疑问,请加入博客左上角群,一起交流学习。

(1条消息)CodeSmith激活教程【适用任意版本】 - 【大BUG】的博客

mikel阅读(1017)

来源: (1条消息)CodeSmith激活教程【适用任意版本】 – 【大BUG】的博客

非原创,我在百度贴吧看到的破解教程  原文地址http://tieba.baidu.com/p/3373160396?traceid=

仅供学习使用,请支持正版

第一步:下载好安装包,记住版本号

 

第二步:安装好codesmith

第三步:下载好注册机(也就是破解工具)点击下载破解工具  解压密码 502

第四步:启动注册机(注意修改对应版本,codesmith是7.0改为CS70P-       8.0则是CS80P-  )

第五步:修改好版本号后点击“Generate”按钮生成假注册码

第六步:复制假的注册码

第七步:启动你的codesmith,并且点击注册按钮

第八步:粘贴之前注册机复制的假注册码

第九步:点注册按钮

第十步:开始注册

第十一步:这里不要关闭(这个验证码一会儿有用)

第十二步:开始真正的注册(点击按钮)

第十三步:同样的该版本号,要选时间(大于当前时间即可),然后输入第十一步的验证码(手动输入,要确认正确),填写好后即可点击“Generate”按钮,生成注册码

第十四步:输入注册码,完成

 

 

 

————————————————
版权声明:本文为CSDN博主「聚繁大BUG」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31384551/article/details/80238656

解决 EF where(func) 查询的一个性能问题 - 未煮熟的虾 - 博客园

mikel阅读(811)

来源: 解决 EF where(func) 查询的一个性能问题 – 未煮熟的虾 – 博客园

前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 SQL语句生成的。最近因功能变更 要改动,而我这段正在做ASP.NET mvc +ef+autofac的一个电商网站。索性 就把原来的底层全重新了套用了我现在的架构 EF6.0+autofac+三层架构,上层的ASP.NET没有变。改完后发现交班页面打开巨慢。

跟踪EF生成的SQL语句   发现生成的sql 有问题,查找的全表,而全表有近10万条的数据。

继续跟踪数据库的耗时查询 发现确实是这条语句占时间

为什么会这样呢,我在查询里做条件搜索了,为啥 结果不对呢?

贴出 BaseRepository.cs 的代码

 View Code

调用代码

return jiaobanitem.LoadEntities(t => t.JiaoBanID == jiaobanID && t.GoodsID == GoodsID).FirstOrDefault();

参考 nopCommerce  修改baserepository

 View Code

同时修改调用代码 为

return jiaobanitem.Table.Where(t=>t.JiaoBanID ==jiaobanID && t.GoodsID ==GoodsID).FirstOrDefault();

问题解决 页面响应不到100ms   同时调试中 生成的sql语句已经有 查询条件了

问题出在

//查询
public IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
{
return db.Set<T>().Where<T>(wherelambda).AsQueryable();
}

为了验证,我在前台直接调用

return this.context.Set<tb_e_jiaoBanItem>().Where(t => t.JiaoBanID == jiaobanID && t.GoodsID == GoodsID).AsQueryable().FirstOrDefault();

页面响应也是 100ms左右,性能没问题。直接调用 dbcontext的set<>方法 没问题。但跨了几层传递后 就有问题。并没有生成我想要的查询语句。

 

这个问题原来别人也碰到过  http://www.cnblogs.com/yjmyzz/archive/2008/09/06/1285564.html

如果传入Where的参数为Expression,则L2S会自动帮忙处理Expression的拼接;而如果传入的是Func,而L2S无法拼接Expression与Func,所以只好先把数据全部取出来,然后再应用Func来进行数据过滤。

代码应该修改为:

public virtual IEnumerable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T,bool>> wherelambda)
{
return this.Table.Where<T>(wherelambda);
}

linq to sql中慎用Where(Func predicate),小心被Linq给"骗"了! - 菩提树下的杨过 - 博客园

mikel阅读(1020)

来源: linq to sql中慎用Where(Func predicate),小心被Linq给”骗”了! – 菩提树下的杨过 – 博客园

近日在一个大型Web项目中,采用Linq to SQL替换原来的SQLcommand/SQLdatareader方式来获取数据,上线后刚开始一切正常,但是随着访问量的增加,网站明显慢了很多,监测服务器CPU占用率/内存使用情况等性能指标却发现均在正常范围内,无意中在SQLServer Profier中跟踪数据库执行的sql语句时,发现有大量语句直接将整个表的数据全部提取出来了,而非仅返回分页中的当前页数据!

而这些SQL都是Linq自动翻译并最终提交到数据库的,查看了相关的代码,明明写着Skip(n).Take(m)类似的语句,为何还会生成这么“傻”的sql呢?

于是写了以下测试代码[测试环境:vs.net2008 + sqlsever2005 + win2003],最终发现是Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);使用后,导致这个问题的产生

1.测试表T_Test:

复制代码

CREATE TABLE [dbo].[T_Test](
    [F_ID] [int] IDENTITY(1,1) NOT NULL,
    [F_Name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [F_Age] [int] NULL,
 CONSTRAINT [PK_T_Test] PRIMARY KEY CLUSTERED
(
    [F_ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

复制代码

 

录入了几条测试数据:
F_ID F_Name F_Age
15 Jimmy 20
16 Mary 14
17 Jack 30
18 张三 35
19 李四 24

2.新建一个”控制台应用程序”,把T_Test拖到dbml中,Program.cs文件中输入如下代码:

复制代码

1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Linq.Expressions;
5using CNTVS.LINQ;
6
7namespace TestLinq
8{
9    class Program
10    {
11        static void Main(string[] args)
12        {
13
14            //Expression<Func<T_Test, bool>> _Expression = PredicateBuilder.True<T_Test>();
15            //_Expression = _Expression.And(t => t.F_Age >= 20).And(t => t.F_Name.Contains(“J”));
16            //var Data = GetData(_Expression, 1, 1);
17
18            var Data = GetData(1, 1);
19
20            ShowData(Data);
21
22
23        }

24
25        /// <summary>
26        /// 用Where<T>(Expression)方式获取数据
27        /// </summary>
28        /// <param name=”ExpWhere”></param>
29        /// <param name=”PageSize”></param>
30        /// <param name=”CurrentPageIndex”></param>
31        /// <returns></returns>

32        static List<T_Test> GetData(Expression<Func<T_Test,bool>> ExpWhere,int PageSize,int CurrentPageIndex)
33        {
34            List<T_Test> _Result = null;
35            using (DBDataContext db = new DBDataContext())
36            {
37                try
38                {
39                    var query = db.T_Test.Where<T_Test>(ExpWhere.Compile()).Skip((CurrentPageIndex – 1) * PageSize).Take(PageSize);
40                    _Result = query.ToList();
41                }

42                finally { db.Connection.Close(); }
43            }

44            return _Result;
45        }

46
47
48        /// <summary>
49        /// 用Where(Lambda)方式获取数据
50        /// </summary>
51        /// <param name=”PageSize”></param>
52        /// <param name=”CurrentPageIndex”></param>
53        /// <returns></returns>

54        static List<T_Test> GetData(int PageSize, int CurrentPageIndex)
55        {
56            List<T_Test> _Result = null;
57            using (DBDataContext db = new DBDataContext())
58            {
59                try
60                {
61                    var query = db.T_Test.Where(t => t.F_Age >= 20 && t.F_Name.Contains(“J”)).Skip((CurrentPageIndex – 1) * PageSize).Take(PageSize);
62                    _Result = query.ToList();
63                }

64                finally { db.Connection.Close(); }
65            }

66            return _Result;
67        }

68
69
70        /// <summary>
71        /// 显示数据
72        /// </summary>
73        /// <param name=”Data”></param>

74        static void ShowData(List<T_Test> Data)
75        {
76            foreach (var item in Data)
77            {
78                Console.WriteLine(“Name:{0}\t,Age:{1}”, item.F_Name, item.F_Age.ToString());
79            }

80            Console.ReadKey();
81        }

82    }

83}

复制代码

 

代码很简单,找出F_Name中包含字母”J”,F_Age大于20的记录,并且跳过第一个后,仅获取一条记录

注:PredicateBuilder是一个老外写的用于动态构造Expression表达式的工具类,在查询条件不确定,需要动态创建时,非常有用,完整代码如下:

 


1using System;
2using System.Linq;
3using System.Linq.Expressions;
4
5namespace CNTVS.LINQ
6{
7
8    public static class PredicateBuilder
9    {
10      public static Expression<Func<T, bool>> True<T> ()
11      {
12          return f => true;
13      }

14
15      public static Expression<Func<T, bool>> False<T> ()
16      {
17          return f => false;
18      }

19
20      public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
21                                                          Expression<Func<T, bool>> expr2)
22      {
23        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
24        return Expression.Lambda<Func<T, bool>>
25              (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
26      }

27
28      public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
29                                                           Expression<Func<T, bool>> expr2)
30      {
31        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
32        return Expression.Lambda<Func<T, bool>>
33              (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
34      }

35    }

36}

 

以下是输出结果:

Name:Jimmy      ,Age:20

用Sql Server Profiler跟踪提交到数据库的语句为:

复制代码

exec sp_executesql N’SELECT [t1].[F_ID], [t1].[F_Name], [t1].[F_Age]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[F_ID], [t0].[F_Name], [t0].[F_Age]) AS [ROW_NUMBER], [t0].[F_ID], [t0].[F_Name], [t0].[F_Age]
    FROM [dbo].[T_Test] AS [t0]
    WHERE ([t0].[F_Age] >= @p0) AND ([t0].[F_Name] LIKE @p1)
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p2 + 1 AND @p2 + @p3
ORDER BY [t1].[ROW_NUMBER]’,N’@p0 int,@p1 nvarchar(3),@p2 int,@p3 int’,@p0=20,@p1=N’%J%’,@p2=1,@p3=1

复制代码

 

一切都很完美,跟我们想象的一样仅取了一条记录

3.但是,我们稍微把代码改一下:

把Main方法中的前三行注释去掉,同时把var Data = GetData(1, 1);注释掉,即

 

复制代码

1static void Main(string[] args)
2        {
3            Expression<Func<T_Test, bool>> _Expression = PredicateBuilder.True<T_Test>();
4            _Expression = _Expression.And(t => t.F_Age >= 20).And(t => t.F_Name.Contains(“J”));
5            var Data = GetData(_Expression, 1, 1);
6
7            //var Data = GetData(1, 2);
8
9            ShowData(Data);
10        }

复制代码

修改的用意在换一种方法(即Where<T>(Expression))取数据,运行后输出结果跟上一种方式完全相同,而且这种方式可以在调用方法前动态创建需要的查询条件表达式,用法更灵活,但是我跟踪到的sql语句却是:

SELECT [t0].[F_ID], [t0].[F_Name], [t0].[F_Age]
FROM [dbo].[T_Test] AS [t0]

 

即采用Where<T>(Expression)方式取数据时,居然先把所有数据取回来,再利用Expression来进行结果筛选以及Skip/Take操作,真是令人大跌眼镜!(或许仅仅是我水平有限,理解不了而已),这样的方式,在单表数据量很大时,性能当然极低。

恳请园子里的哪位linq达人,能解释一二?

知道了最终结果,处理方法自然也就明朗了,当时为了快速解决问题,只能把这类操作回归到最原始的SqlCommand/SqlDataReader方式读取,也许有更好的办法,欢迎大家指点。

SQL Server附加数据库出现错误5123的正确解决方法 - 岁月已走远 - 博客园

mikel阅读(1372)

来源: SQL Server附加数据库出现错误5123的正确解决方法 – 岁月已走远 – 博客园

因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008。起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server 2008 数据库结构应该差不多,可是在练习的过程中,我发现两个数据库中很多表的结构还是有很多不一样的地方。于是决定到微软下载中心将示例数据库AdventureWorks for SQL Server 2005下过来,附加到SQL Server 2008上,以便顺利进行练习。我以SQL Server 2008的超级管理员账户“sa”连接登录到实例SQLServer2008:

在附加示例数据库AdventureWorks for SQL Server 2005时,弹出了下图这个错误:

    仔细看了一下主要信息“尝试打开或创建物理文件……时,CREATE FILE遇到操作系统错误 5(拒绝访问。)”  ,一看就知道应当是对要附加的数据文件的操作权限不够。     按一般的思维习惯,我们会对操作权限不够的文件授予足够的操作权限。比如,有网友说“给要附加的数据文件和相应的日志文件授予Everyone的权限”,授权过程如下三张截图所示(注意数据文件和日志文件都必须授权):

(图1:授权数据文件)
(图2:数据文件授权后)
(图3:日志文件授权后)
    对要附加的数据文件和日志文件分别授予Everyone【读取和执行】、【读取】的权限后,在SQL Server 2008中重新尝试附加数据库,发现可以附加成功了! 是不是问题就这样解决了呢?这样子做对吗?     如果在真实的数据库管理过程中,我们把数据文件、日志文件的权限放大到Everyone,那肯定是不对的做法。因为这样数据库的安全性将大打折扣,虽然对Everyone只授予了【读取和执行】、【读取】的权限,但这仍然有泄漏数据的危险。
     我们应当保证能正常访问的情况下,使数据文件具有最小的访问权。我们之前授权给Everyone,那所有用户或账户都能操作相应的文件了,这肯定不安全的。那么如何才能授予最小的访问权限呢?思考一下,我们用SQL Server 2008去附加相应的数据文件,报出“拒绝访问”即权限不够的错误,换句话说,当前SQL Server 2008没有权限访问这些文件。我们右键文件,到文件属性中查看一下文件的权限情况,如下图所示:

(相应数据文件原本的权限情况)
     我们发现只有SYSTEM和xrm这两个组或用户才有权操作此数据文件。SYSTEM是一个用户组,即【本地系统】组,而xrm是一个管理员用户,如图示:

 
(xrm用户的信息)
    SYSTEM用户组和xrm这个管理员用户都有权限操作此数据文件和日志文件,而以SQL Server 2008的超级管理员SA连接登录实例后,SQL Server却没有权限访问此数据文件。换句话说,以SQL Server 2008的超级管理员SA连接登录实例后,登录的身份不在SYSTEM用户组,也不是xrm这个管理员。那会是什么呢?
         我们查看一下当前SQL Server 2008的实例服务的相关信息就知道了,打开Sql Server Configuration Manager (即SQL Server 配置管理器)查看一下当前连接到的实例服务的相关信息,如下图所示:

(当前实例服务的相关信息)
    发现当前实例SQLServer2008的登录身份为“NT AUTHORITY\LocalService”,即操作系统授权的【本地服务】,本地服务也是了个用户组。换句话说,如果我们仅授予【本地服务】这个用户组的权限(而不是Everyone),应该也可以在SQL Server 2008中用sa的账户附加数据库了。为此,将刚刚授予相应数据文件和日志文件Everyone的权限都删除,再授予LocalService用户组相应数据文件和日志文件的权限,重新尝试附加相应的数据库,发现的确可以附加成功!不必说,授予操作系统授权的【本地服务】用户组比起授予Everyone来说肯定要安全的多。
    上面提到的方法中,我们都是改变了数据文件原来的权限范围(原来的权限范围只有SYSTEM即【本地系统】用户组和xrm这个系统管理员) 。而更好的办法是不要改变数据文件的权限范围,仍然以SA身份连接登录SQL Server 2008的实例也能访问相应的数据文件。而要达到这个目的,我们只需要将相应实例的登录身份改为SYSTEM【本地系统】用户组,SYSTEM也是在相应数据文件的权限范围之内的用户组,而且SQL Server实例以本地系统身份运行,安全性将更高。我们可以在SQL Server 配置管理器中将相应的SQL Server实例的登录身份修改为【本地系统】即Local System,如下列图所示:

(修改实例的登录身份)
   
(实例的登录身份变为LocalSystem)
    然后重启相应实例服务,重新以SA身份连接登录SQL Server 2008的相应实例并尝试附加数据库, 同样可以成功的将数据库附加上!!!

其实,如果不是要特别地以SA身份连接登录SQL Server 2008的相应实例来附加相应数据库,那么在连接登录SQL Server 2008的相应实例时,身份验证选择【Windows 身份验证】,不做前文中所述的其他修改就可以把数据库附加上去了,原因就在于:【Windows 身份验证】用的是当前操作系统的用户的权限,权限一般都足够大的。另外,在【SQL Server 配置管理器】中针对实例服务可以做的操作,在Windows的【服务】上也可以做到。