小编Pau*_*aul的帖子

C#和SQL Server Management Studio中SQL查询的执行时间差异很大

我有一个简单的SQL查询,当从C#运行时需要超过30秒,然后每次超时,而在SQL Server Management Studio上运行时立即成功完成.在后一种情况下,查询执行计划不会显示任何麻烦,并且通过一些简单的操作可以很好地传播执行时间.

EXEC sp_who2在查询从C#运行时运行' ',它被列为占用29,000毫秒的CPU时间,并且没有被任何东西阻止.

我不知道如何开始解决这个问题.有没有人有一些见解?

查询是:

SELECT
    c.lngId,
    ...
FROM tblCase c
    INNER JOIN tblCaseStatus s ON s.lngId = c.lngId
    INNER JOIN tblCaseStatusType t ON t.lngId = s.lngId
    INNER JOIN [Another Database]..tblCompany cm ON cm.lngId = cs.lngCompanyId
WHERE t.lngId = 25
    AND c.IsDeleted = 0
    AND s.lngStatus = 1
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server timeout execution-time

5
推荐指数
1
解决办法
3190
查看次数

SQL Server AlwaysOn 中的脏读

我有一对 SQL Server 2014 数据库,设置为同步 AlwaysOn 可用性组。

两台服务器均设置为Synchronous commit可用性模式,会话超时时间为 50 秒。次级设置为Read-intent only可读辅助设备。

如果我写入主数据库,然后立即从辅助数据库读取(通过ApplicationIntent=ReadOnly),我会始终读取脏数据(即写入之前的状态)。如果我在写入和读取之间等待大约一秒钟,我就会得到正确的数据。

这是预期的行为吗?如果是这样,我可以采取什么措施来确保从辅助设备读取的数据是最新的?

我想使用辅助数据库作为主数据库的只读版本(以及故障转移),以减少主数据库的负载。

sql sql-server acid alwayson

5
推荐指数
1
解决办法
1154
查看次数

如何从发布管道/ ARM模板设置应用程序见解

我们有一个Azure DevOps发布管道,该管道在一个位置设置了我们所有的Azure资源。我可以使用ARM模板成功创建所有内容,但是我正在努力将App Service与App Insights资源链接起来。

如果是手动执行的操作,请单击App Service的AppInsights刀片中的“打开网站扩展”按钮(在标题“通过网站扩展启用应用程序见解而无需重新部署代码”下)。

我尝试在发布管道中添加“ Azure App Service管理”步骤,设置为安装“ Azure App Service的Application Insights扩展”扩展:

安装AppInsights的发布管道步骤的屏幕快照

另外,我在发布管道中添加了“ Azure App Service管理”步骤,设置为“启用连续监视”:

启用持续监视的发布管道步骤的屏幕快照

但是结果仍然是AppInsights已连接,但未安装扩展:

显示扩展名未打开的Azure Portal的屏幕截图

有什么办法可以自动执行此操作吗?通过ARM模板,PowerShell脚本还是其他?

编辑:在“扩展”刀片中,我可以看到“ Azure App Service的Application Insights扩展”(v2.6.5)和“ ASP.NET Core Logging扩展”(v2.2.0),但是仍然需要“打开”网站上的网站扩展”中的“ Aplication Insights”边栏。

azure azure-application-insights azure-web-app-service azure-devops azure-pipelines-release-pipeline

5
推荐指数
2
解决办法
1449
查看次数

在C#中使用正则表达式删除括号

我想从SQL字符串中删除方括号,但仅限于其中没有空格的位置.

例如"SELECT [intId],[Description]"应返回"SELECT intId,[Description]".

我可以使用正则表达式获取方括号内部没有空格:

\[[^\s]*\]
Run Code Online (Sandbox Code Playgroud)

如何从原始字符串中删除这些匹配的方括号?

c# regex string replace

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

存储过程是否存在

