Amar chand123 Ответов: 2

Проблема с автономером в текстовом поле


Я использую этот код для автоматического номера в текстовом поле
Но после того, как я сохранил 10 данных в своей базе данных, этот код перестает работать, и этот код показывает каждый раз число "10" в текстовом поле не 11,12,13....

Поэтому, пожалуйста, помогите мне решить эту проблему

Спасибо

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

public void autonumber()
        {
             String connstring = ConfigurationManager.ConnectionStrings["Data"].ConnectionString;
            
            using (OleDbConnection con = new OleDbConnection(connstring))
            {

                using (OleDbCommand cmd = new OleDbCommand("select max (LoanNumber)+1 from customer", con))
                {
                    con.Open();
                    OleDbDataReader dr = cmd.ExecuteReader();

                    if(dr.HasRows)
                    {
                        while(dr.Read())
                        {
                            textBoxLoanNumber.Text = dr[0].ToString();
                            if(textBoxLoanNumber.Text == "")
                            {
                                textBoxLoanNumber.Text = "1";
                            }
                        }
                    }
                    else
                    {
                        textBoxLoanNumber.Text = "1";
                    }
                    con.Close();
                }
            }
        }

PIEBALDconsult

Это только для демонстрации? Или вы хотите сохранить номера? Я не рекомендую хранить цифры, так как это, как правило, приводит только к боли в будущем.
Конечно, использование MS Access в любом случае приводит только к боли, так что, может быть, вы обжора боли?

Richard Deeming

Я предполагаю, что это ваш LoanNumber столбец хранит строки, а не числа. Строка "9" больше, чем строка "10", поскольку строки сравниваются символ за символом, и "9" больше, чем "1" Итак, ваш Max(LoanNumber) всегда будет возвращать "9".

Но обратите внимание на обсуждение в решении 1 - это определенно так. нет это было правильно.

2 Ответов

Рейтинг:
2

phil.o

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

sql автоматически генерируемый идентификатор[^]


Amar chand123

тогда каково же решение этой проблемы
потому что, если я использую МС счетчик доступ есть проблема, если я удалить все данные, то счетчик не вариант сброса счетчика и доступа только для чтения

phil.o

Если вы удаляете какие-либо данные, вам не следует беспокоиться о наличии пропущенного значения в последовательности. Это никак не влияет ни на производительность, ни на достоверность данных. Это не проблема.

Amar chand123

Есть ли такой код, который может подсчитывать строки в таблице клиентов моей базы данных
чем мы добавим +1 и покажем в текстовом поле, чем я сохранил базу данных
потому что теперь я пытаюсь сохранить вручную данные в столбце autonumber access с помощью текстового поля c#, и данные успешно сохранены

phil.o

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

Amar chand123

я нахожу метод и его работу
мою колонку базы данных Access счетчик, но его редактировать этот код
Пожалуйста, проверьте этот код

частный недействительными Autonumber1()
{
Строка connstring = ConfigurationManager.ConnectionStrings["Данные"].Параметр connectionString;
OleDbConnection con = new OleDbConnection(connstring);
string Query = "select count(*) from customer";
OleDbCommand cd = new OleDbCommand(Query, con);
пробовать
{
против.Открыть();
int count = конвертировать.ToInt16(cd.ExecuteScalar()) + 1;
textBoxLoanNumber.Текст = количество.ToString("00000");
textBoxLoanNumber.Включено = ложь;
}

наконец
{
против.Закрывать();
}
}

Dave Kreskowiak

- Нет!!! НЕ ДЕЛАЙ ЭТОГО!!!

Опять же, в многопользовательской системе, если два клиента выполняют этот код одновременно, они оба получат один и тот же идентификационный номер. Вы никогда не "проверяете" идентификационный номер, прежде чем зафиксировать данные для этой записи в базе данных.

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

Вам, конечно, придется зафиксировать минимальный объем данных в новой записи, чтобы получить этот идентификационный номер. Какие это данные, зависит от ваших бизнес-правил.

Dave Kreskowiak

Опять же, вы никогда не сможете генерировать идентификаторы записей или "идентификационные номера" на стороне клиента. Вы получите столкновения в многопользовательской среде.

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

PIEBALDconsult

Ну, любая нумерация строк-это анти-паттерн.

Maciej Los

5ed!

Рейтинг:
2

Randy Edge

Если вы хотите смоделировать номера строк в SQL Server, вы можете сгенерировать номер строки в запросе.

таким образом, вы все еще можете иметь столбец идентификаторов и по-прежнему возвращать пронумерованные записи.
Что бы вы ни делали, не пытайтесь использовать номер строки для связывания запросов.


https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver15

образец:

USE AdventureWorks2012;   
GO  
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,   
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"   
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;


Он вернется :
Row FirstName    LastName               SalesYTD  
--- -----------  ---------------------- -----------------  
1   Linda        Mitchell               4251368.54  
2   Jae          Pak                    4116871.22  
3   Michael      Blythe                 3763178.17  
4   Jillian      Carson                 3189418.36  
5   Ranjit       Varkey Chudukatil      3121616.32  
6   José         Saraiva                2604540.71  
7   Shu          Ito                    2458535.61  
8   Tsvi         Reiter                 2315185.61  
9   Rachel       Valdez                 1827066.71  
10  Tete         Mensa-Annan            1576562.19  
11  David        Campbell               1573012.93  
12  Garrett      Vargas                 1453719.46  
13  Lynn         Tsoflias               1421810.92  
14  Pamela       Ansman-Wolfe           1352577.13