小编DCN*_*YAM的帖子

DROP ... CREATE vs ALTER

在创建存储过程,视图,函数等时,最好对对象执行DROP ... CREATE或ALTER吗?

我已经看过许多"标准"文件,说明要做DROP ... CREATE,但我看到了许多提倡ALTER方法的评论和论据.

ALTER方法保留了安全性,而我听说DROP ... CREATE方法在第一次执行时强制重新编译整个SP而不仅仅是一个语句级别的重新编译.

有人可以告诉我,如果使用一个优于另一个有其他优点/缺点吗?

sql t-sql sql-server

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

实体框架存储过程与生成的SQL

我在几个项目中使用了实体框架.在每个项目中,我都使用映射到实体的存储过程,因为存储过程的众所周知的好处 - 安全性,可维护性等.但是,99%的存储过程是基本的CRUD存储过程.这似乎否定了实体框架的一个主要的,节省时间的功能 - SQL生成.

我已经从实体框架中读到了一些关于存储过程与生成的SQL的争论.虽然使用CRUD SP更好的安全性,并且EF生成的SQL通常比必要的更复杂,它是否真的在性能或可维护性方面购买任何东西来使用SP?

以下是我的看法:

  • 大多数情况下,修改SP无论如何都需要更新数据模型.因此,在可维护性方面并没有太大的收获.
  • 对于Web应用程序,与数据库的连接使用特定于应用程序的单个用户标识.因此,用户甚至没有直接的数据库访问权限.这降低了安全性.
  • 对于小型应用程序,使用生成的SQL的性能略有下降可能不是什么大问题.对于大批量,性能关键的应用,EF甚至是明智的选择吗?另外,EF生成的插入/更新/删除语句真的那么糟糕吗?
  • 将每个属性发送到存储过程都有自己的性能损失,而EF生成的代码只发送实际更改的属性.在对大型表进行更新时,增加的网络流量和更新所有属性的开销可能会抵消存储过程的性能优势.

话虽如此,我的具体问题是:

上面列出的我的信念是否正确?ORM现在越来越流行,是不是总是使用SP这个"旧学校"的想法?根据您的经验,哪种方式更适合使用EF - 为所有插入/更新/删除映射SP,或者使用EF生成的SQL进行CRUD操作,而只使用SP进行更复杂的操作?

entity-framework entity-framework-4

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

在SQL Server 2008中存储文档的最佳策略

我们的一个团队将开发一个应用程序来存储SQL2008数据库中的记录,并且每个记录都有一个相关的PDF文件.目前有大约340GB的文件,大多数(70%)大约是100K,但有些是几兆字节.数据主要是插入和读取,但文件有时会更新.我们正在讨论以下选项:

  1. 将文件存储为数据库中的BLOB.

  2. 将文件存储在数据库之外,并将路径存储在数据库中.

  3. 使用SQL2008的文件流功能来存储文件.

我们已经阅读了有关文件流数据的Micrsoft最佳实践,但由于文件大小不同,我们不确定选择哪条路径.我们倾向于选项3(文件流),但有一些问题:

  1. 考虑到上面提到的数据量和文件大小,您会选择哪种架构?

  2. 数据访问将使用SQL身份验证完成,而不是Windows身份验证,并且Web服务器可能无法使用Windows API访问这些文件.这会使filstream的表现比其他两个选项差吗?

  3. 由于SQL备份包含文件流数据,因此会导致非常大的数据库备份.其他人如何使用大量文件流数据处理备份数据库?

sql-server blob filestream sql-server-2008

13
推荐指数
1
解决办法
8539
查看次数

信用卡跟踪数据的正则表达式

是否有任何已知的正则表达式来验证信用卡轨道1和跟踪2数据?

编辑:

来自维基百科:

金融卡上的第1轨道上的信息包含在几种格式中:A,保留用于发卡机构的专有用途,B,如下所述,CM,保留供ANSI分技术委员会X3B10和NZ使用,它们是可供个别发卡机构使用:

