2016-11-14 4 views
1

내 프로그램에 온라인 및 오프라인 모드가 있습니다.SqlCeCommand를 삽입 한 후 SCOPE_IDENTITY를 선택하십시오.

  • 온라인은 C# SqlCommand 클래스를 사용하여 SQL Server 인스턴스에 연결합니다.
  • 오프라인으로 C# SqlCeCommand 클래스를 사용하여 로컬 .SDF 파일에 연결됩니다.

는 지금은 온라인 모드에서

GetSqlCommand("insert into my_table (col1) values (@c1); SELECT SCOPE_IDENTITY()", conn)) 

그래서 내가 SELECT SCOPE_IDENTITY()와 함께 그 새로운 기록의 ID를 다시 얻을 레코드를 삽입 할 때 작동하는 다음을 수행합니다.

그러나 SQL Server CE를 사용하는 오프라인 모드에서는 오류가 발생합니다. 별도의 쿼리를 실행하지 않고 SQL Server CE의 삽입물에서 ID를 다시 가져 오는 방법이 있습니까?

답변

1

SQL 서버 CE는 하나의 명령에 아래와 같이 Damith 대답이 옳다

SqlCeCommand cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn); 
//set paremeter values 
//execute insert 
cmd.ExecuteNonQuery(); 
//now change the sql statment to take identity 
cmd.CommandText = "SELECT @@IDENTITY"; 
int id = Convert.ToInt32(cmd.ExecuteScalar()); 

https://stackoverflow.com/a/6480017/2558060

0

있지만 시도, 예, SQL 서버 CE 여러 쿼리를 실행할 수있는 여러 쿼리를 지원하지 않습니다.

동일한 코드로 예제를 작성합니다.

SqlCeCommand cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn); 
    //set paremeter values 
    //execute insert 
    cmd.ExecuteNonQuery(); 
    //now change the sql statment to take identity 
    ////////////////**CONNECTION SHOULD NOT BE CLOSED BETWEEN TWO COMMANDS**///// 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    int id = Convert.ToInt32(cmd.ExecuteScalar()); 

참고 : 연결은 두 명령 사이에서 열려야합니다. 그렇지 않으면 두 번째 쿼리가 실패합니다.

이 코드를 트랜잭션에서 사용하는 것이 좋습니다.

참고 : SQL Server CE 개체는 스레드로부터 안전하지 않으므로 SqlCeConnection 또는 SqlCeTransaction 인스턴스가 스레드간에 공유되면 액세스 위반 예외가 발생할 수 있습니다. 각 스레드는 별도의 연결을 사용해야하며 여러 스레드에서 공유해서는 안됩니다.

0

나는 이것이 당신의 대답이라고 생각한다 : How do I use an INSERT statement's OUTPUT clause to get the identity value? 그러나 나는 SQL CE에 대해 확신하지 못한다. 시도 해보자.

편집 : 다음이 대답은 아마 맞다 : Inserting into SQL Server CE database file and return inserted id

+0

좋은 생각. 하지만 슬프게도 CE는이를 지원하지 않습니다 : https://technet.microsoft.com/en-us/library/ms174633(v=sql.110).aspx –