小编Sea*_*ley的帖子

SQL存储过程中的动态排序

这是我过去花了几个小时研究的问题.在我看来,这应该是现代RDBMS解决方案应该解决的问题,但到目前为止,我还没有发现任何真正解决我认为在具有数据库后端的任何Web或Windows应用程序中非常普遍的需求.

我说的是动态排序.在我的幻想世界中,它应该像以下一样简单:

ORDER BY @sortCol1, @sortCol2
Run Code Online (Sandbox Code Playgroud)

这是遍布Internet 的新手SQL和存储过程开发人员给出的典型示例."为什么这不可能?" 他们问.总是有人最终会向他们讲述存储过程的编译性质,一般的执行计划,以及为什么不能将参数直接放入ORDER BY子句的各种其他原因.


我知道你们中有些人已经在想:"让客户进行排序." 当然,这会从数据库中卸载工作.然而,在我们的案例中,我们的数据库服务器甚至没有在99%的时间里出汗,它们甚至还没有多核,或者每6个月发生一次对系统架构的任何其他改进.仅仅因为这个原因,让我们的数据库处理排序不会有问题.另外,数据库非常好擅长排序.它们已针对它进行了优化,并且已经有多年时间才能做到正确,这样做的语言非常灵活,直观且简单,而且最重要的是,任何初学SQL编写者都知道如何去做,更重要的是他们知道如何编辑它,进行更改,进行维护等等.当您的数据库远非被征税而您只想简化(并缩短!)开发时间时,这似乎是一个明显的选择.

然后是网络问题.我已经使用了JavaScript来对HTML表进行客户端排序,但是它们不可避免地对我的需求不够灵活,而且,因为我的数据库没有过度征税而且可以非常容易地进行排序,我很难证明重写或滚动我自己的JavaScript分拣机所需的时间.服务器端排序通常也是如此,尽管它已经比JavaScript更受欢迎了.我不是特别喜欢DataSet的开销的人,所以起诉我.

但这又说明了这是不可能的 - 或者更确切地说,不容易.在先前的系统中,我已经完成了一种令人难以置信的黑客方式来获得动态排序.它不漂亮,不直观,简单或灵活,初学者SQL编写器会在几秒钟内丢失.这已经不仅仅是一个"解决方案",而是一个"复杂化".


以下示例并不意味着公开任何类型的最佳实践或良好的编码风格或任何内容,也不表示我作为T-SQL程序员的能力.他们就是这样,我完全承认他们是混乱,糟糕的形式,只是简单的黑客.

我们将一个整数值作为参数传递给存储过程(让我们调用参数只是"排序"),然后从中确定一堆其他变量.例如......让我们说sort是1(或默认值):

DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)

SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';

IF @sort = 1                -- Default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'asc';
    SET @sortCol2 = @col2; …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sorting stored-procedures

126
推荐指数
6
解决办法
6万
查看次数

C#获取控件在表单上的位置

当控件可能在其他控件(如Panel)中时,有没有办法检索控件在窗体中的位置?

控件的Left和Top属性只给出了它在父控件中的位置,但如果我的控件位于五个嵌套面板中,我需要它在窗体上的位置怎么办?

快速举例:

按钮btnA位于面板pnlB内的坐标(10,10)上.
面板pnlB位于形式frmC内的坐标(15,15)上.

我想要btnA在frmC上的位置,这是(25,25).

我可以获得这个位置吗?

c# controls winforms

65
推荐指数
5
解决办法
11万
查看次数

使用整数列将美国邮政编码存储在数据库中是一个好主意吗?

乍一看,我认为在数据库表中存储邮政编码有两个基本选择:

  1. 文本(可能是最常见的),即char(5)varchar(9)支持+4扩展
  2. 数字,即32位整数

如果我们假设没有国际问题,两者都将满足数据的要求.在过去,我们通常只是走了文本路线,但我想知道是否有人做相反的事情?只是简单的比较看起来整数方法有两个明显的优点:

  • 通过它的性质,它仅仅自动限于数字(而没有验证,文本样式可以存储字母,据我所知,这些字母在邮政编码中无效).这并不意味着我们可以/将/应该放弃正常验证用户输入!
  • 它占用的空间更少,为4个字节(即使对于9位邮政编码也应该足够),而不是5或9个字节.

而且,它似乎不会对显示输出造成太大影响.打一个ToString()数值,使用简单的字符串操作来插入连字符或空格或其他任何+4扩展名都是微不足道的,并使用字符串格式来恢复前导零.

是否有什么可以阻止使用int仅限美国邮政编码的数据类型?

