Код C# для генерации уникального идентификатора для каждой строки, вставленной в SQL Server 2008 R2
Я написал уникальную функцию генерации идентификатора, которая генерирует идентификатор каждый раз, когда в базу данных вставляется новая строка. Но иногда он дает одинаковый идентификатор для каждой строки. Я не могу понять, в чём именно проблема именно тогда. Я даю вам код для вставки в базу данных и код для генерации идентификатора. Пожалуйста, просмотрите код и скажите, есть ли логическая ошибка или нет
// Daily sales report entry codeing…………………………………………………………………………………………………………………
public string GetSalesTeam(SalesTeam st)
{
try
{
SqlConnection con = SqlConnDAC.CreateConn();
SqlCommand cmd = new SqlCommand("Insert into DSR values(@v1,@v2,@v3,@v4,@v5,@v6,@v7,@v8,@v9,@v10,@v11,@v12,@v13,@v14,@v15,@v16)", con);
IDGen.varr = DSR_IDGen(); //Calling id generate function
cmd.Parameters.AddWithValue("@v1", st.Sl_No);
cmd.Parameters.AddWithValue("@v2", st.User_ID);
cmd.Parameters.AddWithValue("@v3", st.Name);
cmd.Parameters.AddWithValue("@v4", st.Branch);
cmd.Parameters.AddWithValue("@v5", st.Desg);
cmd.Parameters.AddWithValue("@v6", st.Visiting_Date);
cmd.Parameters.AddWithValue("@v7", st.Name_Of_Client);
cmd.Parameters.AddWithValue("@v8", st.Address);
cmd.Parameters.AddWithValue("@v9", st.PhNo);
cmd.Parameters.AddWithValue("@v10",Convert.ToInt32(st.QuoteValue));
cmd.Parameters.AddWithValue("@v11", st.Remarks);
cmd.Parameters.AddWithValue("@v12", st.Source);
cmd.Parameters.AddWithValue("@v13",IDGen.varr);
cmd.Parameters.AddWithValue("@v14", st.Month);
cmd.Parameters.AddWithValue("@v15", st.Year);
cmd.Parameters.AddWithValue("@v16",Convert.ToInt32(st.ClosedValue));
// cmd.Parameters.AddWithValue("@v17", st.TypeOfCall);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return "Success and DSR No.for_ "+st.Name_Of_Client+" = "+IDGen.varr+"";
}
catch (Exception e)
{
return e.ToString();
}
}
//ID generate function………………………………………………………..
public string DSR_IDGen()
{
int i = 0;
string temp;
string var;
var = ("DSR-" + i.ToString()).Trim();
SqlConnection conID = SqlConnDAC.CreateConn();
SqlCommand cmdd = new SqlCommand("select DSR_No from DSR", conID);
conID.Open();
SqlDataReader dr = cmdd.ExecuteReader();
while (dr.Read())
{
temp = (dr[0].ToString()).Trim();
if (var == temp)
{
i = i + 1;
var = ("DSR-" + i.ToString()).Trim();
continue;
}
}
dr.Close();
conID.Close();
return var;
}
// a static variable that holds the ID............................
public class IDGen
{
public static string varr;
}
1 ответ
Один совет: не пытайтесь сделать это сложнее, чем есть, и не пытайтесь перехитрить SQL Server. Почему бы вам не использовать механизмы, предоставляемые базой данных, которые уже существуют для этого: IDENTITY
столбец?
Я бы порекомендовал вам использовать:
ID INT IDENTITY(1,1)
столбец, чтобы SQL Server обрабатывал автоматическое увеличение вашего числового значения- вычисляемый постоянный столбец для преобразования этого числового значения в нужное вам значение
Так что попробуйте это:
CREATE TABLE dbo.DSR
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
DsrID AS 'DSR-' + RIGHT('00000000' + CAST(ID AS VARCHAR(8)), 8) PERSISTED,
.... your other columns here....
)
Теперь каждый раз, когда вы вставляете строку в DSR
без указания значений для ID
или же DsrID
:
INSERT INTO dbo.DSR(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
тогда SQL Server автоматически и безопасно увеличит ваш ID
значение и DsrID
будет содержать такие значения, как DSR-0000001
, DSR-0000002
,...... и так далее - автоматически, безопасно, надежно, без дубликатов.