我有一个窗口应用程序,我们将在不同的系统上运行以更新数据库。 假设我们有10个系统。在10个系统中,2个系统正在使用最新的DBML最新应用程序。在最新的DBML中,我在表中添加了列。对于这些系统,一切都运作良好。
问题:
当我尝试在我使用旧数据库的旧系统上运行它时。当我运行应用程序时,它会抛出错误
找不到列
这背后的原因是DBML已更新,但数据库未更新。
我该如何处理这种情况?由于某些限制,我无法更新数据库。
答案 0 :(得分:0)
我认为在您的情况下,您应该version您的代码。您正在使用的dbml应该反映数据库的模式,在您的情况下它不会发生。
因此,我建议您使用数据库更新dbml的两个版本的应用程序。
<强>更新强>
所以我的回答是否你不能这样做,因为dbml(不反映数据库)认为列都存在。
因此,您可以尝试使用标准SqlCommand
检查此列,并直接对数据库进行查询。
答案 1 :(得分:0)
要解决此问题,我使用以下步骤:
1.在旧项DBML中的其他命名空间中添加了一个DBML项目。这是我用旧模式删除表。
2.获取表格列如下:
class CheckVersion
{
public static bool isOldSystem;
public static void CheckColumnsInMasterInventory()
{
string[] Columns = { "Col1", "Col2", "Col3", "Col4" };//New Columns Which are not present in Old table.
List<string> ColumnList = new List<string>();
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using (var schemaCommand = new SqlCommand("SELECT * FROM dbo.Table1", con))
{
con.Open();
using (var reader = schemaCommand.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
foreach (DataColumn column in dt.Columns)
{
ColumnList.Add(column.ColumnName);
}
}
}
}
var columnCount = ColumnList.Where(item => Columns.Contains(item)).Count();
if (columnCount == 4)
isOldSystem = false;
else
isOldSystem = true;
}
}
3.基于
isOldSystem
值我执行linq如下:
DataLoaderDataContext objDC = new DataLoaderDataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
DataLoaderOldDataContext objOldDC = new DataLoaderOldDataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
if (!CheckVersion.isOldSystem)
{
//objDC
}
else
{
//objOldDC
}
现在我能够处理旧数据库和新数据库。
答案 2 :(得分:-1)
可能是创建可更新视图的选项。我知道你可以为DBML添加视图。
http://msdn.microsoft.com/en-us/library/ms187956.aspx
从理论上讲,这可行。但我不得不承认我在现实生活中从未尝试过这一点。
怎么做,在SO处回答: LINQ to SQL : How to Insert record into a view?