복붙노트

[SQL] C #으로 SQLite.NET와 마지막 삽입 ID 얻기

SQL

C #으로 SQLite.NET와 마지막 삽입 ID 얻기

나는 현재이 같은 데이터베이스에 일부 데이터를 삽입하고 ... 소위 간단하지 솔루션 간단한 문제가 :

                kompenzacijeDataSet.KompenzacijeRow kompenzacija = kompenzacijeDataSet.Kompenzacije.NewKompenzacijeRow();
                kompenzacija.Datum = DateTime.Now;
                kompenzacija.PodjetjeID = stranka.id;
                kompenzacija.Znesek = Decimal.Parse(tbZnesek.Text);

                kompenzacijeDataSet.Kompenzacije.Rows.Add(kompenzacija);

                kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter kompTA = new kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter();
                kompTA.Update(this.kompenzacijeDataSet.Kompenzacije);

                this.currentKompenzacijaID = LastInsertID(kompTA.Connection);

마지막 줄은 중요하다. 왜 연결을 제공합니까? 그럼 당신이 전화를 마지막으로 삽입 된 ID를 얻을 수) (LAST_INSERT_ROWID라는 SQLite는 기능이있다. 문제는 연결에 바인딩 및 .NET을 재개하고 모든 데이터 세트 작업을 위해 연결을 종료 할 것입니다. 나는 상황을 타개 할 테이블 어댑터의 연결을 받고 생각했다. 그러나 그것은하지 않습니다.

겠습니까 누군가를 알고 어떻게이 문제를 해결하려면? 어쩌면 곳에서 일정한 연결을 얻으려면? 아니면 더 우아한 뭔가?

감사합니다.

편집하다:

내가 트랜잭션을 사용하고자한다면 그 또한 문제가 있으므로이 또한 거래에 문제가, 나, 동일한 연결을해야합니다 ...

해결법

  1. ==============================

    1.

    select last_insert_rowid();
    

    그리고 당신은 스칼라 쿼리로 실행해야합니다.

    string sql = @"select last_insert_rowid()";
    long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
    
  2. ==============================

    2.SQLite는과 C의 # (.NET 4.0)를 사용하여 SQLiteConnection 클래스 속성은 가장 최근에 삽입 (또는 갱신) 요소의 기본 정수 키에 해당 LastInsertRowId있다.

    SQLite는과 C의 # (.NET 4.0)를 사용하여 SQLiteConnection 클래스 속성은 가장 최근에 삽입 (또는 갱신) 요소의 기본 정수 키에 해당 LastInsertRowId있다.

    테이블에 기본 정수 키가없는 경우 ROWID가 반환됩니다 (이 경우에는 ROWID는 열이 자동으로 생성된다).

    이상 https://www.sqlite.org/c3ref/last_insert_rowid.html를 참조하십시오.

    단일 트랜잭션에서 여러 명령을 포장에 관해서는, 모든 명령은 트랜잭션이 시작된 후 입력과이 커밋되기 전에 하나의 트랜잭션의 일부입니다.

    long rowID;
    using (SQLiteConnection con = new SQLiteConnection([datasource])
    {
        SQLiteTransaction transaction = null;
        transaction = con.BeginTransaction();
    
        ... [execute insert statement]
    
        rowID = con.LastInsertRowId;
    
        transaction.Commit()
    }
    
  3. ==============================

    3.LAST_INSERT_ROWID ()는 상기 용액의 일부이다. 그것은 행 번호가 아닌 실제 ID를 반환합니다.

    LAST_INSERT_ROWID ()는 상기 용액의 일부이다. 그것은 행 번호가 아닌 실제 ID를 반환합니다.

    cmd = CNN.CreateCommand();
    cmd.CommandText = "SELECT last_insert_rowid()";
    object i = cmd.ExecuteScalar();
    
    cmd.CommandText = "SELECT " + ID_Name + " FROM " + TableName + " WHERE rowid=" + i.ToString();
    i = cmd.ExecuteScalar();
    
  4. ==============================

    4.SQLiteConnection 객체는 그에 대한 속성을 가지고 있으므로 추가 쿼리가 필요하지 않습니다. INSERT 후 그냥 내 사용은 INSERT 명령에 사용 된 당신의 SQLiteConnection 개체의 속성을 LastInsertRowId. 의 lastInsertRowID 속성의 유형은 INT64입니다. 물론 끄기, 이미 지금, 자동 증가가 테이블에 기본 키를 작동하려면 다른 주제 자동 증가 필드를로 설정해야한다.

    SQLiteConnection 객체는 그에 대한 속성을 가지고 있으므로 추가 쿼리가 필요하지 않습니다. INSERT 후 그냥 내 사용은 INSERT 명령에 사용 된 당신의 SQLiteConnection 개체의 속성을 LastInsertRowId. 의 lastInsertRowID 속성의 유형은 INT64입니다. 물론 끄기, 이미 지금, 자동 증가가 테이블에 기본 키를 작동하려면 다른 주제 자동 증가 필드를로 설정해야한다.

  5. ==============================

    5.

        database = new SQLiteConnection(databasePath);
    
        public int GetLastInsertId()
        {
            return (int)SQLite3.LastInsertRowid(database.Handle);
        }
    
  6. ==============================

    6.이 모두 마이크로 소프트의 참조 및 SQLite는의 참조에 대한 답변 것으로 보인다 그리고 어떤 사람들은 사업에의 lastInsertRowID 속성을 받고 다른 사람들이하지 않는 이유입니다.

    이 모두 마이크로 소프트의 참조 및 SQLite는의 참조에 대한 답변 것으로 보인다 그리고 어떤 사람들은 사업에의 lastInsertRowID 속성을 받고 다른 사람들이하지 않는 이유입니다.

    는 ROWID 컬럼에 대한 단지의 별칭입니다 개인적으로 나는 PK를 사용하지 마십시오. ROWID를 사용하는 것은 배 빠른 하나 당신이 만드는 것이 약이다. 나는 PK I의 TEXT 컬럼이있는 경우 여전히 ROWID 사용하고 단지 텍스트 열이 고유하게 만들기. (SQLite는 3 만하십시오. 당신은 ROWID 번호를 변경합니다 진공으로 V1 및 V2에 대한 자신의 필요)

    즉, 마지막 삽입의 기록에서 정보를 얻을 수있는 방법은 아래의 코드 말했다. 함수가 왼쪽 자체에 가입 않기 때문에 당신은 단지 주 SELECT 문에서 한 기록이있을 것하지 않는 경우에도 나는, 단지 속도를 1로 제한합니다.

    SELECT my_primary_key_column FROM my_table
    WHERE rowid in (SELECT last_insert_rowid() LIMIT 1);
    
  7. from https://stackoverflow.com/questions/4341178/getting-the-last-insert-id-with-sqlite-net-in-c-sharp by cc-by-sa and MIT license