【问题标题】:TSQL in the Command object命令对象中的 TSQL
【发布时间】:2013-08-07 19:40:15
【问题描述】:

请看下面的子程序:

Private Sub UpdateGrade(ByVal studentID As Integer, ByVal grade As String)
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim id As Integer
        Dim _ConString As String
        Try
            _ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("DECLARE @StudentID INT " & _
            "DECLARE @Grade char(1) " & _
            "SET @Grade = '" & grade & "'" & _
            "SET @StudentID = '" & studentID & "'" & _
            "If @Grade=1 " & _
            "begin " & _
            "update Student SET Grade = 'A' WHERE StudentID = @StudentID " & _
            "end " & _
            "Else If @Grade=2 " & _
            "begin " & _
            "update Student SET Grade = 'B' WHERE StudentID = @StudentID " & _
            "end " & _
            "If @Grade=3 " & _
            "begin " & _
            "update Student SET Grade = 'C' WHERE StudentID = @StudentID " & _
            "end " & _
            "Else If @Grade=4  " & _
            "begin " & _
            "update Student SET Grade = 'D' WHERE StudentID = @StudentID " & _
            "end")
            objCommand.Connection = objCon
            objCon.Open()
            objCommand.ExecuteNonQuery()
        Catch ex As Exception
            Throw
        Finally

        End Try

将 Command.CommandText 设置为 TSQL 语句有什么问题吗? TSQL 看起来像这样(为了便于阅读):

DECLARE @StudentID INT
DECLARE @Grade char(1)
SET @Grade = 
SET @StudentID = 
If @Grade=1 
begin
    update Student SET Grade = 'A'  WHERE StudentID = @StudentID
end 
Else If @Grade=2 
begin
    update Student SET Grade = 'B'  WHERE StudentID = @StudentID
end 
If @Grade=3
begin
    update Student SET Grade = 'C'  WHERE StudentID = @StudentID
end 
Else If @Grade=4 
begin
    update Student SET Grade = 'D'  WHERE StudentID = @StudentID
end 

在 while 循环中有对 UpdateGrade 的调用。 while 循环遍历 500 万学生。请注意,实时系统对此更加复杂,因此我提供了上面的代码以进行说明。

过去我在从 .NET 代码调用存储过程时遇到过问题,XACT_ABORT 解决了这个问题。

【问题讨论】:

  • 你为什么不使用存储过程......
  • @logixologist 没有必要,甚至 IMO 也不建议调用存储过程;请不要让它听起来像“每个人都使用存储过程”,因为:他们真的没有
  • @logixologist,只是为了保持一致性。该应用目前不使用存储过程。
  • @Marc Gravell,谢谢。你明白我的问题吗?读了几次后,我在徘徊,如果其他人能理解我的意思。
  • @w0051977,如果出现错误,抱歉。您拥有的优势是您可以将一些参数传递给它,并在您的 vb.net 代码之外的单独文件中执行所有逻辑。您需要做的就是将命令文本设置为存储过程。至于应用程序目前不使用它们,我已经多次处于应用程序不使用的位置,并且我仍然将所有新代码移动到存储过程中,以便您可以将 SQL 与 .NET 分开。 marc - 我从来没有说过每个人都使用它们,我只是建议它在这里会很好用。

标签: .net sql-server vb.net tsql


【解决方案1】:

预期您将命令的 CommandText 设置为 TSQL 语句,您已经在执行此操作。但是,我强烈建议不要这样做:

        "DECLARE @StudentID INT " & _
        "DECLARE @Grade char(1) " & _
        "SET @Grade = '" & grade & "'" & _
        "SET @StudentID = '" & studentID & "'" & _

应该删除,只是(对不起 C# 分号;习惯的力量):

objCommand.Parameters.AddWithValue("StudentID", studentID);
objCommand.Parameters.AddWithValue("Grade", grade);

这样就不会受到 SQL 注入的影响。

另外,可能是select case,即(以 C# 为例):

objCommand.CommandText = @"
    update Student set Grade = select case @Grade
            when 1 then 'A' when 2 then 'B'
            when 3 then 'C' when 4 then 'C'
            else Grade end
    where StudentId = @StudentID";
objCommand.Parameters.AddWithValue("StudentID", studentID);
objCommand.Parameters.AddWithValue("Grade", grade);

【讨论】:

  • 谢谢。有问题的应用程序是 VB6 应用程序。我提供 .NET 示例的原因是因为 .NET 代码往往会在这里接触到更多人(IMO)。我想这同样适用于VB6? +1。
  • @w0051977 不寒而栗;你只是把我带回到我多年的 vb6 天;现在,您需要小心,因为 vb6 与 .net 不同,特别是 ado 与 ado.net 不同——尤其是在参数方面。 vb6 中的 ADO 可以参数化,但它的工作方式可能不同。
  • 您能否详细说明您的最后一句话:“它可能会有所不同”。谢谢。
  • @w0051977 还有其他新闻:vb6 - 那个僵尸不会死了吗?出于对一切的热爱,考虑更新。漂亮请。
  • @w0051977 IIRC(我强调:这是很久前的事了)- ADO 默认使用索引参数,而不是名称?虽然这可能在调用 sprocs 时出现;你需要测试它
猜你喜欢
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
相关资源
最近更新 更多