2011-09-28 4 views
1

참고 :이 문제는 해결되었지만 new question으로 이어집니다..NET SQL 새 테이블이 없습니다.

System.Data.SqlClient.SqlException "Invalid object name [tablename]"

내가 배포 된 제품에 대한 업데이트와 함께 제공하는 DB 업데이트에서 일하고 있어요 :


는이 오류를 받고 있어요. 새로 업데이트 된 응용 프로그램이 처음 실행되면 데이터베이스 업데이트가 실행되며 두 가지 주요 단계가 있습니다.

  1. Run script update.sql to add new tables to the database
  2. Call some methods to copy some data from existing tables to popuplate the new tables, and do some math/make some adjustments.

1 단계는 완벽하게 작동합니다. 2 단계는 새로운 테이블을 참조 할 때마다 위 예외를 던집니다. 예외가 나타나는 곳에서 호출되는 코드는 (새 버전의) 애플리케이션에서 여러 번 사용되며 일반적으로 문제가되지 않습니다. 이 코드가 이전 버전의 데이터베이스에서 실행되면 (사용하는 테이블이 존재하지 않기 때문에)이 문제가 발생할 것으로 예상되지만,이 경우 테이블이 방금 추가되었습니다.

업데이트 코드 :

internal void Update() 
{ 
    RunScript(); //runs the SQL script, adds tables to the db 

    OtherClass oc = new OtherClass(); 
    oc.PrepData(); //no error, just makes some minor tweaks to existing table 
    oc.CopyData(); //throws exception, none of the new tables appear to exist 
    oc.AdjustData(); //manipulates the data in the new table, probably throws exception but currently unreachable 
} 

public class OtherClass 
{ 
    private AppEntities db; 

    public OtherClass() 
    { 
     db = new AppEntities(); 
     //other constructor activity 
    } 

    internal void CopyData() 
    { 
     foreach(DataItem di in db.DataItems) //This throws the exception (with any of the new tables) 
     { 
     } 
    } 
} 

를 제외하고는 테이블이 데이터베이스에 추가 후 초기화 엔티티 세트에 의해 발생합니다, 그러나 여전히 인정하지 않고, 위와 같이 그 중 하나가 있다.

아무도 이런 문제가 발생 했습니까? 주위에 방법이 있습니까?

UPDATE :
뭔가를 발견했습니다, 나는이 문제가 될 수 있어야합니다 생각했다. AppEntities db (OtherClass)의 선언이 private AppEntities db = new AppEntities();으로 변경되었으며 더 이상 생성자에서 초기화되지 않아 스크립트가 실행되기 전에 생성되지 않습니다. 불행히도이 문제를 해결하면 여전히 같은 문제가 발생합니다.

UPDATE :
데이터 컨텍스트를 보장하기 위해 새로운 테이블에 대해, 내가 스크립트를 실행하는 방식을 변경했을 알고있다.

이전 (제대로 데이터베이스에 대해 스크립트, 응용 프로그램이 새 테이블을 찾을 수 없습니다 실행) : 현재

StreamReader sr = new StreamReader(File.Open(String.Format("{0}/Scripts/CURRENTVERSION.sql", AppDomain.CurrentDomain.BaseDirectory), FileMode.Open)); 
string UpdateScript = sr.ReadToEnd(); 
sr.Close(); 

//Here connectionstring was the database's connection taken from the .edmx file and trimmed of arguments that caused exceptions as invalid 
SqlConnection connection = new SqlConnection(connectionstring); 

SqlCommand command = new SqlCommand(UpdateScript); 
connection.Open(); 
command.ExecuteNonQuery(); 
connection.Close(); 

을 : 나는 시도 모두 주석 및 해제 주석 처리 된 줄 것

StreamReader sr = new StreamReader(File.Open(String.Format("{0}/Scripts/CURRENTVERSION.sql", AppDomain.CurrentDomain.BaseDirectory), FileMode.Open)); 
string UpdateScript = sr.ReadToEnd(); 
sr.Close(); 

System.Data.Common.DbCommand command = db.Connection.CreateCommand(); 
command.CommandText = UpdatScript; 
//command.CommandText = @UpdateScript; 
db.Connection.Open(); 
command.ExecuteNonQuery(); 

