标签: sqlconnection

在c#中创建新SqlConnection的开销

前段时间我为.net应用程序编写了一个ORM层,其中所有数据库行都由一个子类表示DatabaseRecord.有许多的类似方法Load(),Save()在我最初的实现我创建的构造到数据库的连接等等.DatabaseRecord例如,

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString
);
Run Code Online (Sandbox Code Playgroud)

然后我打电话Open(),并Close()在该SQLConnection在我的方法,其访问数据库的开头和结尾.这对我来说(作为熟悉编程但对c#和.net不熟悉的人)是最有效的做事方式 - 有一个连接并在课堂上必要时打开/关闭它.

我刚刚做了一些阅读,似乎在许多地方推荐这种模式:

using (var connection = new SqlConnection(...)) {
    connection.Open();
    // Stuff with the connection
    connection.Close();
}
Run Code Online (Sandbox Code Playgroud)

我可以看到为什么它是可取的 - Dispose()即使您在中间执行的操作导致未捕获的异常,连接也会自动进行.我只是想知道new SqlConnection()像这样可能多次调用的开销是多少.

连接池已启用,因此我认为开销很小,第二种方法应该是最佳实践,但我只是想确保我的假设是正确的.

.net c# database sqlconnection

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

SqlConnection.OpenAsync() 退出而不抛出异常

我有以下代码。对 connection.OpenAsync() 的调用会毫无例外地退出程序。甚至调用方方法上的 finally 也不会被调用。程序针对.NET45 知道吗?

更新:这是与 .Wait() 一起使用的父代码。当在下面的子方法中调用 connection.OpenAsync() 时,它会在父代码中没有 .Wait() 的情况下退出。

        static void Main(string[] args)
        {
            UpdateSqlDatabase updateSqlDatabase = new UpdateSqlDatabase(args);
            updateSqlDatabase.UpdateDatabaseSchemaAsync().Wait();
        }
Run Code Online (Sandbox Code Playgroud)

在一系列异步方法调用之后:

    public async Task<T> ExecuteQueryAsync<T>(string connectionString, string commandText, IDictionary<string, object> parameters, Func<SqlDataReader, T> rowMapFunc)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            try
            {
                await connection.OpenAsync();
            }
            catch (Exception ex)
            {
            }

            SqlCommand command = connection.CreateCommand();
            command.CommandType = CommandType.Text;
            command.CommandText = commandText;
            if (parameters != null)
            {
                foreach (var item in parameters)
                {
                    command.Parameters.AddWithValue(item.Key, item.Value); …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous sqlconnection async-await

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

SQLConnection 使用随机命名管道而不是 tcp

SQLConnection 使用随机命名管道(445) 而不是tcp(1433)。命名管道端口被我们的防火墙阻止,但 tcp 未被阻止。仅当尝试连接到我们的 SQL 服务器之一时才会发生这种情况。大多数时候应用程序使用 TCP,但随机尝试使用命名管道端口。我们的 sql 连接非常简单,我们没有做任何花哨的事情。

\n\n

我们不想在连接字符串上硬编码 TCP 端口。我们已经尝试过并且解决了问题。该问题仅在上周出现,并且我们尝试连接的 Web 应用程序已运行一段时间。

\n\n

为什么sql连接有时会尝试连接445而不是1433?这是 .net 最新更新引入的错误还是服务器可以指定要使用的下一个端口?

\n\n

更新 2016-09-23 11:00

\n\n

这是我们用于连接的代码示例

\n\n
string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True";\nusing (SqlConnection connection = new SqlConnection(connectionString))\n{\n    try {\n        connection.Open(); \n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

.net c# sql-server sqlconnection

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

SqlDataReader的Connection属性为Null

我遇到了一个奇怪的问题,我可以通过调用存储过程返回结果,但代码追溯失败.

public IEnumerable<T> ExecuteStoredProcedure<T>(string storedProcedureName, IDataMapper<T> mapper, IDictionary<string, object> parameters)
{
    using (var connection = new SqlConnection(connectionString))
    {
        using (var cmd = new SqlCommand(storedProcedureName, connection))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (var key in parameters.Keys)
            {
                cmd.Parameters.AddWithValue(key, parameters[key]);
            }
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            //return MapRecordsToDTOs(reader, mapper);

            //let's test:
            IEnumerable<T> result = MapRecordsToDTOs(reader, mapper);
            var x = (new List<T>(result)).Count;
            System.Diagnostics.Debug.WriteLine(x);
            return result;
        }
    }
}


private static IEnumerable<T> MapRecordsToDTOs<T>(SqlDataReader reader, IDataMapper<T> mapper)
{
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            System.Diagnostics.Debug.WriteLine(reader["Id"]); //what's …
Run Code Online (Sandbox Code Playgroud)

c# idisposable using sqlconnection sqldatareader

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

VS2017上的SQL Server连接超时

我有一个执行标准的控制台应用程序:

new SqlConnection("<connection string>").Open()
Run Code Online (Sandbox Code Playgroud)

但由于以下异常(最终)而超时:

System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。(提供者:TCP提供程序,错误:0-等待操作超时。)---> System.ComponentModel.Win32Exception(0x80004005):等待操作超时

尝试打开与(Azure托管)SQL Server 12实例的连接时。我在查明是什么原因时遇到了麻烦,例如:

  1. 它仅在VS2017中发生。VS2015运行完全相同的代码。
  2. 我在同一个解决方案中通过SSMS,LINQPad和ASP.NET项目连接到数据库没有问题(即使在使用2017时)。
  3. 连接超时设置为30秒。
  4. 它仅在调试模式下运行时发生。
  5. 连接到本地数据库时也会发生这种情况。

.NET 4.5.2,VS15.0.0,Win10

任何想法表示赞赏,我不知所措是什么原因造成的。

编辑:似乎已经开始工作。我不确定为什么,但是升级到VS15.1可能成功了。谢谢大家的建议。

c# sql-server sqlconnection azure visual-studio-2017

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

Azure Functions 静态 SqlConnection - 正确的扩展方式?

我使用带有队列触发器的 Azure Functions 来处理部分工作负载。特定函数查询数据库,这会产生扩展问题,因为大量并发函数实例 ping 数据库会导致 Azrue DB 连接的最大允许数量不断受到影响。

本文https://learn.microsoft.com/en-us/azure/azure-functions/manage-connections将 HttpClient 列为应设为静态的资源之一。是否也应该使用静态 SqlConnection 将数据库访问设为静态来解决此问题,或者通过保留常量连接对象会导致其他问题吗?

static sqlconnection azure azure-sql-database azure-functions

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

通过网络连接到 SQLite 数据库

我当前正在映射网络驱动器并以这种方式连接到文件 (Z:\Data\Database.db)。我希望能够在连接字符串中使用相对路径 (\server\Data\Database.db),但它给了我一个 SQLite 错误“无法打开数据库文件”。检查Directory.Exists(\\server\Data\Database.db);返回 true。

以下是使用路径“\\server”作为参数打开连接的尝试:

public static OpenDB(string dbPath)
{
    using (SQLiteConnection conn = new SQLiteConnection($"Data Source={Path.Combine(dbPath, "Data\\Database.db")}"))
    {
        if (dbPath != null && dbPath != "")
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Unable to Open Database", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# sqlite sqlconnection

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

ExecuteReader 比 SSMS 慢得多

我的问题始于Entity Framework查询执行速度非常慢(约 2 分钟)。所以我开始调查

同时,问题似乎也在标准中SqlConnection

我有一个非常简单的查询

SELECT 1 AS [C1], [Extent1].[OldReleaseID] AS [OldReleaseID], [Extent1].[ProductName] AS [ProductName], [Extent1].[Price] AS [Price], [Extent1].[DiscountAmount] AS [DiscountAmount], [Extent1].[DiscountRate] AS [DiscountRate], [Extent1].[AbsorbVat] AS [AbsorbVat], [Extent1].[SerialCode] AS [SerialCode], [Extent1].[BrandName] AS [BrandName] FROM [dbo].[LocalSaleProductExts]() AS [Extent1]
Run Code Online (Sandbox Code Playgroud)

当我运行它时,SSMS它会在 0-1 秒内执行并返回大约 30k 行

同样的精确查询在 .net 中运行ExecuteReader大约 100 秒!

在线研究基本上指出了 2 个解决方案:ARITHABORT 和参数嗅探,所以为了好玩,我将所有这些添加到 SSMS 中

DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
SET ARITHABORT OFF
Run Code Online (Sandbox Code Playgroud)

还有0-1秒。

在我的代码中我添加了SET ARITHABORT ON. 这是我的简单代码

Using sc = New SqlClient.SqlConnection("data …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms sqlconnection executereader

5
推荐指数
0
解决办法
663
查看次数

System.Data.SqlClient.SqlConnection的底层驱动程序

有谁知道是否System.Data.SqlClient.SqlConnection有自己的实现来访问SQL Server?或者它是否使用以下客户端之一:

  • SQL Server 的 OLE DB 提供程序( SQLOLEDB)(已弃用)
  • SQL Server Native Client ( SQLNCLI)(已弃用)
  • SQL Server 的 OLE DB 驱动程序( MSOLEDBSQL)

c# sql-server sqlconnection

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

仅插入新行而不执行任何选择时 SQL Server 死锁

我在我的应用程序中看到持续的死锁,即使它不执行 select 语句、delete 语句和 update 语句。它只是插入全新的数据。

TL;DR:这似乎与外键有关。如果我删除它,那么我根本不会遇到任何死锁。但由于显而易见的原因,这不是一个可接受的解决方案。

鉴于下表结构

CREATE TABLE [dbo].[IncomingFile]
(
    [Id] UNIQUEIDENTIFIER NOT NULL, 
    [ConcurrencyVersion] RowVersion NOT NULL,
    CONSTRAINT [PK_IncomingFile] PRIMARY KEY CLUSTERED([Id])
)
GO

CREATE TABLE [dbo].[IncomingFileEvent]
(
    [Id] UNIQUEIDENTIFIER NOT NULL, 
    [ConcurrencyVersion] RowVersion NOT NULL,
    [IncomingFileId] UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT [PK_IncomingFileEvent] PRIMARY KEY CLUSTERED([Id]),
    CONSTRAINT [FK_IncomingFileEvent_IncomingFileId]
        FOREIGN KEY ([IncomingFileId])
        REFERENCES [dbo].[IncomingFile] ([Id])
)
GO
Run Code Online (Sandbox Code Playgroud)

当我遇到多个并发任务插入数据时,我总是看到一个死锁。READ_COMMITTED_SNAPSHOT在我的数据库选项中启用(即使我没有阅读)。

这是将重现该问题的代码。如果您没有遇到问题,请增加NumberOfTasksPerCpu程序顶部的常量。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlconnection database-deadlocks sqltransaction

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