2

コードは以下です。私のコードでは、プログラムがテキストボックスからすべての更新された値を取得するように、(既存のテーブルから) 既存の行を更新しています。「codonsAutoNum」という名前のテーブルautoNumberフィールドの最後(最後の列)にあります

データベースから値 (autonumber 値) を取得する方法がわかりません。「??」がある位置 (コード内) の値が必要です。

助けてくれてありがとう!

コード:

        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= fullname の保存された値で、クリックするたびに値が変化します

もう1つのクエスト。e.Row (テーブルをクリックするたびに保存したもの) で同じことをしようとしましたが、「System.Data.OleDb.OleDbException (0x80004005): can caue a duplicated 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 Autonumber 値の取得」というセクションを参照してください。

並べ替えバージョン

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

アクセスに SCOPE_IDENTITY() が存在するとは思わない

于 2011-11-24T14:03:59.813 に答える
1

クエリをインライン SQL からストアド プロシージャに移動することをお勧めします。SQL インジェクションを止めるほどではありませんが、作成したばかりの ID (自動番号) フィールドの値を返すようにストアド プロシージャを設定できるためです。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 に答える