我有一个SQL Server 2008 R2数据库,其中存储过程可能存在也可能不存在.

如果我运行sp_help spThing,它会返回一行,就像它存在一样(名称:spThing,所有者:dbo,类型:存储过程).

如果我尝试创建一个具有相同名称的新存储过程,我会收到错误"数据库中已存在名为'spThing'的对象".

如果我运行SELECT OBJECT_ID('dbo.spThing'),它返回NULL.

如果我运行EXEC spThing,它会说"无法找到存储过程'spThing'".

如果我跑DROP spThing,它说"不能放弃程序'spThing',因为它不存在或你没有权限".

如果我跑SELECT * FROM sys.objects WHERE name = 'spThing',我没有排.

如果我跑SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'spThing',我没有排.

所有这些都是作为管理用户从同一连接运行的.

存储过程是否存在?

编辑:

SP本身是一个微不足道的选择,沿着以下方式:

CREATE PROCEDURE spThing
    @Param int
AS
BEGIN

    SELECT strThing
    FROM tblThing
    WHERE lngParam = @Param;

END
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures

4
推荐指数
1
解决办法
5034
查看次数

从 C# 确定 SQL Server 数据库列的默认值

我需要从 .Net 查找 SQL Server 2005 或 2008 数据库中列的默认值。

我的第一次尝试是执行存储过程:

sp_help @objname
Run Code Online (Sandbox Code Playgroud)

@objname桌子在哪里。然后在返回的第七个表(约束表)中,我将使用constraint_keys默认约束的值。当我从 SQL Server Management Studio 运行此查询时,它的行为符合预期,但当我从 C# 代码运行它时,该constraint_keys列为空(尽管所有其他列都已填充)。

我的第二次尝试是使用:

SELECT name, [text]
FROM syscomments com
    INNER JOIN syscolumns col ON com.id = col.cdefault
WHERE col.id = object_id(@Table)
    AND col.cdefault > 0
Run Code Online (Sandbox Code Playgroud)

这在 SQL Server Management Studio 中也可以正常工作。然而,当我从 .Net 运行它时,它不返回任何行。

额外的:

.Net 代码示例(使用企业库):

    private DataTable GetDefaults(string tablename string database)
    {            
        var db = DatabaseEL.Create(database);

        string sql = @"
            SELECT name, [text]
            FROM syscomments com …
Run Code Online (Sandbox Code Playgroud)

.net c# t-sql sql-server database-schema

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

通过删除和重新创建来加速非常慢的T-SQL存储过程

我在T-SQL中有一个简单的存储过程,从SQL Server Management Studio运行时是即时的,并且有一个简单的执行计划.它用在C#网络前端,通常很快,但偶尔似乎会让自己陷入一种状态,它会在那里停留并超时.然后它从任何Web服务器始终如一地执行此操作.修复它的唯一方法就是删除并重新创建它.它只发生在应用程序中使用的几百个类似过程中的单个存储过程中.

我正在寻找一个答案,它比每隔n分钟测试一次服务并在超时时删除并重新创建更好.

c# t-sql stored-procedures sql-server-2005

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

在C#中重用与HttpWebRequest的连接

我需要使用.Net发出POST请求.

我可以通过GET进行身份验证,因此我尝试在同一连接上发出POST请求以保持身份验证.

问题是我得到401 Not Authenticated异常,这意味着连接没有被重用.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");

request.GetResponse().Close();  // Works fine

// Now the request I want to make...

request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");

request.Method = "post";

string postData = "param1=1&param2=2";
byte[] data = new ASCIIEncoding().GetBytes(postData);
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
    stream.Close();
    request.GetResponse().Close();      // This line gets a 401 Not Authorized error.
}
Run Code Online (Sandbox Code Playgroud)

编辑:有一些建议,我需要传输cookie.以下内容也不起作用:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = …
Run Code Online (Sandbox Code Playgroud)

c# http httpwebrequest httprequest

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