从数据库中获取 autoNumber 值

Posted

技术标签:

【中文标题】从数据库中获取 autoNumber 值【英文标题】:get autoNumber value from database 【发布时间】:2011-11-24 13:48:19 【问题描述】:

代码如下。 在我的代码中,我更新了现有行(从现有表),程序从文本框获取所有更新的值。 在表autoNumber字段的末尾(最后一列)名为“codonsAutoNum”

我不知道如何从数据库中获取值(自动编号值)。 我需要有'??'的位置(在代码中)的值。

谢谢大家的帮助!

代码:

        private void update_Click(object sender, EventArgs e)
    
        string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb";
        OleDbConnection myConnection = new OleDbConnection(connectionString);
        string myInsertQuery =(String.Format("UPDATE tblCodons SET codonsCodon1='0', codonsCodon3='1', " + 
        "codonsTriplet1='2', codonsTriplet2='3', codonsTriplet3='4', codonsTriplet4='5', " + 
        "codonsTriplet5='6', codonsTriplet6='7', codonsFullName='8'" + 
        " WHERE codonsAutoNum='9'",codon1.Text, codon3.Text ,triplet1.Text, triplet2.Text,
         triplet3.Text, triplet4.Text, triplet5.Text, triplet6.Text,
        fullName.Text,??));
        OleDbCommand myCommand = new OleDbCommand(myInsertQuery);
        myCommand.Connection = myConnection;
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        myCommand.Connection.Close();

编辑: 真的很困惑。我的代码应该看起来如何? 我需要将“SELECT @@identity”放在哪里?我不明白为什么我不能只取值? (我需要它作为所选行的索引来确定更新在哪里。当我识别这个(下)时它运行良好,但它不允许我更改全名字段..有比自动编号列更好的解决方案?

        private void update_Click(object sender, EventArgs e)
    


        string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb";

        OleDbConnection myConnection = new OleDbConnection(connectionString);
        string myInsertQuery =(String.Format("UPDATE tblCodons SET codonsCodon1='0', codonsCodon3='1', " + 
        "codonsTriplet1='2', codonsTriplet2='3', codonsTriplet3='4', codonsTriplet4='5', " + 
        "codonsTriplet5='6', codonsTriplet6='7', codonsFullName='8'" + 
        " WHERE codonsFullName = 9",codon1.Text, codon3.Text ,triplet1.Text, triplet2.Text,
         triplet3.Text, triplet4.Text, triplet5.Text, triplet6.Text,
        fullName.Text,this.name));
        OleDbCommand myCommand = new OleDbCommand(myInsertQuery);
        myCommand.Connection = myConnection;
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        myCommand.Connection.Close();
        this.tblCodonsTableAdapter.Fill(this.myProjectDataSet.tblCodons);

name=全名的保存值,在每次点击时的值变化

还有一个问题。我尝试对 e.Row 做同样的事情(我在每次点击表格时保存),我得到一个错误“System.Data.OleDb.OleDbException (0x80004005): can cue a duplicate values on the index, or on the mainKey 或在关系中”‏‏

【问题讨论】:

使用带参数的存储过程与内联 SQL.. 内联 SQL 允许 SQL 注入的可能性。然后该过程可以返回位置/ID。 +1 xQbert!要使这个代码更安全,请参阅:msdn.microsoft.com/en-us/library/ff648339.aspx - 另一种选择是参数化 SQL。 【参考方案1】:

看到这个:

http://msdn.microsoft.com/en-us/library/ks9f57t0(v=VS.80).aspx

请参阅标有“检索 Microsoft Access 自动编号值”的部分

排序版本

OleDbCommand cmdNewID = new OleDbCommand("SELECT @@IDENTITY",
            connection)

我不相信 SCOPE_IDENTITY() 存在于访问中

【讨论】:

【参考方案2】:

我建议将查询从内联 sql 移动到存储过程。与其说是停止 SQL 注入,不如说是因为您可以将存储过程设置为返回其刚刚创建的标识(自动编号)字段的值。只需让它在运行 sql 后返回 SCOPE_IDENTITY。

所有这些都假设您使用的是 SQL 服务器(我不熟悉其他数据库,但会假设它们具有类似的功能)

查看链接了解更多信息

http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx

编辑:哇,答案很快!为重复的答案道歉

EDIT2:看起来访问公开了一个变量@@IDENTITY,其中包含最后使用/创建的自动编号。所以你应该能够运行和内联查询,并按照“SELECT @@IDENTITY AS prevID”的行跟随它

【讨论】:

我们在一些代码的内联查询中使用 Scope_Identity,它工作正常。我们只需将语句写成一行,用分号分隔成一行中的两个语句。示例:“insert into MyTable (myValues);Select @@Identity” 我不确定这是否适用于所有 RDBMS,但它适用于我们较旧的 SQL Server。它也可以在 Access 中工作。 tbh David Stratton 重新启动...只需运行原始查询,然后运行 ​​';SELECT @@IDENTITY' 并将其与 .executequery 而不是 .executenonquery 一起使用。真的没有很多额外的工作 抱歉不耐烦了,你是说 .executeReder 吗?没有这样的东西 .executeQuery.. 是的,我做到了!很抱歉有任何困惑 @JamesSinclair 请帮帮我。我添加了一个编辑

以上是关于从数据库中获取 autoNumber 值的主要内容,如果未能解决你的问题,请参考以下文章

插入时的 JDBC PreparedStatement 默认值 (UCanAccess)

在 C# 中使用 MS Access 查找字段

自动将枚举成员的值设置为其名称

如何从 OnMarkerClickListener 内的 Firebase 数据库中获取特定值?

使用休眠从数据库中获取下一个序列值

从数据库中不存在的数组中获取特定值