C#在Windows窗体应用程序中从数据库生成新的id

时间:2017-04-01 20:32:24

标签: c# winforms ms-access-2007

我必须在我的加载窗体表单应用程序上自动生成新的AccountID。

因此,例如当用户在文本框中为“帐户ID”启动窗体“添加新帐户”时,我必须显示数据库中的最新值。如果我在数据库中的两个帐户在窗体上的文本框值将是三个。

如果我在数据库中至少有一个帐户,我的代码就能完美运行,但是当我的数据库为空时,我得到了例外。

这是我的代码:

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(); 

但是如果我的数据库为空,这行代码就可以工作,但是当我在数据库中有一个帐户时,它将始终显示在我的Windows窗体上的帐户ID文本框值1中。我使用Microsoft Access 2007数据库。

我感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

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

从帐户

中选择isnull(max(accountID),0)作为maxID

答案 1 :(得分:0)

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();
        }
    }
}

答案 2 :(得分:0)

你能使用SELECT COUNT(column_name)FROM table_name;计算帐户数量而不是选择哪一个最大?

答案 3 :(得分:0)

我猜你想要:

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的内容。如果您尝试将其用作主键,那么您也会遇到竞争条件问题。如果你想要一个主键,你应该让数据库创建它并在你创建记录后返回值。