Tag: ado.net

连接池

我有以下代码,如果我最后使用conn == null,我仍然使用连接池? 我知道关闭连接是一个好习惯但是如何处理整个连接对象呢? public void ExecuteNonQuery(SqlCommand Cmd) { //========== Connection ==========// SqlConnection Conn = new SqlConnection(strConStr); try { //========== Open Connection ==========// Conn.Open(); //========== Execute Command ==========// Cmd.Connection = Conn; Cmd.CommandTimeout = 180; Cmd.ExecuteNonQuery(); } catch (Exception Exc) { throw Exc; } finally { //======== Closing Connection ========// if (Conn.State == ConnectionState.Open) { Conn.Close(); […]

ADO.NET CommandBuilder,InsertCommand和Default Constraints

我正在将数据从表A复制到表B.表B有一个可为空的列,其默认约束值为0.通常,我使用以下访问器设置列的值。 public object this[string columnName] { get { return DataTable.Rows[CurrentRow][columnName]; } set { DataTable.Rows[CurrentRow][columnName] = value; } } 但我没有设置我的可空列X. 插入整行时,不使用默认值。 而不是0,为可空列插入了NULL。 _sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter); _sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; _sqlCommandBuilder.SetAllValues = false; _sqlDataAdapter.Update(DataTable); 我也得到了架构: _sqlDataAdapter.Fill(DataTable); _sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped); 为什么我的列X的ADO.NET设置为NULL虽然我没有设置它? 我认为当我没有设置列X的值时,ADO.NET从给定的约束中获取默认值。 ADO.NET CommandBuilder是否能够使用默认约束?

SSMS SMO对象:获取查询结果

我遇到了本教程,了解如何使用GO语句执行SQL脚本。 现在我想知道我能得到消息TAB的输出。 使用几个GO语句,输出将如下所示: 1行受影响 受影响的912行 … 但是server.ConnectionContext.ExecuteNonQuery()只能返回一个int,而我需要所有的文本。 如果查询的某些部分存在某些错误,则应将其也放在输出中。 任何帮助,将不胜感激。

SqlConnection.Open vs SqlConnection.OpenAsync – 这两者之间的区别是什么?

编辑:这归结为为什么只更改SqlConnection.Open()以等待异步代码中的SqlConnection.OpenAsync()导致强烈不同的行为。 除了明显的异步行为之外,异步代码中的同步代码中的SqlConnection.Open调用和等待SqlConnection.OpenAsync调用之间的区别是什么? 底层连接是否与数据库异步? OpenAsync上的文档是精简版, https: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.openasync%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396。 Open的异步版本,它使用ConnectionString指定的设置打开数据库连接。 此方法使用CancellationToken.None调用虚方法OpenAsync。(从DbConnectioninheritance。) 我觉得有趣的是,之前连接字符串中需要async = true,而在.net 4.5+中则不再需要它。 连接的行为有何不同? https://msdn.microsoft.com/en-us/library/hh211418(v=vs.110).aspx 从.NET Framework 4.5开始,这些方法不再需要在连接字符串中使用Asynchronous Processing = true。 当我碰巧在异步应用程序中使用同步SqlConnection.Open并加载它时,我发现它执行得非常糟糕,早期运行连接池。 我希望打开连接是阻塞的,但是,在这些连接上执行异步命令(通过dapper)的行为有所不同。 那么,OpenAsync的做法有何不同? 编辑: 作为重现问题的请求代码(或者可能表现出差异)。 在执行大约180个并发异步命令时遇到运行此情况的Open()连接超时,使用OpenAsync()即使在超过300个并发命令时也不会遇到exception。 您可以推动并发以最终使其超时,但它肯定会更深入地执行并发命令。 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Dapper; using Nito.AsyncEx; namespace AsyncSqlConnectionTest { class […]

有没有办法在ADO.NETentity framework中为关联添加额外的字段?

我希望能够模拟多对多关系,其中包含关于关系的额外细节。 例如: Person: int id, String name Project: int id, String name ProjectPerson: Person.id, Project.id, String role 每当我在EF中创建ProjectPerson关联时,我都无法将role属性添加到关联中。 如果我在我的数据库中创建表,然后将其导入模型,我将失去额外的属性。

如果数据表的主键是两列,可以使用DataTable.Contains(对象键)吗?

如果是这样的话?

取消DataAdapter.Fill()

场景:我们有一个附加到DataAdapter(datatable)的DataGridView,我们在一个单独的线程中使用(adapter.fill(query,datatable))在datatable中加载数据(使用delegate和beginInvoke),一旦加载了数据,我们附加了数据表到datagridview(在主线程中) 有没有办法可以检查fill()是否仍在执行并取消它。 真实场景:用户单击用户名,相应的数据将加载到数据网格中。 有时,用户不耐烦并点击另一个用户(这里我要取消之前的填充并开始新的填充) 更新:我们保留两个DataApdater(和两个DataTables),我们将一个数据表附加到datagridview,并开始异步地将数据加载到另一个数据表。 加载数据时,我们只需将datagridview绑定到我们刚刚填充的DataTable(并开始异步加载以前的数据)这样UI将始终获取当前数据(无需用户在UI上等待刷新或挂起)

从数据集中获取过滤后的数据到数据表

如何将数据集中的数据过滤到数据表? 喜欢代码 – > DataRow[] dr = DS.Tables[0] .Select(“STAGENAME=’Develop’ AND DEVLAPSEDAYS IS NOT NULL”); 我如何在这里使用数据表? 以下代码并不反映更改 – > DataTable FilteredDataD = DS.Tables[0]; if (FilteredDataD.Rows.Count > 0) { FilteredDataD.DefaultView.RowFilter = “STAGENAME=’Develop’ AND DEVLAPSEDAYS IS NOT NULL”; FilteredDataD.DefaultView.ToTable(); } 是否可以使用上面的filter删除列,例如“STAGENAME =’Develop’和DEVLAPSEDAYS IS NOT NULL”+ FilteredDataD.column(“col_name”)…假设我有5列只显示4,我不能删除我的查询中的col_name。有办法吗? 答复

有没有办法使用ADO.NET来确定数据库中是否存在与任何数据提供程序一起使用的表?

有没有办法使用ADO.NET来确定数据库中是否存在与任何数据提供程序一起使用的表? 我现在正在做这样的事情: bool DoesTableExist(string tableName) { DbCommand command = this.dbConnection.CreateCommand(); command.CommandText = “SELECT 1 FROM ” + tableName; try { using (DbDataReader reader = command.ExecuteReader()) { return true; } } catch (DbException) { return false; } } 我希望有一种方法不涉及捕获exception。

ADO.Net SQLCommand.ExecuteReader()减慢或挂起

环境: 应用程序(用C#编写.Net 4)最多有10个线程,每个线程在自己的AppDomain中运行。 每个线程都使用ADO.Net DataReader从SQL-Server 2008上获取存储过程的结果。另外一个线程可以使用ADO.Net来执行写操作(Bulk Insert)。 一切都在本地机器上运行。 问题#1: 偶尔(大约每30次运行)线程的执行会急剧减慢。 当DataReader获取存储过程结果时会发生这种情况 – SqlCommand.ExecuteReader()。 通常读操作在10秒内执行。 当它减速时,它会在10-20分钟内执行。 SQLProfiler显示正在查询数据,但速度很慢。 调用减速的问题(请注意,没有例外): at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32 ) at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len) at System.Data.SqlClient.TdsParserStateObject.ReadString(Int32 length) at System.Data.SqlClient.TdsParser.ReadSqlStringValue(SqlBuffer value, Byte type, […]