第1轨,格式B:

  • 开始哨兵 - 一个角色(通常是'%')
  • 格式代码="B" - 一个字符(仅限alpha)
  • 主帐号(PAN) - 最多19个字符.通常(但不总是)与卡片正面印刷的信用卡号码相匹配.
  • 字段分隔符 - 一个字符(通常为"^")
  • 名称 - 2到26个字符
  • 字段分隔符 - 一个字符(通常为"^")
  • 到期日期 - YYMM格式的四个字符.
  • 服务代码 - 三个字符
  • 全权委托数据 - 可能包括Pin验证密钥指示符(PVKI,1个字符),PIN验证值(PVV,4个字符),卡验证值或卡验证码(CVV或CVK,3个字符)
  • 结束哨兵 - 一个角色(一般是'?')
  • 纵向冗余校验(LRC) - 它是根据轨道上的其他数据计算的一个字符和有效性字符.应该注意的是,当将卡刷到表示层时,大多数读取器设备不返回该值,并且仅使用它来验证读取器内部的输入.

专题2:此格式由银行业(ABA)开发.该轨道采用5位方案(4个数据位+ 1个奇偶校验)写入,允许16个可能的字符,即0-9,加上6个字符:<=>?.六个标点符号的选择可能看起来很奇怪,但实际上十六个代码只是映射到ASCII范围0x30到0x3f,它定义了十个数字字符加上那六个符号.数据格式如下:

  • 开始哨兵 - 一个角色(通常是';')
  • 主帐号(PAN) - 最多19个字符.通常(但不总是)与卡片正面印刷的信用卡号码相匹配.
  • 分隔符 - 一个字符(通常为'=')
  • 到期日期 - YYMM格式的四个字符.
  • 服务代码 - 三个字符
  • 自由裁量数据 - 如第一轨道
  • 结束哨兵 - 一个角色(一般是'?')
  • 纵向冗余校验(LRC) - 它是根据轨道上的其他数据计算的一个字符和有效性字符.应该注意的是,当将卡刷到表示层时,大多数读取器设备不返回该值,并且仅使用它来验证读取器内部的输入.

regex credit-card

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

Varchar列:Nullable与否

我们组织中的数据库开发标准声明varchar字段不应允许空值.它们的默认值应为空字符串("").我知道这使得查询和连接更容易,但今天,我的一位同事质疑我为什么该标准仅存在于varchar类型而不是其他数据类型(int,datetime等).我想知道其他人是否认为这是一个有效的,可辩护的标准,或者varchar是否应该被视为与其他数据类型的字段相同?

我相信这个标准是有效的,原因如下:

我认为空字符串和空值虽然技术上不同,但在概念上是相同的.空的零长度字符串是不存在的字符串.它没有任何价值.但是,数值0与NULL不同.

例如,如果名为OutstandingBalance的字段的值为0,则表示剩余的金额为0.00.但是,如果相同的字段为NULL,则表示该值未知.另一方面,名为CustomerName的值为""的字段与NULL值基本相同,因为两者都表示名称不存在.

我在某处读到空字符串与NULL的类比是空白CD与无CD的比较.不过,我相信这是一个错误的类比,因为一张空白CD仍然存在phyically,仍然有不具有写入任何有意义的数据物理数据空间.基本上,我相信一个空白的CD是空白(""),而不是一个空字符串的字符串的等价物.因此,笔者认为空格的字符串是从NULL单独的实际值,而是一个空字符串是有价值由于缺少概念上等同于NULL.

如果我对可变长度字符串的信念有效,请告诉我,如果不是,请告诉我.我已阅读关于这个问题的几个博客/参数,但仍然没有看到空值和空字符串之间的真正概念上的差异.

sql-server null types nullable sqldatatypes

11
推荐指数
1
解决办法
4927
查看次数

ASP.NET错误处理

在我的asp.net应用程序中,我通常使用Application_Error全局事件处理程序来记录错误并将用户重定向到用户友好的错误页面.

但是,我已经阅读了有关ELMAH的内容,虽然这看起来很有趣,但Application_Error似乎更简单.

我已经读过其他问题,其中包括我自己在内的人都提出了这样或那样的建议.我想知道的是,如果使用一个而不是另一个有什么显着的好处,为什么?

asp.net error-handling

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

TransactionScope总是尝试升级到MSDTC

我试图在循环中使用事务范围.整个循环使用与数据库的单个连接进行.我正在使用实体框架4进行数据库访问.在循环的第二次迭代期间,当执行LINQ to Entites查询时,将抛出异常,指出服务器上的MSDTC不可用.

我已经读过明确打开连接,然后征集事务应该解决这个问题,但事实并非如此.下面是反映正在进行的基本操作的示例代码.

有关如何防止升级到MSDTC的任何想法?