database database-design types postal-code street-address

51
推荐指数
6
解决办法
4万
查看次数

如何使用缩写的时区显示DateTime?

我知道System.TimeZone类以及DateTime.ToString()方法的许多用法.我无法找到的是一种将DateTime转换为字符串的方法,除了时间和日期信息之外,还包含三个字母的Time Zone缩写(事实上,与StackOverflow的相对工具提示大致相同)时间显示工作).

为了让每个人都能轻松地关注和消费,让我们继续使用StackOverflow示例.如果查看相对时间显示的工具提示,它将显示完整日期,时间包括12小时格式的秒数,AM/PM指定,然后是三字母时区缩写(在他们的情况下为Coordinated)世界时间).我意识到我可以通过使用内置方法轻松获得GMT或UTC,但我真正想要的是它本地的时间 - 在这种情况下,在Web服务器上.

如果我们的Web服务器正在运行Windows Server 2k3并且它的时区设置为CST(或者,直到夏令时切换回来,CDT就是它?),我希望我们的ASP.NET Web应用程序显示相对于该时区的DateTimes以及格式化以在结尾显示"CST".我意识到我可以很容易地对其进行硬编码,但为了健壮,我真的更喜欢基于运行代码的OS环境设置的服务器的解决方案.

现在,除了时区缩写,我使用以下代码:

myDateTime.ToString("MM/dd/yyyy hh:mm:ss tt")
Run Code Online (Sandbox Code Playgroud)

哪个显示:

10/07/2008 03:40:31 PM

所有我想要的(并没有多少,许诺!)是这样说的:

10/07/2008 03:40:31 PM CDT

我可以使用System.TimeZone.CurrentTimeZone并使用它来正确显示"Central Daylight Time"但是......为了简洁起见,这有点太长了.我是不是写了一个字符串操作例程来去掉白色空格和任何非大写字母?虽然这可能有用,但这对我来说似乎非常糟糕......

谷歌搜索和环顾四周并没有产生任何适用于我的具体问题.

.net formatting timezone datetime tostring

38
推荐指数
4
解决办法
3万
查看次数

如何在SQL Server Reporting Services中最好地显示CheckBox?

我们遇到的众多报告服务的怪癖之一就是完全缺乏CheckBox控件甚至是远程类似的东西.

我们有一个表格应根据从数据库中提取的信息自动填写.我们有几个位数据类型字段.打印出"True"或"False"只是看起来很傻,因为它应该看起来像是一个自动填写的表单,所以我们想要一系列复选框和标签,可以选中也可以不选中.

我们正在运行SSRS 2005,但我不知道SSRS 2008添加了CheckBox控件.即使这样,我们也需要暂时替代.到目前为止我们发现的最好的是:

  1. 使用Wingdings
  2. 使用图像
  3. 使用带边框的文本框并打印空白/空格或大写字母X.

所有这三种方法都需要IIF表达恶作剧.

Wingdings的方法似乎可以接受,并且是最美观的,除了无论出于什么原因它并不总是正确打印.更重要的是,PDF导出,无论出于何种原因,将所有字体(通常)转换为Arial,因此我们得到了时髦的字母,而不是Windings dingbats.

作为基于像素的光栅的图像在沿文本等侧向矢量打印时效果不佳.除非小心处理,否则它们会拉伸,像素化,并做其他不专业的事情.

虽然这些方法确实有效(有些方法有上述限制),但它们都不是特别优雅.

我们缺少明显的东西吗? 不是很明显?微软的某个人是否有充分的理由为什么SSRS 2000中没有提供这样的控制,更不用说2个版本和8年之后?这不是第一次出现这个问题......

reportingservices-2005 reporting-services

30
推荐指数
5
解决办法
5万
查看次数

如何在TemplateFields,Data Binding和GridView中使用HtmlEncode

我有一个绑定到ObjectDataSource的GridView.我也支持编辑,这很好用.但是,我想安全地显示HtmlEncode文本,因为我们允许在某些字段中使用特殊字符.这与标准的BoundFields有关,因为我只是将HtmlEncode设置为true.

但是为了设置验证控件,需要使用TemplateFields.如何轻松添加HtmlEncoding以这种方式输出?这是一个ASP.NET 2.0项目,所以我正在使用更新的数据绑定快捷方式(例如EvalBind).

我想做的是如下:

