2

代码如下。在我的代码中,我更新了现有行(从现有表),程序从文本框获取所有更新的值。表 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 或在关系中”‏‏</p>

4

2 回答 2

2

看到这个:

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

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

排序版本

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

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

于 2011-11-24T14:03:59.813 回答
1

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

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

查看链接了解更多信息

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

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

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

于 2011-11-24T14:04:14.290 回答