0

내가했던 모든 것 : 비주얼 스튜디오 2013 C# 프로젝트에서DataSet 개체를 인스턴스화하면 CRUD 작업을 위해 SQL 서비스 기반 데이터베이스에 자동으로 연결이 생성됩니까? 여기

  1. , 나는 (파일의 .mdf) 서비스 데이터베이스를 만들었습니다. 참고 : 이름을 Database1.mdf에서 fghLocalDB.mdf로 변경했습니다. enter image description here

  2. 이 데이터베이스는 서버 탐색기에서 열었습니다.

  3. 테이블 디자이너를 사용하여 Country 및 CarbonDioxide라는 2 개의 테이블을 만들었습니다. enter image description here

  4. 국가 테이블의 데이터 테이블에 표시된대로 국가 테이블에 항목을 추가했습니다. enter image description here

  5. 내 응용 프로그램에서 사용할 수있는 데이터 세트를 만들려면 다음을 수행했습니다. 상단 메뉴 표시 줄의 "프로젝트"옵션을 클릭하고 드롭 다운에서 "새 데이터 소스 추가 ..."옵션을 클릭하여 데이터 소스를 만들었습니다. enter image description here enter image description here enter image description here enter image description here

  6. 이 내 프로젝트 파일이 시점에서 어떻게 생겼는지입니다 .

  7. 나는이 방법이 데이터베이스에 쓰는 데 필요한 모든 것이라고 생각하는 기본 코드에서 다음 코드를 작성했습니다.

    // Create a connection to the DataSet and TableAdapters that will communicate with our 
    // local database to handle CRUD operations. 
    
    
    fghLocalDBDataSet dataSet = new fghLocalDBDataSet(); 
    fghLocalDBDataSetTableAdapters.CountryTableAdapter countryTableAdapter = 
    new fghLocalDBDataSetTableAdapters.CountryTableAdapter(); 
    
    try 
    { 
        // Insert a row into Country table. EDIT 1 Will comment after first program run. 
        Console.WriteLine(countryTableAdapter.Insert("United States")); 
    
        // Actually writeback information to the database?  
        // dataSet.AcceptChanges(); EDIT 2 commented this as LeY suggested it was not needed. 
    
    
        // EDIT 3 Validation code as suggested by Ley. 
        var dt = new fghLocalDBDataSet.CountryDataTable(); 
        var adapter = new fghLocalDBDataSetTableAdapters.CountryTableAdapter(); 
        adapter.Fill(dt); 
    
        foreach (var row in dt) 
        { 
          // This does not get executed after a second run of the program.   
          // Nothing is printed to the screen. 
          Console.WriteLine("Id:" + row.Id + "----Name: " + row.Name); 
        } 
        Console.Read(); 
    } 
    catch(SqlException exception){ 
        Console.WriteLine("ERROR: " + exception.ToString()); 
    } 
    Console.ReadLine(); 
    
  8. 나는 프로그램을 실행하고 모든 것이 잘 보였다.

  9. 서버 탐색기에서이 테이블을 마우스 오른쪽 버튼으로 클릭하고 "데이터 테이블 표시"를 눌러 테이블을 열었습니다.
  10. "미국"행이 원하는대로 추가되지 않았습니다.
  11. 연결 고리와 관련이 있다고 생각합니다. 내 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 열었습니다. enter image description here enter image description here

  12. 는 여기에 연결 문자열은 데이터베이스의 속성에 문자열을보고 그 로컬 데이터베이스의 일치 확인했다. 그들은 동일합니다. enter image description here

내가 복사하고 각 연결 문자열에 대한 실제 텍스트 붙여 넣기 : 프로젝트의

연결 문자열 :

데이터 원본 = (LocalDB) \의 V11.0; 인 AttachDBFilename를 = | DataDirectory를 | \ fghLocalDB.mdf; 통합 보안 = 실제 데이터베이스의 진정한

연결 문자열 (의 .mdf 파일) :

데이터 소스 = (LocalDB) \ v11.0, AttachDbFilename = C : \ Users \ gabriel \ Source \ Workspaces \ Capstone \ Sandbox \ aduclos \ QueryDataMarketConsole \ QueryDataMarketConsole \ fghLocalDB.통합 보안 = True

나는 DataDirectory | C : \ Users \ gabriel \ Source \ Workspaces \ Capstone \ Sandbox \ aduclos \ QueryDataMarketConsole \ QueryDataMarketConsole \ fghLocalDB.mdf와 같습니다. 위의 그림에서 연결 문자열의 값을 확장하기 위해 단추를 클릭했을 때 연결 속성 창이 열리고 데이터베이스 파일 이름에 대한이 경로가 있었기 때문입니다.

간단히 말해서 질문에 DataSet 개체를 인스턴스화하면 CRUD 작업을 위해 SQL 서비스 기반 데이터베이스에 자동으로 연결이 생성됩니까?

TableAdapters를 사용할 때 실제로 데이터베이스에 쓸 수 있도록 DataSet 개체를 SQL 데이터베이스에 어떻게 연결합니까?

Insert method of TableAdapter not working?

TableAdapter Insert not persisting data

Use connectionstring from web.config in source code file

내가 실제 SqlConnection 개체가 필요하십니까 :

나는 다음 링크를 읽어? 이걸 DataSet & TableAdapters에 연결하는 방법은 무엇입니까?

답변

1

tableadpter.insert() 메서드를 사용한 적이 없습니다. 하지만 내 로컬 컴퓨터에서 해봤지만 제대로 작동합니다. 제공된 정보를 기반으로 문제를 파악할 수는 없지만 미안하지만 방향을 제시 할 수 있습니다.

