2017-02-18 10 views
0

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

Он делает это, просто получая идентификатор для предыдущей записи, а затем перемещая ее на одну букву вперед. Например, если предыдущий идентификатор равен AAA, новый идентификатор будет AAB и т. Д.

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

Проблема в том, что эта функция работает только для 1 записи. Таким образом, только первый генерируемый идентификатор будет двигаться вперед, остальное будет таким же, как и второе. Например, это будет выглядеть так.

0 - AAA, 1 - AAB, 2 - AAB, 3 - AAB ....

// Generate codes in order 
    public string StrGenerateSequentialCode(string StrTableName) 
    { 

     // Get the places for the counters from the previous code 
     AccessTable ObjStoreCode = new AccessTable(); 
     ObjStoreCode.SelectTable(StrTableName); 

     string StrPreviousID = ""; 

     StrPreviousID = ObjStoreCode.StrGetRow(ObjStoreCode.IntGetRowCount() - 1, 0); 

Оставайтесь пожалуйста, что код кода для этой функции.

char[] ArrCollection = new char[36] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
     int[] ArrPreviousIDSpace = new int[11]; // the number if chars for this code is fixed to 11 

     for (int i = 0; i < ArrPreviousIDSpace.Length; i++) 
     { 
      for (int j = 0; j < ArrCollection.Length; j++) 
      { 
       if (ArrCollection[j] != StrPreviousID[i]) 
       { 
        ArrPreviousIDSpace[i]++; 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 


     // Now generate a code with each character carrying on from the last 
     string StrCode = ""; 


     /* Add one to the last parts position until it reaches 27, 
     * when it does set its position to 0 and then add one to the second last parts 
      position and repeat the process for the third last part...*/ 

     int A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0; 

     // Make the starting points for the char selecters the 
     A = ArrPreviousIDSpace[0]; 
     B = ArrPreviousIDSpace[1]; 
     C = ArrPreviousIDSpace[2]; 
     D = ArrPreviousIDSpace[3]; 
     E = ArrPreviousIDSpace[4]; 
     F = ArrPreviousIDSpace[5]; 
     G = ArrPreviousIDSpace[6]; 
     H = ArrPreviousIDSpace[7]; 
     I = ArrPreviousIDSpace[8]; 
     J = ArrPreviousIDSpace[9]; 
     K = ArrPreviousIDSpace[10]; 

     // Turn the clock 
     K++; 
     if (K == ArrCollection.Length) 
     { 
      K = 0; 

      J++; 
     } 
     if (J == ArrCollection.Length) 
     { 
      J = 0; 

      I++; 
     } 
     if (I == ArrCollection.Length) 
     { 
      I = 0; 

      H++; 
     } 
     if (H == ArrCollection.Length) 
     { 
      H = 0; 

      G++; 
     } 
     if (G == ArrCollection.Length) 
     { 
      G = 0; 

      F++; 
     } 
     if (F == ArrCollection.Length) 
     { 
      F = 0; 

      E++; 
     } 
     if (E == ArrCollection.Length) 
     { 
      E = 0; 

      D++; 
     } 
     if (D == ArrCollection.Length) 
     { 
      D = 0; 

      C++; 
     } 
     if (C == ArrCollection.Length) 
     { 
      C = 0; 

      B++; 
     } 
     if (B == ArrCollection.Length) 
     { 
      B = 0; 

      A++; 
     } 
     // Combine the chars to make a final password 
     StrCode = ArrCollection[A].ToString() + ArrCollection[B].ToString() + ArrCollection[C].ToString() + ArrCollection[D].ToString() + ArrCollection[E].ToString() + ArrCollection[F].ToString() + ArrCollection[G].ToString() + ArrCollection[H].ToString() + ArrCollection[I].ToString() + ArrCollection[J].ToString() + ArrCollection[K].ToString(); 
     return StrCode; 

Вот функция, которая получает запись из таблицы.

public string StrGetRow(int IntSelectedRow = 0, int IntSelectedColumn = 0) 
    { 
     string StrRequesedRow = ""; 



     // This if statement will check whether or not the selected coloumns or rows are larger than the amount available 
     if (IntSelectedRow < ObjDataSet.Tables[0].Rows.Count & IntSelectedColumn < ObjDataSet.Tables[0].Columns.Count) 
     { 
      // Make the table the data row origianates from the table on the dataset 
      DataRow = ObjDataSet.Tables[0].Rows[IntSelectedRow]; 
      // This will store the data in the string 'StrRequestedRow 
      StrRequesedRow = DataRow.ItemArray.GetValue(IntSelectedColumn).ToString(); 
     } 
     else 
     { 
      StrRequesedRow = "NO MORE RECORDS"; 
     } 

     return StrRequesedRow; 
    } 
+3

Вы делаете это совершенно неправильно. Каждая современная СУБД имеет способ вставки записей, а затем возвращает идентификатор новой записи. Какие СУБД вы используете? –

+0

Я использую Microsoft SQL в сочетании с OLEDB. Кроме того, я просто добавил функцию, которую я использую, чтобы получить запись из таблицы, чтобы дать вам лучшее описание. – Abdiyee

+0

Все это швы немного глупо. Если вы действительно не хотите, чтобы автоматически сгенерированный идентификатор использовал [Guid.NewGuid()] (https://msdn.microsoft.com/en-us/library/system.guid.newguid (v = vs.110) .aspx) для создания новых идентификаторов или чего-то, что не зависит от базы данных. Ваш путь немного плох по нескольким причинам (параллелизм, производительность, блокировки ...). –

ответ

1

Если я помню модульное исчисление ваш алгоритм должен быть что-то вроде этого

public static string NumberToString(int number, int length,char[] allChars) 
     { 
      var remain = number; 
      var result = ""; 
      var total = allChars.Length; 
      while (remain >= total) 
      { 
       result = allChars[remain % total]+result; 

       remain = (int)Math.Floor(remain * 1.0/total); 
      } 
      result = allChars[remain]+result; 
      return result.PadLeft(length, allChars[0]); 
     } 

Это может быть оптимизирован, но его просто. Вы использовали его вот так.

static void Main(string[] args) 
     { 

      char[] allChars = { 'A', 'B', 'C', 'D' }; 
      var count = 0; 
      Console.WriteLine(NumberToString(count,3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(++count, 3, allChars)); 
      Console.WriteLine(NumberToString(30, 3, allChars)); 
      Console.WriteLine(NumberToString(63, 3, allChars)); 


      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 

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

+0

SPOT ON. Большое спасибо. Ты спаситель. – Abdiyee

+0

@Abdi Glad Я мог бы помочь Я отредактировал алгоритм, чтобы он читал нулевой символ из массива, а не жестко закодированного. Не забудьте отметить это как ответ, если это то, что вам нужно. Если у вас все еще есть проблемы с чтением базы данных или вам нужно перевести обратно на номер, поместите его в комментарий, чтобы я мог отредактировать ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^