小编Gar*_*ill的帖子

为什么IF(查询)需要一个多小时,查询时间不到一秒?

我有以下SQL:

 IF EXISTS
 (
    SELECT
        1
    FROM
        SomeTable T1
    WHERE
        SomeField = 1
    AND SomeOtherField = 1
    AND NOT EXISTS(SELECT 1 FROM SomeOtherTable T2 WHERE T2.KeyField = T1.KeyField)
)
    RAISERROR ('Blech.', 16, 1)
Run Code Online (Sandbox Code Playgroud)

SomeTable表有大约200,000行,SomeOtherTable表格大致相同.

如果我执行内部SQL(SELECT),它会在亚秒内执行,不返回任何行.但是,如果我执行整个脚本(IF...RAISERROR),则需要一个多小时.为什么?

现在,显然,执行计划是不同的 - 我可以在企业管理器中看到 - 但是,为什么呢?

我可能会做SELECT @num = COUNT(*) WHERE......然后IF @num > 0 RAISERROR......但是......我认为这有点失误.如果您知道它存在,您只能编写一个错误代码(对我来说它确实看起来像个错误).


编辑:

我要指出,我已经尝试过重跳汰查询到OUTER JOIN按@波希米亚的答案,但本作的执行时间没有差异.


编辑2:

我附上了内部SELECT语句的查询计划:

查询计划 - 内部SELECT语句

...以及整个IF...RAISERROR块的查询计划:

查询计划 - 整个IF语句

显然这些显示了真实的表/字段名称,但除此之外,查询完全如上所示.

sql sql-server

11
推荐指数
1
解决办法
901
查看次数

下载文件时如何传递身份验证令牌?

我有一个 Web 应用程序,其中 Angular (7) 前端与服务器上的 REST API 通信,并使用 OpenId Connect (OIDC) 进行身份验证。我正在使用向我的 HTTP 请求HttpInterceptor添加Authorization标头以向服务器提供身份验证令牌。到现在为止还挺好。

但是,除了传统的 JSON 数据,我的后端还负责即时生成文档。在添加身份验证之前,我可以简单地链接到这些文档,如下所示:

<a href="https://my-server.com/my-api/document?id=3">Download</a>
Run Code Online (Sandbox Code Playgroud)

但是,现在我已经添加了身份验证,这不再有效,因为浏览器在获取文档时没有在请求中包含身份验证令牌 - 所以我401-Unathorized从服务器得到了响应。

因此,我不能再依赖普通的 HTML 链接——我需要创建自己的 HTTP 请求,并显式添加身份验证令牌。但是,我如何确保用户体验与用户单击链接时的体验相同?理想情况下,我希望使用服务器建议的文件名保存文件,而不是通用文件名。

http-headers auth-token openid-connect angular

10
推荐指数
1
解决办法
9343
查看次数

如何使用ASP.NET MVC中的复选框创建选择列表?

我有一个数据库表,记录了允许用户访问的出版物.该表非常简单 - 它只存储用户ID /发布ID对:

CREATE TABLE UserPublication (UserId INTEGER, PublicationID INTEGER)
Run Code Online (Sandbox Code Playgroud)

给定用户和发布的记录的存在意味着用户具有访问权限; 没有记录意味着无法访问.

我想向管理员用户提供一个简单的屏幕,允许他们配置用户可以访问的出版物.我想为每个可能的出版物显示一个复选框,并检查用户当前可以访问的出版物.然后,管理员用户可以检查或取消检查任意数量的出版物并提交表单.

有各种各样的出版物类型,我想将类似类型的出版物组合在一起 - 所以我确实需要控制出版物的呈现方式(我不想只是有一个平面列表).

我的视图模型显然需要有一个所有出版物的列表(因为无论当前选择如何,我都需要显示它们),而且我还需要用户当前可以访问的出版物列表.(我不确定我是否会更好地使用单个列表,其中每个项目包括发布ID和是/否字段?).

