小编Dav*_*vid的帖子

嵌套存储过程包含TRY CATCH ROLLBACK模式?

我对以下模式的副作用和潜在问题很感兴趣:

CREATE PROCEDURE [Name]
AS
BEGIN
    BEGIN TRANSACTION
    BEGIN TRY
        [...Perform work, call nested procedures...]
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
        RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
    END CATCH
END
Run Code Online (Sandbox Code Playgroud)

据我所知,当使用单个过程时,此模式是合理的 - 过程将完成所有语句而不会出错,或者它将回滚所有操作并报告错误.

但是,当一个存储过程调用另一个存储过程来执行某个子工作单元时(理解为较小的过程有时会单独调用),我看到与回滚有关的问题 - 一条信息性消息(级别16)发表声明The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION..我假设是因为子过程中的回滚总是回滚最外层事务,而不仅仅是子过程中启动的事务.

我确实希望整个事情回滚并在发生任何错误时中止(并且错误报告给客户端作为SQL错误),我只是不确定外层试图回滚事务的所有副作用已经回滚过了.也许@@TRANCOUNT在每个TRY CATCH层进行回滚之前检查一下?

最后是客户端(Linq2SQL),它有自己的事务层:

try
{
    var context = new MyDataContext();
    using (var transaction = new TransactionScope())
    {       
            // Some Linq stuff
        context.SubmitChanges();
        context.MyStoredProcedure();
        transactionComplete();
    }
}
catch
{
    // An …
Run Code Online (Sandbox Code Playgroud)

stored-procedures transactions sql-server-2005 linq-to-sql

54
推荐指数
2
解决办法
3万
查看次数

确定是否可以将反射属性指定为null

我希望自动发现有关提供的类的一些信息,以执行类似于表单输入的操作.具体来说,我使用反射为每个属性返回PropertyInfo值.我可以从我的"表单"中读取或写入每个属性的值,但如果属性被定义为"int",我将无法编写空值,我的程序甚至不能尝试.

如何使用反射来确定是否可以为给定属性分配空值,而无需编写switch语句来检查每种可能的类型?特别是我想检测像"int"和"int?"这样的盒装类型之间的区别,因为在第二种情况下我确实希望能够写出一个空值.IsValueType和IsByRef似乎没有区别.

public class MyClass
{
    // Should tell me I cannot assign a null
    public int Age {get; set;} 
    public DateTime BirthDate {get; set;}
    public MyStateEnum State {get; set;}
    public MyCCStruct CreditCard {get; set;}

    // Should tell me I can assign a null
    public DateTime? DateOfDeath {get; set;}
    public MyFamilyClass Famly {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

请注意,我需要在实际尝试写入值之前很久才确定此信息,因此使用围绕SetValue的异常处理不是一种选择.

.net c# reflection

35
推荐指数
3
解决办法
1万
查看次数

如何更改.ASPX自动格式设置(Visual Studio)

在.aspx文件(在本例中为MVC视图)中键入代码时,Visual Studio会应用两种类型的格式,一种是常规html标记结构(可以从Tools-> Options-> Text Editors-> Html控制).另一个是<%%>标签内的内容.

第二种类型的自动格式化,<%%>内容格式化,我遇到了两个烦恼.

首先是如何将新行添加到语句块:

如果我输入:

<% if(condition) { %>
    ...
<% } %>
Run Code Online (Sandbox Code Playgroud)

它是自动修正的:

<% if(condition) 
   { %>
    ...
<% } %>
Run Code Online (Sandbox Code Playgroud)

如果这是一个.cs文件,那么校正是正确的,对于.aspx文件的标签汤,我发现第一个更具可读性.有没有办法在不影响.cs文件格式的情况下关闭此行为?

第二,每当我写这样的东西:

<%=Html.ActionLink("Report","ListItems") %>
Run Code Online (Sandbox Code Playgroud)

我无法找到一种方法让它自动格式化为此(在适当的位置添加间距):

<%=Html.ActionLink("Report", "ListItems") %>
Run Code Online (Sandbox Code Playgroud)

在代码中,您通常需要一个; 或}}表示您已完成代码行/部分,以便Visual Studio可以对其进行格式化.有没有办法为<%=表达式提供此信号?

澄清

此问题是关于<%%>标记内的代码格式,而不会影响常规C#源文件的格式.它在第一段中说我完全了解Text Editors菜单.

asp.net formatting visual-studio-2008

34
推荐指数
1
解决办法
5872
查看次数

强类型动态Linq排序

我正在尝试构建一些代码来动态排序Linq IQueryable <>.

显而易见的方法是在这里,使用字符串字符串对列表进行排序
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/

但是,我想要一个更改 - 编译字段名称的时间检查,以及使用重构/查找所有引用来支持以后的维护的能力.这意味着我想将字段定义为f => f.Name,而不是字符串.

对于我的具体用途,我想封装一些代码,这些代码将决定应该根据用户输入使用命名的"OrderBy"表达式列表中的哪一个,而不必每次都编写不同的代码.

这是我写的内容的要点:

var list = from m Movies select m; // Get our list

var sorter = list.GetSorter(...); // Pass in some global user settings object

sorter.AddSort("NAME", m=>m.Name);
sorter.AddSort("YEAR", m=>m.Year).ThenBy(m=>m.Year);

list = sorter.GetSortedList();

...
public class Sorter<TSource>
...
public static Sorter<TSource> GetSorter(this IQueryable<TSource> source, ...)
Run Code Online (Sandbox Code Playgroud)

GetSortedList函数确定要使用哪个命名排序,这会产生List对象,其中每个FieldData包含在AddSort中传递的字段的MethodInfo和Type值:

public SorterItem<TSource> AddSort(Func<T, TKey> field)
{
   MethodInfo ... = field.Method;
   Type ... = TypeOf(TKey);
   // Create item, add item to diction, add fields to …
Run Code Online (Sandbox Code Playgroud)

.net c# linq

25
推荐指数
3
解决办法
1万
查看次数

对于属性/方法/成员,是否存在类型的C#?

Type可以通过多种方式获得类元数据.其中两个是:

var typeInfo = Type.GetType("MyClass")

var typeInfo = typeof(MyClass)

第二种方式的优点是编译器会捕获拼写错误,并且IDE可以理解我正在谈论的内容(允许重构等功能而不会默默地破坏代码)

是否存在强烈引用元数据和反射的成员/属性/方法的等效方法?我可以更换:

var propertyInfo = typeof(MyClass).GetProperty("MyProperty")

有类似的东西:

var propertyInfo = property(MyClass.MyProperty)

.net c# reflection

18
推荐指数
3
解决办法
3706
查看次数

在SQL Server Management Studio中将持久计算列标记为NOT NULL

在SQL Server 2005中可以创建一个既持久又被定义为NOT NULL的计算列(不能包含空值).第二个属性在使用像Linq2Sql这样的库时很重要,如果我们想避免大量的手工工作来确保我们的代码列'always'有一个值.

使用直接SQL,这非常简单:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

在SQL Server Management Studio的设计窗口中查看时,此列正确显示为计算列,没有"允许空值"的复选标记.但是,我遇到了在设计器中创建新列以匹配此模式的问题:在计算列规范 - >(公式)属性中输入公式,并通过将Is Persisted设置为Yes,但尝试取消选中来指定持久属性新计算列上的'允许空值'会产生一个对话框,指出"属性无法修改".

我需要涵盖广泛的技能水平,为此我需要提供添加列的程序,即使是新手也可以遵循(这意味着Management Studio设计器窗口).在SQL Server Management Studio中是否有一些秘密用于在设计器中创建一个新的计算列为NOT NULL,类似于如何使用CTRL + 0将空值插入到单元格中?

sql-server ssms sql-server-2005

16
推荐指数
2
解决办法
1万
查看次数

仅在Silverlight DataGrid中突出显示整行

当用户单击数据网格中的一行(或使用键盘)时,该行被选中,但他们点击的特定单元格也被赋予了自己的特殊焦点.这对于数据编辑网格来说很好,但我试图创建更像是一个打开的对话框,显示列表中每个项目的属性,所以......

是否可以配置(只读)DataGrid,以便用户只能选择或关注整个行,而不是单个字段.

如果这是不可能的,是否有一种优雅的方式只选择第一个元素 - 例如在标准的Windows打开对话框中,如果更改为"详细信息"视图,则每行有多个列(文件名,创建日期,大小等) ),但您只能突出显示文件名列中的项目.

silverlight silverlight-2.0

12
推荐指数
1
解决办法
1万
查看次数

检查时间范围重叠,守望者问题[SQL]

我遇到了一个更大问题的路障.

作为大型查询的一部分,我需要解决"守夜人"问题.我有一张表,其中包括日程安排班次:

ID | Start          | End
1  | 2009-1-1 06:00 | 2009-1-1 14:00
2  | 2009-1-1 10:00 | 2009-1-1 18:00
3  | 2009-2-1 20:00 | 2009-2-2 04:00
4  | 2009-2-2 06:00 | 2009-2-2 14:00
Run Code Online (Sandbox Code Playgroud)

作为查询的一部分,我需要确定在给定时间范围内房间内是否至少有一名守望者.

因此,如果我将范围指定2009-1-1 06:002009-1-1 12:00,则结果为真,因为第1和第2轮合并以涵盖此时间段 - 实际上可以链接任意数量的轮班以保持监视.但是,如果我检查2009-2-1 22:002009-1-2 10:00,结果是错误的,因为第二天早上4点到6点之间有休息时间.

我想实现这个无论是在LINQ,或在SQL Server(2005)的用户定义的函数,在这两种情况下,这仅仅是一个必须运行来标识需要注意的元素一个大的查询逻辑的一部分.真实数据集涉及与任何给定时间段相交的大约一百个移位记录,但并不总是覆盖整个范围.

我发现的最接近的是 如何使用SQL Server范围值进行分组,但是它取决于在下一个范围开始之前结束的每个范围.如果我可以构建相同的手表统一视图,只考虑重叠的手表,那么检查是否涵盖了特定时间将是微不足道的.统一视图如下所示:

Start          | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00
Run Code Online (Sandbox Code Playgroud)

注意:通过拉动所有数据并在其上运行一些手动循环来实现整个过程相对容易,但这是当前的系统,并且由于班次的数量和必须的时间范围的数量,它相当慢被检查.

sql t-sql algorithm sql-server-2005 linq-to-sql

8
推荐指数
1
解决办法
9359
查看次数

Silverlight:查找布局中所有类型的控件

我正在寻找一种可靠的方法来构建一个包含在特定<Panel>派生控件中的<Type>控件列表 - 这包括那些直接子节点,以及那些是子节点的子节点等等.

最明显的方法是递归地执行:
添加列出<Type>的此控件的任何子项,然后为此控件的任何子项重复函数,该控件是<Panel>或descendant.

但是我担心这不会在树中找到所有控件 - 任何ContentControl也可能包含<Type>的控件,HeaderedContentControl或具有一个或多个子/内容属性的任何其他类似控件也是如此.

是否有任何方法可以对实际布局树执行搜索,以便可以找到没有特定父级的特定控件类型的任何实例?

.net silverlight controls children silverlight-3.0

7
推荐指数
1
解决办法
7703
查看次数

如何描述(枚举)对Salesforce中特定记录类型有效的选项列表?

在顶点代码中,我想枚举一个选项列表字段的合法值.要做到这一点,我可以调用Account.Foobar__c.getDescribe().getPickListValues(),我有一个Schema.PickListEntry值列表.

但是,可以为给定的sObject设置多个记录类型.例如,帐户可能具有"制造商","分销商"和"零售商"记录类型.在Salesforce设置中,可以根据记录类型编辑(限制)每个字段的选项列表条目.因此,零售商类型帐户可能仅使用Foobar字段的选项列表值的子集.

所以基本上我想要的Account.Foobar__c.getDescribe().getPickListValues('Retailer')不过这不是语法.validFor方法看起来很有希望,但看起来它只适用于字段相关的选项列表 - 仅按记录类型过滤的选项列表返回false isDependentPicklist.

reflection salesforce

7
推荐指数
2
解决办法
6557
查看次数