참고 :이 문제는 해결되었지만 new question으로 이어집니다..NET SQL 새 테이블이 없습니다.
System.Data.SqlClient.SqlException "Invalid object name [tablename]"
내가 배포 된 제품에 대한 업데이트와 함께 제공하는 DB 업데이트에서 일하고 있어요 :
는이 오류를 받고 있어요. 새로 업데이트 된 응용 프로그램이 처음 실행되면 데이터베이스 업데이트가 실행되며 두 가지 주요 단계가 있습니다.
- Run script update.sql to add new tables to the database
- 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 스크립트가 실제로 작동 한 데이터베이스 (복수형으로 명명 된 위치)를 기반으로 자동 생성되었다고 생각하면 명명 작업을 변경해야하는 이유는 무엇입니까? 무엇이든지라면 은의 문제를 일으켰습니다.
스크립트를 확인하십시오. 올바른 데이터베이스를 대상으로하고 있습니까? 거래가있는 경우 거래가 이루어지고 있습니까? – driis
예, 스크립트가 올바른 데이터베이스를 대상으로합니다. 디버깅 할 때 SQL Management Studio를 열었습니다. 예외가 나타나면 테이블이 실제로 데이터베이스에 있는지 확인할 수 있습니다. – yoozer8
테이블이 마술처럼 사라지지 않습니다. 이름을 다시 확인하고 새 테이블을 올바른 스키마에 포함 시키십시오. 응용 프로그램과 동일한 사용자로 데이터베이스에 로그인하여 사용 권한 문제를 확인하십시오. – driis