但就我而言,这就是我的意思.我真的不知道如何将它绑定到一些复选框.我从哪里开始?

data-binding asp.net-mvc viewmodel asp.net-mvc-2

9
推荐指数
1
解决办法
4192
查看次数

我可以使用VS 2012创建Office 2007加载项吗?

这不建议:http://msdn.microsoft.com/en-us/library/ee519072(v = vs.110).aspx

但是,但是...... 真的吗?

Office 2007仍然无处不在 - 当然他们还没有放弃对它的支持吗?我需要支持它,似乎这意味着我不能使用VS2012.

或许这个限制只适用于RC?(请).或者它可能会创建2010年定位但仍可以在2007年运行的加载项?(抓着稻草).

告诉我它不是这样......

vsto office-2007 visual-studio visual-studio-2012

9
推荐指数
1
解决办法
6321
查看次数

如何在IIS7上安装asp.net mvc 2?

我开发了一个ASP.NET MVC 2网站,现在需要将它部署到我的Web服务器上.我已经克服了一些障碍,因为ASP.NET没有安装等等,但我现在已经到了可以提供普通内容文件的地步,如果我尝试点击我的一个MVC URL,我得到这个:

无法加载文件或程序集'System.Web.Mvc,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.该系统找不到指定的文件.

不足为奇,因为我没有安装MVC2.问题是,我找不到有关如何安装它的任何好信息!

微软下载中心列出了3个文件,其中没有一个看好:

ASP.NET-MVC-2-RTM-RELEASE-Notes.doc

AspNetMVC2_VS2008.exe

mvc2-ms-pl.zip

该网站并不打算解释文件实际是什么,但我认为最后一个文件是源代码.无论如何,这就是它的样子.发行说明没有任何帮助,因为它们都是关于在开发机器上安装的,实际上EXE的名称清楚地说明了所有关于Visual Studio集成的内容.

那么我该如何实际部署这个糟糕的东西呢?

Scott Gu的博客相关联的另一个选项是Microsoft Web Platform Installer.现在,我不想安装不仅仅是MVC2,而且我已经安装了IIS等,所以这看起来有点沉重.但这都是学术性的,因为它拒绝在我的服务器上运行,说"你的系统不受支持"或者说是这样的话.(服务器是Windows Server 2008 Standard SP2,所以我真的不知道它的问题是什么).

救命!

[荒谬的是,这应该是如此艰难 - 或者根本不是很难,但肯定是一个保守的秘密!]

asp.net-mvc iis-7

8
推荐指数
2
解决办法
1万
查看次数

如何让ELMAH使用SQL Server(权限问题)

我已经让ELMAH在我的(Cassini)开发服务器上工作了,并且非常满意它,但是现在我正试图将所有东西都移到我的生产服务器(IIS7),蜜月看起来就像结束了.

我已经超越了IIS7"陷阱",坦率地说可以在文档中更好地突出显示,如果我只是使用内存中的日志,那么它可以工作.

但是,我试图让它使用SQL Server日志(就像我在我的开发系统上那样),并且我得到了一个错误:

对象ELMAH_GetErrorsXml上的EXECUTE权限被拒绝

好吧,好吧.我知道如何授予数据库权限,但我真的很难理解我需要授予访问权限的用户和哪些存储过程/表.

让我感到困惑的是,我没有做任何这样的事情让它在我的开发服务器上工作.我能看到的唯一区别是,在我的开发服务器上它似乎连接为NT AUTHORITY\IUSR,而在我的生产服务器上它似乎连接为NT AUTHORITY\NETWORK SERVICE.(它只是使用可信连接,所以我没有明确配置它来做到这一点 - 我认为它与Web服务器有关).更新:我已经确定,因为我正在使用Cassini,它实际上是以我(管理员)而不是IUSR登录,这解释了为什么我没有得到任何权限问题.

在我的开发服务器上,IUSR帐户是公共数据库角色的成员,并且可以访问所需的数据库(再次作为"公共").没有明确授予对象级权限.[见上面的更新 - 这是无关紧要的].

