C# 在c sql server中生成新ID的代码出错
我有一个VB程序,我正在转换为C。我在唯一ID代码生成器中遇到错误。它检查sql server数据库并读取Id列。如果列为空,则会为其生成一个数字。之后,生成的任何数字都将增加1。我用自己的方式格式化了Id。这是密码C# 在c sql server中生成新ID的代码出错,c#,sql-server,C#,Sql Server,我有一个VB程序,我正在转换为C。我在唯一ID代码生成器中遇到错误。它检查sql server数据库并读取Id列。如果列为空,则会为其生成一个数字。之后,生成的任何数字都将增加1。我用自己的方式格式化了Id。这是密码 private void btnid_Click(object sender, EventArgs e) { string GetCode = "0"; cn.Open(); cmd = new SqlCommand
private void btnid_Click(object sender, EventArgs e)
{
string GetCode = "0";
cn.Open();
cmd = new SqlCommand("select * from AddressBook order by Id desc");
try {
dr = cmd.ExecuteReader(CommandBehavior.SingleRow);
if( dr.HasRows == true) {
while(dr.Read()) {
GetCode = (dr.GetString(dr.GetOrdinal("Id")));}
}
}
catch (Exception ex){
MessageBox.Show(ex.Message);
}
if ((GetCode == "0"))
{
txtid.Text = "GPSC0000001";
}
else if ((GetCode != "0"))
{
string TotalCodeWithoutLable = GetCode.Count - 6;
string OldNum = GetCode.Substring(GetCode.Length -
TotalCodeWithoutLable);
txtid.Text = "GPSC" + StringFormat(OldNum + 1,
"0000000").ToString;
}
//format number of casefilenumber
}
VS在此行上显示以下错误。这是错误:错误1运算符“-”不能应用于“方法组”和“int”类型的操作数
string TotalCodeWithoutLable = GetCode.Count - 6;
string OldNum = GetCode.Substring(GetCode.Length -
TotalCodeWithoutLable);
txtid.Text = "GPSC" + StringFormat(OldNum + 1, "0000000").ToString;
当您试图为字符串分配一个函数整数值时,会出现错误;计数是Linq的函数,不是属性。1将GetCode.Count更改为GetCode.Length并将变量更改为int,应该可以解决您的问题 将代码更改为
intTotalCodeWithoutLable = GetCode.Length- 6;
int OldNum = GetCode.Substring(GetCode.Length -
TotalCodeWithoutLable);
txtid.Text = "GPSC" + StringFormat(OldNum + 1, "0000000").ToString;
你的代码有一些问题 1-如果DataReader给了您一条记录,那么您为什么要使用while 2-为什么要用6减去GetCode长度,我想你应该减去它本身,而不是它的长度 3-您可以使用dr[ColName].ToString,而不是使用dr.GetStringdr.GetOrdinalId获取列值 4-最后,您的代码最好是:
private void btnid_Click(object sender, EventArgs e)
{
int max = 0;
cn.Open();
cmd = new SqlCommand("select Max(Id) from AddressBook");
try
{
int max = (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if ((max == 0))
txtid.Text = "GPSC0000001";
else
{
int TotalCodeWithoutLable = max.ToString().Length - 6;
int OldNum = max.ToString().Substring(max.ToString().Length - TotalCodeWithoutLable);
txtid.Text = "GPSC" + StringFormat(OldNum + 1, "0000000").ToString;
}
}
或者顺便说一下:
private void btnid_Click(object sender, EventArgs e)
{
string GetCode = "0";
cn.Open();
cmd = new SqlCommand("select * from AddressBook order by Id desc");
try
{
dr = cmd.ExecuteReader(CommandBehavior.SingleRow);
if (dr.Read())
GetCode = dr["Id"].ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (string.Equals(GetCode, "0"))
txtid.Text = "GPSC0000001";
else
{
int TotalCodeWithoutLable = GetCode.Length - 6;
int OldNum = GetCode.Substring(GetCode.Length - TotalCodeWithoutLable);
txtid.Text = "GPSC" + StringFormat(OldNum + 1, "0000000").ToString;
}
}
上面定义为字符串的GetCode,如何运行GetCode.Count?除了您的问题之外,您还可以将ExecuteReader更改为ExecuteScalar。而不是读取您可以使用的所有内容,选择MAXID+1。如果最后一行被删除,或者甚至两个调用由不同的线程/请求/用户进行,则可能会导致重复条目。为什么不使用标识约束?如果要在保存行之前检索新值,请在SQL中创建并使用序列生成递增的数字,我通常建议不要生成ID客户端,除非该ID是GUID类型字段,或者可以对ID进行分区。否则,您将与多个客户端发生冲突。如果不想分区或使用GUID,可以使用序列获取保证永远不会提供给其他客户端的ID,或者使用标识字段并输出它使用的ID。如果一个并发事务已经使用了该值(取决于您的事务设置),则Max也是一个问题。非常有用的信息…谢谢