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

问题描述 投票:0回答:5

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

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

如果我的数据库中至少有一个帐户,我的代码可以完美运行,但是当我的数据库为空时,我会遇到异常。

这是我的代码:

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 数据库。

我感谢任何帮助。

c# winforms ms-access-2007
5个回答
1
投票

您可以进一步简化如下,

选择 isnull(max(accountID),0) 作为帐户的 maxID


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


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

0
投票

您可以使用 SELECT COUNT(column_name) FROM table_name;计算帐户数量而不是选择最大的帐户?


0
投票
    SqlConnection con = new SqlConnection(Yourconnectionstring);
    con.Open();
    string query = "SELECT COALESCE(MAX(AccountID), 0) FROM tblAccounts";
    SqlCommand cmd = new SqlCommand(query, con);
    cmd.ExecuteNonQuery();
    DataTable dt = new DataTable();
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    sda.Fill(dt);
    if ((dt.Rows.Count > 0) && (lblAccountno.Text == ""))
    {
        lblAccountno.Text = cmd.ExecuteScalar().ToString();
lbLAccountno.Text = (Convert.ToInt32(lblAccountno.Text.Trim()) + 1).ToString();
        con.Close();
    }

除了所有格式问题外,您还应该考虑以下事项:

  1. 您真的要创建ID(AccountID)还是账号(有区别)
  2. 如果您想创建一个新的帐户 ID 以在应用程序中进一步处理,您可以考虑使用空白值执行 INSERT,并使用带有 RETURNING 子句的 INSERT 来获取真正的新主键。请注意,存在不同的 SQL 方言。
  3. 如果您想创建一个帐号 - 我认为这不是一个好主意,帐号应该由帐户创建,您只需使用唯一的帐号创建数据库,这样您就不能两次创建相同的帐户。
© www.soinside.com 2019 - 2024. All rights reserved.