Tag: ado.net

我应该将任务包装在另一个任务中,还是应该只返回创建的任务?

我正在构建一个使用ADO.NET的.NET 4.0应用程序,所以我不能使用async / await。 我不想要一个解决方案,但我想知道以下哪些实现最好,为什么。 我的unit testing通过所有三个实现,但我想知道这三个之间的区别。 #1嵌套任务 在我的第一个实现中,我将任务包装在另一个任务中。 我认为搞两个任务对性能不利,但我不确定。 public virtual Task ExecuteReaderAsync(IDbCommand dbCommand, CancellationToken cancellationToken) { return Task.Factory.StartNew(() => { var sqlCommand = CheckIfSqlCommand(dbCommand); PrepareExecuteReader(dbCommand); return Task .Factory .FromAsync(sqlCommand.BeginExecuteReader, sqlCommand.EndExecuteReader, null) .Result; }, cancellationToken); } #2使用TaskCompletionSource 然后我尝试将结果包装在TaskCompletionSource所以我只有一个任务。 public virtual Task ExecuteReaderAsync(IDbCommand dbCommand, CancellationToken cancellationToken) { var taskCompletionSource = new TaskCompletionSource(); var sqlCommand = […]

如何在C#中检测DataReader上的EOF而不执行Read()

我熟悉使用.Read()来检测EOF using (IDataReader reader = SqlHelper.ExecuteReader(_connectionString, “dbo.GetOrders”)) { AssertOrder(reader); while (reader.Read()) { yield return FillRecord(reader, StringComparer.OrdinalIgnoreCase); } reader.Close(); } 由于我遇到了一些奇怪的情况,FillRecord实际上推动了读者。 所以现在while循环中的.Read()实际上会导致这个函数跳过一些行 – 因为我们正在前进两次。 我希望有一个IDataReader.EOF,但没有。 有什么想法吗?

为什么要设置命令对象参数的size参数呢?

我们的数据访问层使用命令对象与sql server进行通信。 在大多数情况下,我已将字段大小(与sql server中的列大小相匹配)硬编码到命令参数构建器中。 如: SqlParameter param = new SqlParameter(“@name”, NVarChar, 4000); 在这里指定一个值(在这个例子中为4000)而不是将其保留为0有什么好处? 当列大小更改时,必须重新编译时会很痛苦。

ADO.NET:更快速地检查数据库服务器是否可访问?

目前我正在使用此代码检查数据库是否可访问: public bool IsDatabaseOnline(string con) { bool isConnected = false; SQLConnection connect = null; try { connect = new SQLConnection(con); connect.Open(); isConnected = true; } catch (Exception e) { isConnected = false; } finally { if (connect != null) connect.Close(); } return isConnected; } 虽然这段代码工作得很好,但是有一个缺点。 如果服务器不在线,它会花费大约4整秒的时间尝试打开连接,然后再决定它不可用。 有没有办法测试连接而不试图实际打开它并等待超时? 像数据库相当于ping的东西?

错误:将nvarchar数据类型转换为smalldatetime数据类型会导致超出范围的值

嘿所有我正在尝试执行以下插入查询 SqlDataSource userQuizDataSource = new SqlDataSource(); userQuizDataSource.ConnectionString = “Data Source=localhost\\SQLEXPRESS;Initial Catalog=quizApp;Integrated Security=True”; userQuizDataSource.InsertCommand = “INSERT INTO [UserQuiz] ([DateTimeComplete], [Score], [UserName]) VALUES (@DateTimeComplete, @Score, @UserName)”; userQuizDataSource.InsertParameters.Add(“DateTimeComplete”, DateTime.Now.ToString()); userQuizDataSource.InsertParameters.Add(“Score”, score.ToString()); userQuizDataSource.InsertParameters.Add(“UserName”, User.Identity.Name); int rowsAffected = userQuizDataSource.Insert(); Buti不断收到以下错误: 将nvarchar数据类型转换为smalldatetime数据类型会导致超出范围的值。 该语句已终止。 谁能帮我吗?

数据库中的一些数据更改。 如何触发一些C#代码在这些更改上做一些工作?

