C# C在windows窗体应用程序上从数据库生成新id

C# C在windows窗体应用程序上从数据库生成新id,c#,winforms,ms-access-2007,C#,Winforms,Ms Access 2007,我必须在加载windows窗体应用程序上自动生成新帐户ID 所以,例如,当用户启动windows窗体时,在帐户id的文本框中添加新帐户,我必须显示数据库中的最新值。若我在windows窗体上的数据库中有两个帐户,则文本框中的值将为三 若数据库中至少有一个帐户,那个么我的代码就可以正常工作,但若数据库为空,那个么就会出现异常 这是我的代码: public int GetLatestAccountID() { try { command.CommandText =

我必须在加载windows窗体应用程序上自动生成新帐户ID

所以,例如,当用户启动windows窗体时,在帐户id的文本框中添加新帐户,我必须显示数据库中的最新值。若我在windows窗体上的数据库中有两个帐户,则文本框中的值将为三

若数据库中至少有一个帐户,那个么我的代码就可以正常工作,但若数据库为空,那个么就会出现异常

这是我的代码:

public int GetLatestAccountID() 
{
    try
    {
        command.CommandText = "select Max(AccountID)as maxID from Account";
        command.CommandType = CommandType.Text;

        connection.Open();

        OleDbDataReader reader= command.ExecuteReader();

        if (reader.Read())
        {
            int valueID = Convert.ToInt32(reader["maxID"]);
            return valueID + 1;
        }

        return 1;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (connection!= null)
        {
            connection.Close();
        }
    }
}
我还找到了stackoverflow的答案:

object aa = DBNull.Value;
int valueID = (aa as int?).GetValueOrDefault(); 
但是如果我的数据库是空的,这行代码可以工作,但是当我在数据库中有一个帐户时,它将始终以帐户id文本框值1显示在我的windows窗体上。我使用MicrosoftAccess2007数据库


非常感谢您的帮助。

您能从表中选择COUNTcolumn\u name;要计算帐户数而不是选择哪个帐户最大?

我猜您需要:

public int GetLatestAccountID() 
{
    try
    {
        int accounts = 0;

        command.CommandText = "select Max(AccountID)as maxID from Account";
        command.CommandType = CommandType.Text;

        connection.Open();

        OleDbDataReader reader= command.ExecuteReader();

        if (reader.Read())
        {
            accounts = Convert.ToInt32(reader["maxID"]) + 1;
        }

        return accounts;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (connection!= null)
        {
            connection.Close();
        }
    }
}
public int GetLatestAccountID(string connectionString) 
{
    using(var dbConn = new OleDbConnection(connectionString))
    {
        dbConn.Open();

        string query = "select Max(AccountID) from Account";
        using(var dbCommand = new OleDbCommand(query, dbConn))
        {
            var value = dbCommand.ExecuteScalar();
            if ((value != null) && (value != DBNull.Value))
                return Convert.ToInt32(value) + 1;

            return 1;
        }
    }
}
看起来您只打开了一次数据库连接,并在整个程序中保持打开状态。不要那样做;这会导致竞争条件和数据损坏。NET实现数据库连接池,所以您根本不会通过保持连接打开来提高性能


你也没有告诉我们你用GetLatestAccountID做什么。如果你想用它作为主键,你也会遇到比赛条件的问题。如果需要主键,则应让数据库创建主键,并在创建记录后返回值。

您可以进一步简化它,如下所示:


选择isnullmaxaccountID,0作为帐户中的maxID

已经有一段时间了,但是ExecuteScalar将帮助您而不是ExecuteReader。这很有效!非常感谢你!!是的,这是我的主键,但在数据库中,我选择的是数字,而不是自动编号。请注意,ExecuteReader可以正常工作,解决方案是if value!=DBNull.Value。另外,您应该对主键使用自动编号,而不是Maxanything。是的,但如果我的数据库为空,它也不起作用。解决方案是使用:执行标量而不是执行ReaderI。我尝试一下,但它也不起作用。解决方案是使用执行标量而不是执行读取器。感谢您的回复并试图帮助我。问题不在于ExecuteReader,但Convert.ToInt32reader[maxID]在可空列上不起作用。