Using context = New MyEntities()
    Dim connection = context.Connection

    connection.Open()

    For index = 0 to (Me.files.Count - 1)
        Dim query = From d In context.Documents
                    Where (d.DocumentID = documentID)
                    Select d.Status

        Dim status = query.FirstOrDefault()

        Using trans = New TransactionScope()
            connection.EnlistTransaction(Transaction.Current)

            Dim result = context.UpdateStatus(True)

            If (result = 1) Then
                WriteToFile()
                trans.Complete()
            End If
        End Using
    Next
End Using
Run Code Online (Sandbox Code Playgroud)

编辑:如果我使用connection.BeginTransaction(),transaction.Commit()和transaction.Rollback(),它可以正常工作,而不是TransactionScope.但是,我仍然想找到一种使TransactionScope工作的方法.

.net entity-framework transactions transactionscope

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

Catch块没有捕获异常

我有一个子窗体,它在Load事件处理程序中抛出ApplicationException(故意用于测试目的).父表单在Try ... Catch ex As Exception块中包装ChildForm.Show()方法.catch块只显示一条消息并关闭子表单.在Visual Studio 2008(.net 3.5 sp1)中调试时,所有工作都按预期工作.但是,当我在visual studio之外运行它时,Catch块似乎错过了,并且发生了未处理的异常.知道为什么会这样吗?

谢谢.

示例代码:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f2 As Form2

        f2 = New Form2

        Try
            MessageBox.Show("Opening form 2")
            f2.ShowDialog()
        Catch ex As Exception
            f2.Close()
            MessageBox.Show("Form 2 closed.")
        End Try
    End Sub

End Class

Public Class Form2

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Throw New ApplicationException("Test Form_Load")
    End Sub

    Public Sub New()

        ' …
Run Code Online (Sandbox Code Playgroud)

.net vb.net .net-3.5 visual-studio-2008 visual-studio

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

是否有针对此问题的基于集合的解决方案?

我们有一个表格如下:

|ID|EmployeeID|Date     |Category       |Hours|
|1 |1         |1/1/2010 |Vacation Earned|2.0  |
|2 |2         |2/12/2010|Vacation Earned|3.0  |
|3 |1         |2/4/2010 |Vacation Used  |1.0  |
|4 |2         |5/18/2010|Vacation Earned|2.0  |
|5 |2         |7/23/2010|Vacation Used  |4.0  |
Run Code Online (Sandbox Code Playgroud)

业务规则是:

  • 休假余额的计算方法是度假减去假期.
  • 使用的假期始终首先应用于最早的度假收入金额.

我们需要返回Vacation Earned的行,这些行没有被使用的假期抵消.如果使用的假期仅抵消了度假获得记录的一部分,我们需要返回显示差异的记录.例如,使用上表,结果集如下所示:

|ID|EmployeeID|Date     |Category       |Hours|
|1 |1         |1/1/2010 |Vacation Earned|1.0  |
|4 |2         |5/18/2010|Vacation Earned|1.0  |
Run Code Online (Sandbox Code Playgroud)

请注意,记录2被删除,因为它被使用时间完全抵消,但记录1和4仅部分使用,因此它们被计算并返回.

我们想到的唯一方法是将所有度假获得的记录放在临时表中.然后,获取使用的总休假并循环通过临时表,删除最旧的记录并从使用的总休假中减去该值,直到使用的总假期为零.我们可以清理它,因为剩下的假期只是最古老的度假记录的一部分.这将使我们留下优秀的度假收入记录.

这有效,但效率很低,表现不佳.此外,随着越来越多的记录被添加,性能将随着时间的推移而降低.

对于更好的解决方案有什么建议吗?如果没有,我们只需要这样做.

编辑:这是供应商数据库.我们无法以任何方式修改表结构.

sql sql-server-2005

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

将敏感信息发送到REST服务

我们目前有一个基于SOAP的Web服务,我们的内部应用程序使用它来验证用户.基本上,他们使用用户名和密码发送SOAP请求.Web服务针对我们的数据存储验证其凭据,并在验证成功时返回用户信息.使用BASIC身份验证和SSL保护Web服务.

我们需要对此Web服务进行修改,我正在考虑将其重新编写为REST服务.我过去创建的REST服务非常简单,不需要安全性.我从未创建过使用敏感信息的REST服务,所以我有几个问题/顾虑:

首先,是否有一种最佳实践可以安全地将敏感查询参数(用户凭据)发送到REST服务?我仍然可以使用BASIC身份验证和SSL.

其次,如果我使用POST向REST服务发送查询,它仍然被认为是RESTful,还是REST查询需要GET?

security rest web-services

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