前段时间我为.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()像这样可能多次调用的开销是多少.
连接池已启用,因此我认为开销很小,第二种方法应该是最佳实践,但我只是想确保我的假设是正确的.
我有以下代码。对 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) 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\nstring 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\nRun Code Online (Sandbox Code Playgroud)\n 我遇到了一个奇怪的问题,我可以通过调用存储过程返回结果,但代码追溯失败.
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) 我有一个执行标准的控制台应用程序:
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实例的连接时。我在查明是什么原因时遇到了麻烦,例如:
.NET 4.5.2,VS15.0.0,Win10
任何想法表示赞赏,我不知所措是什么原因造成的。
编辑:似乎已经开始工作。我不确定为什么,但是升级到VS15.1可能成功了。谢谢大家的建议。
我使用带有队列触发器的 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
我当前正在映射网络驱动器并以这种方式连接到文件 (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) 我的问题始于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) 有谁知道是否System.Data.SqlClient.SqlConnection有自己的实现来访问SQL Server?或者它是否使用以下客户端之一:
SQLOLEDB)(已弃用)SQLNCLI)(已弃用)MSOLEDBSQL)我在我的应用程序中看到持续的死锁,即使它不执行 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) sqlconnection ×10
c# ×7
sql-server ×5
.net ×2
azure ×2
async-await ×1
asynchronous ×1
database ×1
idisposable ×1
sqlite ×1
ssms ×1
static ×1
using ×1