마법사에서 모든 것을 만들었 으면 연결에 대해 걱정할 필요가 없으며 테이블 어댑터가 연결을 처리합니다. 동그라미 표시된 연결 문자열은 설정 클래스와 함께 app.config 파일에 자동으로 추가됩니다. 그것이 응용 프로그램 (또는 사용자)이이를 사용하는 방법입니다. 예외, 나는 당신을 위해 작동하지 않는 이유를 알고하지 않습니다 발생하지있을 경우 코드의

var countryTableAdapter = new CountryTableAdapter(); countryTableAdapter.Insert("United States");

이 2 개 라인은 데이터베이스에 행을 삽입하기에 충분하다. 어쩌면 어떻게 든 그것을 확인하는 방법은 잘못되었지만 다른 방법으로 확인할 수 있습니다.

countryTableAdapter.Insert 메서드는 영향을받는 행 수를 반환합니다. 귀하의 경우에는 하나 여야합니다. 그래서 다음 코드를 넣고 그 뒤에 중단 점을 설정하십시오. rowAffected == 1이면 삽입이 작동합니다.

var rowAffected = countryTableAdapter.Insert("Test2")

더 확인이 필요한 경우,이 시도.

var dt = new fghLocalDBDataSet.CountryDataTable(); 
var adapter = new CountryTableAdapter(); 
adapter.fill(dt); 
foreach (var row in dt){ 
    Console.WriteLine("Id:" + row.Id + "----Name: " + row.Name); 
} 
Console.Read(); 

테이블에 모든 레코드가 표시됩니다. 도움이되기를 바랍니다. 코드의 라인은 위의 모든 데이터베이스를 업데이트하지 않는 코드

dataSet.AcceptChanges(); 

에서 그런데

. 로컬 데이터 저장소 만 수정합니다. 현재 버전을 사용하여 dataRow 원본 버전을 덮어 쓰고 현재 버전 행 상태를 변경되지 않은 상태로 변경합니다.

테이블 어댑터 만 데이터베이스와 대화 할 수 있습니다 (사실은 아는 것이 아니라 데이터 세트가 데이터베이스와 직접 대화 할 수 없다는 점을 분명히하고 싶습니다). 그리고 난 보통 단지 tableadapte.Update 메소드가 필요하고 dataSet 또는 dataTable을 올바른 RowState와 함께 전달해야한다.

데이터베이스를 성공적으로 업데이트 한 경우 tableAdapter.update 메서드는 각 행에서 최종적으로 AcceptChanges를 호출합니다.

메모리에서 데이터 집합 만 업데이트하려는 경우가 아니면 AcceptChanges를 명시 적으로 호출 할 필요가 없습니다.

DataSet 및 TableAdapter가 어떻게 작동하는지 큰 그림을 보려면 ADO.NET Architecture을 읽어 보는 것이 좋습니다.

+0

제안한 유효성 검사 코드를 추가하려고 시도했습니다. 그것은 자신의 줄에 "1"을 출력 한 다음 "Id : 1 ---- Name : United States"를 인쇄합니다. 그래서 그게 효과가 있다고 생각하게 해. 그러나 데이터베이스에 실제로 기록한 경우 프로그램을 종료 한 후에도 계속 유지됩니다. 그래서 실행 파일을 끝내고이 줄을 주석 처리했습니다. "Console.WriteLine (countryTableAdapter.Insert ("United States "));" "미국"은 이미 첫 번째 실행에서 데이터베이스에 있기 때문입니다. 이제 프로그램을 실행할 때 아무 것도 출력되지 않습니다. 이는 dt가 빈 테이블임을 의미합니다. 똑같은 것을 시도하고보고 할 수 있습니까? – fgharo91

0

결국 내 연결 문자열이었습니다. | DataDirectory를 | \ fghLocalDB 인 AttachDBFilename =;

데이터 원본 = (LocalDB) \의 V11.0 : 프로젝트 설정에서

  1. 연결 문자열 : 내 원래의 게시물에서, 나는 두 개의 연결 문자열을했다고 말했다. ; MDF 통합 보안 = 진정한

    fghLocalDB.mdf 파일
  2. 실제 연결 문자열
      :

    데이터 원본 = (LocalDB) \ V11.0을, 인 AttachDBFilename = C를 : \ 사용자 \ 가브리엘 \ 소스 \ 작업 공간 \ 캡 스톤 \ 샌드 박스 \ aduclos QueryDataMarketConsole \ QueryDataMarketConsole \ fghLocalDB.mdf \; 사실

    뭔가

    과 잘못된 통합 보안 = | DataDirectory를 | = C : \ Users \ gabriel \ Source \ Workspaces \ Capstone \ Sandbox \ aduclos \ QueryDataMarketConsole \ QueryDataMarketConsole \ fghLocalDB.mdf;

    내 App.config에.

    내 솔루션 : 내가 한 것은 .mdf 속성 패널에서 .mdf 파일의 실제 연결 문자열을 복사하여 프로젝트 속성 => 설정 => 연결 문자열의 값 필드에 붙여 넣습니다.

    나중에 코드를 다시 실행했는데 데이터가 테이블에 계속 유지되었습니다.

    dataSet.AcceptChanges();이 필요하지 않았습니다. #LeY가 지적했듯이. 또한 다른 솔루션에 게시 된 TableAdapter.Update (데이터 집합) 호출이 필요하지 않았습니다. 방금 TableAdapter.Insert ("...") 호출이 필요했습니다.

    EDIT : ALSO 가장 중요한 것은 원래 질문에 대한 대답으로, 인스턴스화는 DataSet이 로컬 데이터베이스와의 연결을 생성하지 않는다는 것입니다. 대신 TableAdapter를 인스턴스화하면 데이터베이스와의 연결이 설정됩니다!