在我的生产服务器上,我以完全相同的方式添加了NETWORK SERVICE(公共数据库角色,显式访问数据库为"public").然而,我得到了这个权限错误.为什么?!![请参阅上面的更新 - 我没有获得权限错误的唯一原因是因为我作为管理员运行].

而且,当然,如果它在本地工作的事实只是"运气",我将需要知道授予访问权限的SP /表.我的猜测是所有3个SP而不是表,但是(再次)看到一些使这个显式的文档会很好.

asp.net elmah sql-server-2008 visual-studio-2008

8
推荐指数
2
解决办法
4964
查看次数

当Web服务器返回JPEG图像(mime type image/jpeg)时,它是如何编码的?

如果您向Web服务器发出HTTP请求,并返回类型为image/jpeg的响应,那么二进制数据如何实际编码?它是通过线路的图像的原始字节级内容,还是它的一些基于字符的表示(例如base64)?

http mime-types

8
推荐指数
1
解决办法
9038
查看次数

我应该对第三方DLL(如JSON.NET)进行数字签名吗?

我有一个使用各种第三方库(如JSON.NET)构建的应用程序.

我想确保构成我的应用程序的所有DLL都经过数字签名,包括第三方.鉴于这些未经作者签名,我是否可以/我应该自己签署第三方签名?

release code-signing digital-certificate digital-signature

8
推荐指数
2
解决办法
2586
查看次数

如何让Glimpse与EF6合作?

编辑:底部添加堆栈跟踪.

我有一个ASP.NET MVC 5项目,它通过Entity Framework 6使用SQL Server数据库.

我将Glimpse(和Glimpse.MVC5)添加到项目中,这很好.

但是,当我添加Glimpse.EF6时,我的应用程序一旦尝试访问数据库就会抛出异常.例外是:

System.NotSupportedException

无法确定"System.Data.SqlClient.SqlClientFactory"类型的提供程序工厂的提供程序名称.确保在应用程序配置中安装或注册了ADO.NET提供程序.

这是怎么回事?仅供参考,connectionStrings我的web.config部分如下所示:

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=.; Initial Catalog=foo; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

...我的Application_Start方法看起来像这样:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    Database.SetInitializer(new WebApplication.Models.Storage.ApplicationDbInitializer());
}
Run Code Online (Sandbox Code Playgroud)

...我的上下文类看起来像这样:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Foo> Foos { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢任何帮助......


堆栈跟踪:

[NotSupportedException: Unable to determine the provider name for provider factory of type 'System.Data.SqlClient.SqlClientFactory'. Make …
Run Code Online (Sandbox Code Playgroud)

glimpse entity-framework-6 asp.net-mvc-5

8
推荐指数
1
解决办法
6268
查看次数

我可以从枚举中获取前n个元素,然后仍然使用枚举的其余部分吗?

假设我有一个IEnumerable<T>,我想获取第一个元素并将其余元素传递给其他代码.我可以使用前n个元素Take(n),但是如何在不导致枚举重新启动的情况下访问其余元素?

例如,假设我有一个ReadRecords接受CSV文件中的记录的方法IEnumerable<string>.现在假设在该方法中,我想读取第一个记录(标题),然后将剩余的记录传递给ReadDataRecords也采用的方法IEnumerable<string>.像这样:

void ReadCsv(IEnumerable<string> records)
{
    var headerRecord = records.Take(1);
    var dataRecords = ???

    ReadDataRecords(dataRecords);
}

void ReadDataRecords(IEnumerable<string> records)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我准备重新开始枚举,那么我可以使用dataRecords = records.Skip(1).但是,我不想重新启动它 - 事实上,它可能无法重新启动.

那么,有没有办法获取第一个记录,然后是剩余的记录(除了通过将所有值读入新的集合并重新枚举它们)?

.net c# linq

8
推荐指数
1
解决办法
704
查看次数