C# 在c sql server中生成新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

我有一个VB程序,我正在转换为C。我在唯一ID代码生成器中遇到错误。它检查sql server数据库并读取Id列。如果列为空,则会为其生成一个数字。之后,生成的任何数字都将增加1。我用自己的方式格式化了Id。这是密码

     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也是一个问题。非常有用的信息…谢谢