小编Rob*_*ner的帖子

摆脱SQL Server中的"魔术"数字

在代码中,可以指定一次全局可访问的常量/枚举/等,然后可以在整个应用程序中重用它们.这使得能够使用像'Mazda'这样有意义的名称而不是像'2'这样的数字.

我们希望在SQL Server存储过程中也这样做,但不确定实现它的最佳方法.

例如,对于下表(众所周知的汽车模式):

Car       ManufacturerId 
350Z       1
Hilux      2
Yaris      2

ManufacturerId   Name
1                Nissan
2                Toyota
Run Code Online (Sandbox Code Playgroud)

所以不要写作

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan
Run Code Online (Sandbox Code Playgroud)

我们想写类似的东西

SELECT * FROM Car WHERE ManufacturerId = @Nissan
Run Code Online (Sandbox Code Playgroud)

我们的一个限制是我们不能依赖于Manufacturer.Name在App的生命周期中保持不变.我们确实考虑过一个永远不会改变的"Code"列,并且这样的联接被查找:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId
WHERE m.Code = 'Nissan'
Run Code Online (Sandbox Code Playgroud)

我对此有点犹豫,因为它使用额外的连接和字符串比较,可以拼写错误.

无需在每个存储过程中声明变量,最好的方法是什么?

sql sql-server

5
推荐指数
1
解决办法
1056
查看次数

在ASP.NET MVC中在回发之间保留复杂数据

我正在开发一个ASP.NET MVC 2应用程序,它连接到一些服务来进行数据检索和更新.这些服务要求我在更新数据时提供原始实体以及更新的实体.这样做可以改变跟踪和乐观并发.服务无法更改.

我的问题是我需要以某种方式在回发之间存储原始实体.在WebForms中,我会使用ViewState,但从我读过的内容来看,这就是MVC.原始值不必是防篡改证明,因为服务将它们视为不可信.实体将是(最大)1k,它是一个内联网应用程序.

我提出的选择是:

  1. 会话 - 排除 - 将实体存储在会话中,但我不喜欢这个想法,因为没有计划在之间共享会话
  2. URL - 排除 - 数据太大
  3. HiddenField - 将序列化实体存储在隐藏字段中,可能使用加密/编码
  4. HiddenVersion - 实体上有一个(SQL)版本字段,我可以放入隐藏字段.然后在保存中,我从服务中获取"原始"实体并比较版本,执行我自己的乐观并发.
  5. Cookies - 像3或4,但使用cookie而不是隐藏字段

我倾向于选项4,尽管3会更简单.这些有效的选择还是我走错了路?有没有更好的方法呢?

asp.net-mvc asp.net-mvc-2

5
推荐指数
1
解决办法
4199
查看次数

为什么带有绑定的 WPF UserControl 不会被垃圾收集?

我们的应用程序从它的主窗口中添加和删除 WPF (4.0) UserControls,我们注意到它们没有收集垃圾(通过从不返回 null 的 WeakReferences)。似乎如果 UserControl 具有绑定,即使从未将控件添加到树中,也会发生这种情况。控制台应用程序中最简单的复制如下:

主程序

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var obj = GetObj();
        var ctl = GetCtl();
        for (int x = 0; x < 4; x++)
        {
            GC.Collect();
            Thread.Sleep(1000);
        }
        bool objAlive = obj.IsAlive;
        bool ctlAlive = ctl.IsAlive;
        Console.WriteLine(objAlive + "-" + ctlAlive);
        Console.ReadLine();
    }

    private static WeakReference GetObj()
    {
        return new WeakReference(new object());
    }

    private static WeakReference GetCtl()
    {
        return new WeakReference(new MyCtl());
    }
}
Run Code Online (Sandbox Code Playgroud)

MyCtl 用户控件(后面的代码是标准的,没有被修改 …

wpf garbage-collection memory-leaks

5
推荐指数
1
解决办法
3069
查看次数

如何使用C#从指定的上下文菜单中获取父控件?

我在Windows窗体上有一些listview控件,我已经使用VS2005中的属性网格为它们分配了一个共同的contextmenustrip.

现在,当从任何列表视图中的contextmenu进行选择时,有没有办法可以获得对凸起菜单的正确宿主控制?

.net forms listview contextmenu

4
推荐指数
1
解决办法
4447
查看次数

同一存储过程的不同执行计划

我们的生产系统有一个约5秒的查询,但在我们的镜像系统上(尽可能与生产相同)和开发系统需要不到1秒.

我们检查了查询计划,我们可以看到它们有所不同.同样从这些计划中我们可以看出为什么一个人比另一个人服用更长时间.数据,schame和服务器类似,存储过程相同.

我们知道如何通过重新排列的加入,增加提示来解决它,但是此刻它会更容易,如果我们没有做对存储过程(文书)的任何变化.我们还尝试了一个sp_recompile.

什么可能导致两个查询计划之间的差异?

系统:Win2k3 Enterprise上的SQL 2005 SP2 Enterprise

更新:感谢您的回复,结果证明这是统计数据.见下面的摘要.

sql sql-server stored-procedures sql-server-2005 sql-execution-plan

4
推荐指数
1
解决办法
5154
查看次数

如何在LINQ中的子表上创建where条件

这是对另一个问题的答案部分中的这个问题的回应.

我有一个Orders集合,每个Order订购OrderItems的集合,每个OrderItem都有一个PartId.使用LINQ如何实现以下SQL语句:

1)选择具有特定零件ID的所有订单

SELECT *
FROM Order
WHERE Id in (SELECT OrderId FROM OrderItems WHERE PartId = 100)
Run Code Online (Sandbox Code Playgroud)

2)选择Order.OrderNumber和OrderItem.PartName

SELECT Order.OrderNumber, OrderItem.PartName
FROM Order INNER JOIN OrderItem ON Order.Id = OrderItem.OrderId
WHERE OrderItem.partId = 100
Run Code Online (Sandbox Code Playgroud)

3)选择Order.OrderNumber和整个OrderItem细节:

SELECT Order.OrderNumber, OrderItem.*
FROM Order INNER JOIN OrderItem ON Order.Id = OrderItem.OrderId
WHERE OrderItem.partId = 100
Run Code Online (Sandbox Code Playgroud)

.net linq

4
推荐指数
1
解决办法
3851
查看次数

将十六进制字符串转换为字节数组(.NET)的最佳方法是什么?

我有一个十六进制字符串,我需要转换为字节数组.最好的方法(即有效和最少的代码)是:

string hexstr = "683A2134";
byte[] bytes = new byte[hexstr.Length/2];
for(int x = 0; x < bytes.Length; x++)
{
    bytes[x] = Convert.ToByte(hexstr.Substring(x * 2, 2), 16);
}
Run Code Online (Sandbox Code Playgroud)

在我有32位值的情况下,我可以执行以下操作:

string hexstr = "683A2134";
byte[] bytes = BitConverter.GetBytes(Convert.ToInt32(hexstr, 16)); 
Run Code Online (Sandbox Code Playgroud)

然而,在一般情况下呢?有没有更好的内置功能,或更清晰(不必更快,但仍然高性能)这样做的方式?

我更喜欢内置函数,因为除了这个特殊的转换之外,似乎有一个用于所有东西(很常见的东西).

.net hex

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