从数据库中获取 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)