假设我有一个带有数据库的应用程序A. 现在我想添加另一个应用程序B,它应该跟踪应用程序A的数据库更改。应用程序B应该在数据发生变化时进行一些计算。 两个应用程序之间没有直接通信。 两者都只能看到数据库。 基本问题是:数据库中的某些数据发生了变化。 如何触发一些C#代码在这些更改上做一些工作? 为了给出答案的一些刺激,我提到了一些我正在考虑的方法: 使应用程序B轮询感兴趣的表中的更改。 优点:简单的方法。 缺点:流量很大,特别是涉及到许多表时。 引入触发器,触发某些事件。 当他们开火时,他们应该在“事件表”中写入一些条目。 应用程序B只需要轮询该“事件表”。 优势:减少流量。 缺点:逻辑以触发器的forms放入数据库。 (这不是触发器“邪恶”的问题。这是一个设计问题,这使它成为一个劣势。) 摆脱轮询方法并使用SqlDependency类来获取更改通知。 优势:(也许?)流量少于轮询方式。 缺点:不是数据库独立的。 (我知道ODP.NET中的OracleDependency,但其他数据库呢?) 什么方法更有利? 也许我已经错过了上述方法中的一些主要(dis)优势? 也许还有其他一些我没有想到的方法? 编辑1:数据库独立性是…让我们称之为“销售人员”的一个因素。 我可以使用SqlDependency或OracleDependency。 对于DB2或其他数据库,我可以回退到轮询方法。 这只是一个成本和收益的问题,我想至少考虑一下,所以我可以讨论它。

当DbDataAdapter.Update调用时,为什么我使用ODP.NET OracleDataAdapter获取OracleTruncateException而不使用System.Data.OracleClient的适配器?

我做了以下事情: protected int CreateComponent(DbConnection cnctn, string tableName) { int newId; DbCommand selectCmd = _provFactory.CreateCommand(); selectCmd.Connection = cnctn; selectCmd.CommandText = string.Format( “SELECT * FROM {0} WHERE ID = (SELECT MAX(ID) FROM {0})”, tableName); DbDataAdapter dataAdapter = _provFactory.CreateDataAdapter(); dataAdapter.SelectCommand = selectCmd; … // create Insert/Update/Delete commands with a builder for the data adapter … dataAdapter.Fill(_dataSet, tableName); newId […]

在ListView控件中隐藏ID列

我将ListView控件绑定到DataTable。 DataTable有一个名为ProductID的列。 有没有办法隐藏这个专栏,因为我以后需要它的价值?

EF Linq to Entities在实体集上调用ToList()会生成包含多个左外连接的SQL命令

我的实体“Progetto”映射名为VW_AMY_PRG_WCS_Lookup的视图 Progetto有五个导航属性:ClienteDiFatturazione,ClienteDiLavorazione,PercentualeSuccesso,Agente具有多重性0..1和DocumentiWcs具有mupltiplicity * 当我在LINQPad中运行这个简单的语句时 var prj = Progetti.AsQueryable(); prj.ToList(); 生成的sql是 SELECT [Extent1].[IdProgetto] AS [IdProgetto], [Extent1].[IdSerie_Progetto] AS [IdSerie_Progetto], [Extent1].[Importo] AS [Importo], [Extent1].[Data_Prevista_Chiusura] AS [Data_Prevista_Chiusura], [Extent1].[IdStato] AS [IdStato], [Extent1].[Oggetto] AS [Oggetto], [Extent1].[IdMezzo_Pervenuto] AS [IdMezzo_Pervenuto], [Extent1].[IdAgente] AS [IdAgente], [Extent1].[Fido_Residuo] AS [Fido_Residuo], [Extent2].[IdAnagrafica_Fatturazione] AS [IdAnagrafica_Fatturazione], [Extent3].[IdAnagrafica_Lavorazione] AS [IdAnagrafica_Lavorazione], [Extent4].[IdPercentuale_Successo] AS [IdPercentuale_Successo] FROM (SELECT [VW_AMY_PRG_WCS_Lookup].[IdProgetto] AS [IdProgetto], [VW_AMY_PRG_WCS_Lookup].[IdSerie_Progetto] AS [IdSerie_Progetto], […]

非常缓慢的foreach循环

我正在开发一个现有的应用程序。 此应用程序从大文件中读取数据,然后在进行一些计算后,将数据存储在另一个表中。 但这样做的循环(见下文)需要很长时间。 由于文件有时包含1,000条记录,因此整个过程需要数天。 我可以用其他东西替换这个foreach循环吗? 我尝试使用Parallel.ForEach ,它确实有所帮助。 我是新手,所以非常感谢你的帮助。 foreach (record someredord Somereport.r) { try { using (var command = new SqlCommand(“[procname]”, sqlConn)) { command.CommandTimeout = 0; command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(…); IAsyncResult result = command.BeginExecuteReader(); while (!result.IsCompleted) { System.Threading.Thread.Sleep(10); } command.EndExecuteReader(result); } } catch (Exception e) { … } } 在查看答案后,我删除了Async并使用了编辑后的代码。 但这并没有改善性能。 using (command = new […]