Tag: tsql ado.net

C#SQL顶部作为参数

尝试在我的sql语句中参数化TOP的值。 SELECT TOP @topparam * from table1 command.Parameters.Add("@topparam",SqlDbType.VarChar, 10).Value = somevalue.ToString(); 这似乎并不奏效。 任何人有任何build议? 只是为了澄清,我不想使用存储过程。

在SQL LIKE子句中使用SqlParameter不起作用

我有以下代码: const string Sql = @"select distinct [name] from tblCustomers left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');"; using (var command = new SqlCommand(Sql, Connection)) { command.Parameters.AddWithValue("@SEARCH", searchString); … } 这不起作用,我也试过这个: const string Sql = @"select distinct [name] from tblCustomers left outer join tblCustomerInfo on tblCustomers.Id = […]

如何以编程方式检查(parsing)TSQL语句的有效性?

我试图让我的集成testing更幂等。 一个想法是在每次testing之后执行回滚,另一个想法是如何以编程方式parsing文本,类似于查询分析器或SSMS中的绿色checkbox。 如何让SQL Serverparsing我的命令而不使用ADO.NET运行它? 更新:这是最后如期工作: using (DbCommand executeOnly = Factory.DbCommand()) { executeOnly.Connection = command.Connection; executeOnly.CommandType = CommandType.Text; executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand; executeOnly.Connection.Open(); executeOnly.ExecuteNonQuery(); } //set more properties of command. command.Execute(); 由于无法解释的原因,“ SET PARSEONLY ON ”只能用于查询分析器。 我无法在ADO.NET连接上进行设置。 这也是因为PARSEONLY似乎只捕捉语法错误,这不是一个常见的错误。 SET NOEXEC ON将捕获更广泛的错误,比如在存储过程中引用缺less的表或列或缺less参数的视图。

SQL:更新一行并返回1个查询的列值

我需要更新表中的一行,并从中获取列值。 我可以这样做 UPDATE Items SET Clicks = Clicks + 1 WHERE Id = @Id; SELECT Name FROM Items WHERE Id = @Id 这将生成2个计划/访问表。 在T-SQL中可能会修改UPDATE语句以更新并返回名称列只有1个计划/访问? 我正在使用C#,ADO.NET ExecuteScalar()或ExecuteReader()方法。

SQL Server:跨池连接的隔离级别泄漏

正如前面的Stack Overflow问题( TransactionScope和Connection Pooling以及SqlConnection如何pipe理IsolationLevel? )所展示的,事务隔离级别在与SQL Server和ADO.NET(也是System.Transactions和EF)的池化连接之间泄漏,因为它们构build在ADO.NET)。 这意味着,任何应用程序都可能发生以下危险的事件序列: 发生请求需要显式事务来确保数据一致性 任何其他请求都不使用显式事务,因为它只是在进行不重要的读取。 这个请求现在将作为可序列化执行, 可能导致危险的阻塞和死锁 问题: 防止这种情况的最好方法是什么? 现在到处都需要使用明确的交易吗? 这里是一个独立的repro。 您将看到第三个查询将从第二个查询inheritanceSerializable级别。 class Program { static void Main(string[] args) { RunTest(null); RunTest(IsolationLevel.Serializable); RunTest(null); Console.ReadKey(); } static void RunTest(IsolationLevel? isolationLevel) { using (var tran = isolationLevel == null ? null : new TransactionScope(0, new TransactionOptions() { IsolationLevel = isolationLevel.Value })) using (var […]

SET NOCOUNT ON用法

受到SET NOCOUNT有不同观点的这个问题的启发… 我们应该使用SQL Server的SET NOCOUNT ON吗? 如果没有,为什么不呢? 它的作用编辑6,2011年7月22日 它抑制任何DML之后的“xx rows affected”消息。 这是一个结果集,当发送时,客户端必须处理它。 它很小,但是可以测量(见下面的答案) 对于触发器等,客户端将收到多个“受影响的xx行”,这会导致一些ORM,MS Access,JPA等所有错误的方式(见下面的编辑) 背景: 一般接受的最佳实践(我认为,直到这个问题)是在SQL Server中的触发器和存储过程中使用SET NOCOUNT ON 。 我们在任何地方都使用它,并且快速的谷歌显示了许多SQL Server MVP也同意。 MSDN说这可以打破.net SQLDataAdapter 。 现在,这意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它期望“n行受影响”消息匹配。 所以,我不能使用: 如果存在,以避免重复(不受行影响的消息) 注意:谨慎使用 不存在(更less行然后预期 过滤出微不足道的更新(例如,实际上没有数据发生变化) 做任何表访问之前(如日志logging) 隐藏复杂性或denormlisation 等等 在marc_s(谁知道他的SQL的东西)的问题说,不要使用它。 这与我认为的不同(我也认为我自己在SQL方面也有点胜任)。 有可能我错过了一些东西(随便指出一些明显的东西),但是你们有什么想法呢? 注意:我看到这个错误已经有好几年了,因为我现在不使用SQLDataAdapter。 评论和问题后编辑: 编辑:更多的想法… 我们有多个客户端:一个可以使用C#SQLDataAdaptor,另一个可以使用Java的nHibernate。 SET NOCOUNT ON可能会以不同的方式影响这些SET NOCOUNT ON 。 如果你把存储过程看作是方法,那么为了你自己的目的,假定某些内部处理以某种方式工作,这是坏forms(反模式)。 编辑2: 触发打破nHibernate问题 ,其中SET NOCOUNT ON不能设置 […]