Member 13745089 Ответов: 2

Как получить последнее соглашение нет из базы данных SQL server (VB.NET)


Я использую базу данных sql server, таблицу AgreementDB. В этой таблице у меня есть столбец под названием "AgreementNo" - тип данных "nvarchar(50)". Мое согласие ни на один образец не похоже "ABC/AGR/001"

Я хочу получить это соглашение без последней сохраненной записи + 1 ("ABC/AGR/001" + 1 = ABC/AGR/002) к текстовому полю под названием txtAgreementNo. Ниже я показываю коды, которые я использовал и при запуске программы появляется ошибка "входная строка была не в правильном формате" с выделением этой строки кода
txtAgreementNo.Text = Convert.ToInt64(cmd.ExecuteScalar()) + 1


пожалуйста, дайте мне решение

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

Private Sub GetLastAgreementNo()
        MysqlConn = New SqlConnection
        MysqlConn.ConnectionString = Local(0)

        Dim query = "SELECT max(AgreementNo) FROM AgreementDB"
        Dim cmd As New SqlCommand(query, MysqlConn)
        MysqlConn.Open()
        txtAgreementNo.Text = Convert.ToInt64(cmd.ExecuteScalar()) + 1
    End Sub

A_Griffin

Что произойдет, когда вы доберетесь до ABC/AGR/999 ?

Member 13745089

должно быть - ABC/AGR/1000

2 Ответов

Рейтинг:
16

OriginalGriff

Это потому, что данные, которые вы извлекаете из БД, не являются числом: вы сами сказали, что они находятся в формате "ABC/AGR/001", который не может быть непосредственно преобразован в число.

Вам нужно обработать возвращаемую строку данных (или, что еще лучше, изменить базу данных, включив в нее числовое поле и вычисляемый столбец), используя любую из этих строк.Подстрока или регулярное выражение.

Но... если вы делаете это для того, чтобы сгенерировать "свободный номер" для следующей записи, которую хотите добавить, я настоятельно рекомендую вам переосмыслить весь этот дизайн: SQL Server-это многопользовательская система, поэтому генерация "новых" значений из последней плюс одна-это рецепт для периодических проблем, когда два или более пользователей пытаются сделать все это одновременно. Таким образом, вы можете серьезно повредить целостность своей базы данных, и потребуется огромное количество человеческого вклада, чтобы разобраться во всем этом.


Maciej Los

5ed!

Member 13745089

Не могли бы вы дать мне код решения этого вопроса?

OriginalGriff

Вы читали что-нибудь из того, что я написал выше?

Member 13745089

Я согласился с тем, что ты здесь рассказываешь. Единственный вариант-я должен создать 2 столбца для соглашения No, один для текстового поля, а другой для числового поля. тогда его будет легко генерировать. но что произойдет при сохранении данных на sql server? Я имею в виду, как разделить текстовое поле и числовое поле при вставке в базу данных sql server?

OriginalGriff

Сделайте это на языке презентации, где вы генерируете значение. Там у вас есть гораздо лучшие средства для манипулирования строками - и вы, вероятно, разделили обе половины для начала...

Рейтинг:
11

Member 13745089

Можете ли вы дать мне vb.net решение для этого?

Maciej Los

Нет, я не могу по ряду причин, но главная причина такова: в многопользовательской среде вы получите дублированные номера. Вы должны генерировать AgreementNo на уровне базы данных.