удалить последнюю запятую перед WHERE в обновлении SQL - PullRequest
3 голосов
/ 25 мая 2011

Я вручную создаю инструкцию SQL UPDATE из строк "SET Column = @param,".У меня проблема в том, что последний из этих операторов SET перед WHERE не должен содержать запятую, так как это синтаксическая ошибка.

Так что мой код выглядит так:

Public Sub Update(byval id as Integer, Optional byval col1 as String = Nothing, Optional byval col2 as Integer = -1)

 Dim sqlupdateid As SqlParameter
 Dim sqlupdatecol1 As SqlParameter
 Dim sqlupdatecol2 As SqlParameter

 Using sqlupdate As SqlCommand = _connection.CreateCommand()
    sqlupdate.CommandType = CommandType.Text
    Dim updatedelim As String = ","
    Dim setcol1 As String = "SET Col1 = @col1"
    Dim setcol2 As String = "SET Col2 = @col2"

   sqlupdate.CommandText = "UPDATE dbo.MyTable"

    If Not IsNothing(col1) Then
        sqlupdate.CommandText += " "
        sqlupdate.CommandText += setcol1
        sqlupdate.CommandText += updatedelim

        sqlupdatecol1 = sqlupdate.CreateParameter()
        sqlupdatecol1.ParameterName = "@col1"
        sqlupdatecol1.DbType = SqlDbType.VarCHar
        sqlupdatecol1.Value = col1
        sqlupdate.Parameters.Add(sqlupdatecol1)
    End If
    If Not col2 = -1 Then
        sqlupdate.CommandText += " "
        sqlupdate.CommandText += setcol2
        sqlupdate.CommandText += updatedelim

        sqlupdatecol2 = sqlupdate.CreateParameter()
        sqlupdatecol2.ParameterName = "@col2"
        sqlupdatecol2.DbType = SqlDbType.Int
        sqlupdatecol2.Value = col2
        sqlupdate.Parameters.Add(sqlupdatecol2)
    End If

    sqlupdate.CommandText += " WHERE ID = @id"
    //try to remove the last comma before the WHERE... (doesn't work)
    Dim temp As String = sqlupdate.CommandText
    Dim space As Char = " "
    Dim list As String() = temp.Split(space)
    Dim last As String = String.Empty
    Dim removed As String = String.Empty
    For Each s As String In list
        If s.Contains("WHERE") Then
            If last.Contains(",") Then
                removed = last.TrimEnd(",")
            End If
        End If
        last = s
    Next

    Dim cmd As String = list.ToString()
    sqlupdate.CommandText = cmd
    sqlupdateid = sqlupdate.CreateParameter()
    sqlupdateid.ParameterName = "@id"
    sqlupdateid.DbType = SqlDbType.Int
    sqlupdateid.Value = id
    sqlupdate.Parameters.Add(sqlupdateid)

    sqlupdate.ExecuteNonQuery()
  End Using
End Sub

Кто-нибудь может предложить лучший алгоритм удаления последней запятой перед WHERE в операторе SQL, имея в виду, что число операторов SET до этого будет меняться?

Поскольку я добавляю запятую после каждогоустановить, так как другой может следовать или не следовать, поэтому я должен после создания ОБНОВЛЕНИЯ, найти последнюю запятую и удалить ее.

Так что это должно выглядеть так:

UPDATE dbo.MyTable SET Col1 = @col1, SET Col2 = @col2 WHERE id = @id

Ответы [ 4 ]

3 голосов
/ 25 мая 2011

Поскольку вы свободно используете оператор +=, я бы посоветовал вам полностью изменить подход. Вы можете поместить строки в список и объединить их, чтобы сформировать список через запятую:

Public Sub Update(byval id as Integer, Optional byval col1 as String = Nothing, Optional byval col2 as Integer = -1)

  Dim sqlupdateid As SqlParameter
  Dim sqlupdatecol1 As SqlParameter
  Dim sqlupdatecol2 As SqlParameter

  Using sqlupdate As SqlCommand = _connection.CreateCommand()
    sqlupdate.CommandType = CommandType.Text

    Dim sets As New List(Of String)

    If Not IsNothing(col1) Then
      sets.Add("Col1 = @col1")
      sqlupdatecol1 = sqlupdate.CreateParameter()
      sqlupdatecol1.ParameterName = "@col1"
      sqlupdatecol1.DbType = SqlDbType.VarChar
      sqlupdatecol1.Value = col1
      sqlupdate.Parameters.Add(sqlupdatecol1)
    End If
    If Not col2 = -1 Then
      sets.Add("Col2 = @col2")
      sqlupdatecol2 = sqlupdate.CreateParameter()
      sqlupdatecol2.ParameterName = "@col2"
      sqlupdatecol2.DbType = SqlDbType.Int
      sqlupdatecol2.Value = col2
      sqlupdate.Parameters.Add(sqlupdatecol2)
    End If

    sqlupdate.CommandText = _
      "UPDATE dbo.MyTable SET " +_
      String.Join(", ", sets.ToArray()) +_
      " WHERE ID = @id"

    sqlupdateid = sqlupdate.CreateParameter()
    sqlupdateid.ParameterName = "@id"
    sqlupdateid.DbType = SqlDbType.Int
    sqlupdateid.Value = id
    sqlupdate.Parameters.Add(sqlupdateid)

    sqlupdate.ExecuteNonQuery()
  End Using
End Sub
3 голосов
/ 25 мая 2011

Динамически создать запрос UPDATE (без предложения WHERE).

Тогда сделайте if (q.EndsWith(",")) then q = q.Substr(0,q.Length-1).

Наконец добавить к предложению q WHERE.

3 голосов
/ 25 мая 2011
String Query = Query.Substring(0,Query.Length-1)
1 голос
/ 25 мая 2011

Вместо сложного манипулирования строками, вы можете сделать это

UPDATE dbo.MyTable
SET Col1 = @col1, Col2 = @col2, @id = @id
WHERE id = @id

То есть добавить @id = @id

Вы можете назначать значения переменным в ОБНОВЛЕНИЕ

...
      | @variable = expression
      | @variable = column = expression
      ....
      | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
      | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression

Выражение конечно может быть другим @variable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...