(@가 있든 없든), 스크립트의 모든 행에 구문 오류가 있다고 주장합니다 (첫 번째 메소드가 완벽하게 실행되는 동일한 스크립트). db.Connection.Close();

UPDATE : this question and answer를 사용
, 나는 성공적으로 AppEntities 연결을 사용하여 SQL 스크립트를 실행 할 수 있었고, 테이블은 데이터베이스에 나타나지 않았다. 그러나 AppEntities (스크립트가 실행 된 이후 초기화 된 클래스의 개체) 여전히 잘못된 개체 이름의 예외를 throw합니다.

런타임시 데이터 컨텍스트를 데이터베이스에서 자동으로 업데이트하는 방법이 있습니까? (솔루션)

UPDATE : (크리스의 활발한 제안에 따라) AppEntities으로 파고
거대한 두통,하지만 그것은뿐만 아니라 설정 파일의 일부를 파고에 저를 인도했다. 거기에 새로운 테이블이 복수형 (TableForEntities이 아닌 TableForEntity이 아닌)이라는 단수의 이름으로 매핑된다는 것을 알았습니다. 이전에는 복수형이었습니다 (작동했을 때). 오래된 테이블도 모두 복수형이었습니다. 새 테이블을 여기에있는 복수형으로 변경하면 모든 종류의 오류가 발생하므로 SQL 스크립트를 변경하여 단수로 이름을 지정합니다. 놀랍게도, 이것은 효과가 있었다.

복수형으로 명명 된 SQL 스크립트가 실제로 작동 한 데이터베이스 (복수형으로 명명 된 위치)를 기반으로 자동 생성되었다고 생각하면 명명 작업을 변경해야하는 이유는 무엇입니까? 무엇이든지라면 의 문제를 일으켰습니다.

+2

스크립트를 확인하십시오. 올바른 데이터베이스를 대상으로하고 있습니까? 거래가있는 경우 거래가 이루어지고 있습니까? – driis

+0

예, 스크립트가 올바른 데이터베이스를 대상으로합니다. 디버깅 할 때 SQL Management Studio를 열었습니다. 예외가 나타나면 테이블이 실제로 데이터베이스에 있는지 확인할 수 있습니다. – yoozer8

+1

테이블이 마술처럼 사라지지 않습니다. 이름을 다시 확인하고 새 테이블을 올바른 스키마에 포함 시키십시오. 응용 프로그램과 동일한 사용자로 데이터베이스에 로그인하여 사용 권한 문제를 확인하십시오. – driis

답변

1

AppEntities는 무엇인지 모르겠지만 새로운 데이터베이스의 구조를 반영하지 않는다고 확신합니다.

전적으로 데이터베이스 초기 버전을 기반으로하고 새로운 테이블에 대한 정보를 보유하기 위해 recodegen'd (sp?)되지 않은 생성 된 코드 형태라고 생각할 것입니다. 따라서 오류.

이 경우에도 응용 프로그램이 실행되기 전에 테이블을 만들 때 동일한 위치에서 응용 프로그램이 여전히 실패하는 이유가 설명됩니다.

요약하면 AppEntities를 조사하여 정확히 어떻게 작동하는지 파악하십시오.

+0

새 테이블이있는 새 레이아웃을 기반으로합니다. 업데이트 스크립트를 테스트하기 위해 데이터베이스에서 새 테이블을 제거하고 응용 프로그램을 실행 한 다음 SQL 스크립트를 실행하여 추가합니다. – yoozer8

+0

@Jim : RunScript는 "OtherClass"와 아무 관계가없는 것으로 보입니다. 나는 OtherClass가 당신의 새 테이블이 뭔지 전혀 모른다 고 말하고 있습니다. – NotMe

+0

당신은 나를 올바른 길로 인도하고 해결책을 찾았습니다. 그것은 또 다른 질문을 제기했지만, 나는 그것이 내가 별도의 질문으로 질문 할 것이라고 생각한다. 도움을 주셔서 감사 드리며 마지막에 제기 한 질문에 대한 통찰력을 제공 할 수 있다고 생각되면 일단 질문이 끝나면 링크 해 드리겠습니다. – yoozer8

관련 문제