Dauda Muhammad Ответов: 2

Как сгенерировать автоматический идентификатор


Пожалуйста помогите решить одну добрую проблему
Я хочу сгенерировать автоматический идентификатор, подобный этому, где ARA = ARA, а затем отобразить результат, например ARA004+1= ARA005, но отображаемое преобразование ошибки из строки "ARA001" в тип "Integer" недопустимо. Смотрите подробности ниже
Shop_No      Block
ARA001      ARA
ARA002      ARA
ARA003      ARA
ARA004      ARA
BRA001      BRA
BRA002      BRA
BRA003      BRA
BRA004      BRA
CRA001      CRA
CRA002      CRA
CRA003      CRA
CRA004      CRA
CRA005      CRA


Shop_No поле установлено для текста в базе данных access, и я меняю свой dim на string по-прежнему отображается ошибка преобразование из строки "ARA001" в тип "String" недопустимо

Что я уже пробовал:

ниже приведены мои проверенные коды

Dim IncrID As Integer
CustAutoSqlstr = "Select *From tblRevenueRegister WHERE Block='" & cbBlock.Text & "'"
CustAutodr = CustAutocmd.ExecuteReader()
        If IncrID < CustAutodr.Item(0) Then
                    IncrID = CustAutodr("Shop_No").ToString
                End If
 txtShopNo.Text = IncrID + 1

2 Ответов

Рейтинг:
2

Maciej Los

В многопользовательской среде ваш код будет генерировать дубликаты Shop_noС. перестань делать это таким образом! Вы должны создать пользовательскую автоматически генерируемую последовательность на стороне сервера!
Видеть: Пользовательские автоматически генерируемые последовательности с SQL Server - SQLTeam.com[^]

Подробнее в Google: в SQL счетчика основан на другом поле - Поиск в Google [^]


Рейтинг:
1

Richard Deeming

Dim maxValue As Object
Dim block As String = cbBlock.Text

Using con As New SqlConnection("...")
    Using cmd As New SqlCommand("SELECT Max(Shop_No) FROM tblRevenueRegister WHERE Block = @Block")
        cmd.Parameters.AddWithValue("@Block", block)
        
        con.Open()
        maxValue = cmd.ExecuteScalar()
    End Using
End Using

If maxValue Is Nothing OrElse Convert.IsDBNull(maxValue) Then
    txtShopNo.Text = "1"
Else
    Dim numberPart As String = Convert.ToString(maxValue).Substring(block.Length)
    Dim shopNumber As Integer = Convert.ToInt32(numberPart)
    txtShopNo.Text = (shopNumber + 1).ToString()
End If


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


Dauda Muhammad

Большое вам спасибо Ричард Диминг
Ваше предложение поможет создать что-то подобное и работать нормально
Dim cmdAsPaid As New OleDbCommand("SELECT Count(Shop_No) FROM tblRevenueRegister WHERE Block='" & txtBlockNo.Текст & "'", Cnn)
'Executescalar так
Дим итоги, в формате десятичного = CDEC и(cmdAsPaid.Executescalar так())
Dim CountAsPaid As Double = String.Формат(Итоги)
txtShopNo.Text = txtBlockNo.Текст &амп; Майкрософт.На языке VisualBasic.Формат(CountAsPaid, "000") + IncrID

Richard Deeming

Нет, этот код есть все еще уязвим для SQL-инъекций. Прочтите ссылки в нижней части моего ответа.

Using cmdAsPaid As New OleDbCommand("SELECT Count(Shop_No) FROM tblRevenueRegister WHERE Block = ?")
    cmdAsPaid.Parameters.AddWithValue("@p0", txtBlockNo.Text)
    
    Dim Totals As Decimal = CDec(cmdAsPaid.ExecuteScalar())
    Dim CountAsPaid As Double = String.Format(Totals)
    txtShopNo.Text = txtBlockNo.Text & Microsoft.VisualBasic.Format(CountAsPaid, "000") + IncrID
End Using