2010-08-04 4 views
1

다음 문제를 처리하고 있습니다. DataGridView에 내 데이터를 표시하기 위해 MSSQL 저장 프로 시저를 사용합니다. 업데이트 및 삽입 명령이 작동하지만 한 가지 문제가 있습니다.SP로 업데이트 한 후 레코드를 새로 고치는 방법

새 행을 삽입하면 자동으로 번호가 지정된 기본 키가 DataAdaptar로 다시 전송되지 않습니다. 따라서 삽입은 데이터베이스에서 성공하지만 PK는 DataGridView에 공백으로 남습니다. 나는 allready 같은 일부 코드 시도 : 데이터 어댑터에

private void _rowUpdated(object sender, SqlRowUpdatedEventArgs e) 
    { 
     if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert) 
     { 
      cmd = conn.CreateCommand(); 
      cmd.CommandText = "SELECT @@IDENTITY FROM " + e.Row.Table.TableName; 

      DataRow r = dt.Rows[dt.Rows.Count - 1]; 
      r.ItemArray[0] = cmd.ExecuteScalar(); 
      //r.SetModified(); --> err? 
      r.AcceptChanges(); 
     } 
    } 

,하지만 아무것도 작동하는 것 같다 없습니다. 모든 SQL 명령이 정상적으로 작동합니다.

DataGridView에서 데이터를 새로 고칠 때마다 모든 것이 완벽합니다. 그러나이 문제는 정렬 순서와 열 너비가 조정된다는 것입니다. 그리고 그것은 내가 원하는 것이 아닙니다.

누군가가이 문제를 해결할 수 있습니까?

솔루션을 기대합니다!

감사합니다.

답변

1

마지막으로 답을 발견하고 공유하고 싶었 :

dt.RowChanged += new DataRowChangeEventHandler(_update_fields); 


    private void _update_fields(object sender, DataRowChangeEventArgs e) 
    { 
     try 
     { 
      if (e.Action == DataRowAction.Add) 
      { 
       conn.Open(); 
       cmd = conn.CreateCommand(); 
       cmd.CommandText = "SELECT IDENT_CURRENT('" + e.Row.Table.TableName + "')"; 
       dt.Rows[dt.Rows.Count - 1][0] = int.Parse(cmd.ExecuteScalar().ToString()) + 1; 
       dt.AcceptChanges(); 
       conn.Close(); 
      } 
      adapt.Update(dt); 
     } 
     catch (SqlException ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 
    } 

그것이 당신에게 시간을 절약 할 수 있습니다 희망! :)

할머니 VeeWee

0

SQL 서버에 대한 연결이 종료되어 @@ identity가 null이되므로 null 값을 얻게됩니다.

scope_identity()는 스코프가 호출되는 장소 (즉, 프로 시저)로 제한되기 때문에 사용할 수 없습니다.

ident_current()는 항상 사용자가 지정한 테이블의 마지막 ID 값을 반환합니다. 그것은

Update your commandText to ="Select ident_current("+e.Row.Table.TableName+")" 

복제

의 경우 올바른 작동하지 않을 수 있습니다 여기에 ID 값을 검색하는 다양한 기술을 사용하여 결과입니다. 같은에 트리거를 사용하는 경우 테이블 이름으로 dbo.M_PatientEntry 교체

select ident_current('dbo.M_PatientEntry') 
--------------------------------------- 
13 

select @@identity from dbo.M_PatientEntry  
--------------------------------------- 
NULL 
NULL 

select scope_identity()  
--------------------------------------- 
NULL 

select scope_identity() from dbo.M_PatientEntry  
--------------------------------------- 
NULL 
NULL 

또한 오히려 SCOPE_IDENTITY() 또는 IDENT_CURRENT 를 사용 @@ IDENTITY를 피하려고 @@ IDENTITY는 당신에게 트리거 테이블 결과의 증분 값을 줄 것이다 삽입이 진행되는 테이블. see this documentation

+0

안녕하세요, 는이 같은 코드 테스트 : cmd.CommandText이 = "('+ e.Row.Table.TableName +"IDENT_CURRENT) "을 선택"'; var res = cmd.ExecuteScalar(); Debug.WriteLine ("RESULTS :"+ res); 내 쿼리와 같은 결과가 나타납니다. 하지만 당신이 옳아,이 SQL 함수를 사용하는 것이 낫다. 그러나 문제는 여전히 존재합니다 : PK 필드가 비어 있습니다. 나는 datarow 함수에 저장되지 않습니다 같아요. 그러나 내가 사용하는 모든 액션 (Update, AcceptChanges, ..)은 무한 루프를 초래합니다. 어떤 제안? – VeeWee

+0

@VeeWee : 왜 cmd에 중단 점을 넣지 마십시오.ExecuteScalar()를 호출하고 값을 확인합니다. VS.Net의 직접 창 (Alt + Ctrl + I)에서 결과를 확인하십시오. 이'cmd.ExecuteScalar()'를 붙여 넣기 만하면 무엇을 얻고 있는지 확인하십시오. SQL Server에서 동일한 쿼리를 시도하십시오. 그것은 당신에게 원하는 결과를 줄 것이다. 나는 단절된 아키텍처에서 작업하는 것에 대해 많은 것을 말할 수 없으므로 이와 관련된 문제에 대해 많은 도움을줍니다. –

+0

@VeeWee :이 이벤트는 루프에서 실행중인 row_updated()입니까? 이것이 ** ** "내가 사용하는 모든 액션 (Update, AcceptChanges, ..)은 무한 루프를 발생시킨다"** –

관련 문제