<asp:TemplateField HeaderText="Description">
    <EditItemTemplate>
        <asp:TextBox ID="TextBoxDescription" runat="server"
                     Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'
                     ValidationGroup="EditItemGrid"
                     MaxLength="30" />
        <asp:Validator ... />
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="LabelDescription" runat="server"
                   Text='<%# System.Web.HttpUtility.HtmlEncode(Eval("Description")) %>' />
    </ItemTemplate>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)

但是,当我这样尝试时,我收到以下错误:

CS0103:当前上下文中不存在名称"Bind"

asp.net data-binding gridview html-encode templatefield

23
推荐指数
4
解决办法
5万
查看次数

我应该在App.xaml中声明转换器还是作为每个文件资源?

在WPF应用程序中声明转换器时,我应该:

  1. 在App.xaml(即in )中声明我的所有转换器,<Application.Resources/>以便它可供整个应用程序使用
  2. 在其部分中仅声明每个Page/ Window/ ResourceDictionary/ UserControl等所需的转换器Resources
  3. 还有别的东西

关于可读性,方法1对我来说似乎是最好的,但我的问题是关于性能.哪种方法在性能,内存等方面最具资源效率?

wpf performance ivalueconverter

15
推荐指数
1
解决办法
6232
查看次数

存在哪些预先存在的服务来计算两个地址之间的距离?

我想实现一种方法来显示按给定地址的接近度排序的存储地址列表.

列表中的地址将存储在数据库表中.单独的部分有单独的字段(我们有邮政编码,城市名称等字段)所以它不仅仅是一个巨人varchar.这些是用户输入的,由于系统的性质可能并不总是完整的(有些可能缺少邮政编码,而其他可能只有城市和州).

虽然这是用于Intranet应用程序,但我使用外部资源(包括访问Internet Web服务等)没有任何问题.我实际上更喜欢滚动自己,除非做自己是微不足道的.如果谷歌或雅虎!已经提供免费服务,我非常愿意查看.关键字是它必须​​是免费的,因为我不能自由地为这个功能引入任何额外的费用,因为它已经是一个奖励"额外"可以说.

我正在考虑这个问题,就像许多实体商店在做"寻找位置"功能一样.在一个简单的表格中显示它并进行适当的排序并显示距离(例如,英里)很棒.显示地图混搭甚至更酷,但我绝对可以忍受距离回来,我处理所有后续的显示和排序.

简单距离算法的问题是数据的性质.由于全部或部分地址可能未定义,因此我没有像lat/long coords那样方便的东西.此外,即使我要求邮政编码,90%的地址可能会有相同的五个邮政编码.

虽然它不需要非常快,但是由于延迟而在页面上显示超过7秒的任何内容对于普通用户来说可能太长了,正如我们所知.如果这样的假设服务支持一次发送一批地址而不是一次查询一个地址,那就太好了.尽管如此,我不应该认为地址列表总数将超过50个.

algorithm distance geolocation

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

与DataReader一起使用时,输出参数不可读

当使用DataReader对象通过存储过程从数据库(例如SQL Server)访问数据时,在执行之前添加到Command对象的任何输出参数在读取后都不会被填充.我可以很好地读取行数据,以及所有输入参数,但不能读取输出参数.

.net parameters ado.net stored-procedures datareader

10
推荐指数
1
解决办法
6331
查看次数

如何使用仪表式进度条?

在Vista/7中,Windows资源管理器外壳窗口使用一种特殊的静态进度条来显示硬盘空间.

使用默认样式时,此栏为蓝色且未设置动画.当它接近满(低磁盘空间)时,它也会变成红色.

使用消息传递,我可以告诉Windows Forms ProgressBar控件将其状态更新为Paused和Error(分别为黄色和红色),这样可以正常工作,但这些仍然是特定于进度的.

Windows用户体验指南中,它特别指出了进度条的这个"米"变体:

此模式不是进度条,但它是使用进度条控件实现的.仪表具有独特的外观,可以将它们与真正的进度条区分开来.

他们说它"是使用进度条控件实现的",所以......怎么样?我可以向控件发送什么消息让它以这种方式运行?

我已经看到你可以发送用于设置条形颜色的消息,但文档说在启用视觉样式时会忽略这些调用.原始ProgressBar控件的Windows API文档中没有任何其他内容似乎提示了一种方法.我只是坚持制作一个自定义绘制栏?我真的很想尽可能利用操作系统,以便应用程序在不同的操作系统版本中显得一致.我意识到Vista之前的版本可能不会支持这一点.

我正在寻找一个Windows窗体的解决方案,但我不知道,如果它甚至暴露在所有通过的Win32 API.

explorer winforms progress-bar

10
推荐指数
1
解决办法
3253
查看次数