【发布时间】:2013-02-17 18:05:07
【问题描述】:
我必须将数据从一个 SQL Server 数据库复制到另一个 SQL Server 数据库。
在目标 SQL Server DB 中存在诸如 Identity 和其他数据类型之类的列,但在源数据库中不存在。源表只有 term 列,但目标表有 id(身份)和 term 列。
在复制过程中出现如下错误:
当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表 'Terms' 中的标识列指定显式值。
string colNames = "";
foreach (DataColumn col in ds.Tables[0].Columns)
{
colNames += col.ColumnName + ",";
}
colNames = colNames.Remove(colNames.Length - 1, 1);
sqlCmd2.Parameters.Clear();
bool hasIdentityCol = false;
sqlCmd2.CommandType = CommandType.Text;
sqlCmd2.CommandText = "SELECT OBJECTPROPERTY(object_id('" + row["Table_Name"] + "'), 'TableHasIdentity')";
if (sqlCmd2.ExecuteScalar() != DBNull.Value && Convert.ToInt32(sqlCmd2.ExecuteScalar()) > 0)
{
hasIdentityCol = true;
}
if (hasIdentityCol == true)
{
sqlCmd2.CommandText = "SET IDENTITY_INSERT dbo." + row["Table_Name"] + " ON";
sqlCmd2.Transaction = sqlTran;
sqlCmd2.ExecuteNonQuery();
}
sqlCmd2.CommandText = "INSERT INTO " + txtDestinationDatabase.Text + ".dbo." + row["Table_Name"] + "(" + colNames + ") SELECT " + colNames + " FROM " + txtSourceDatabase.Text + ".dbo." + row["Table_Name"];
sqlCmd2.Transaction = sqlTran;
sqlCmd2.ExecuteNonQuery();
if (hasIdentityCol == true)
{
sqlCmd2.CommandText = "SET IDENTITY_INSERT " + txtDestinationDatabase.Text + ".dbo." + row["Table_Name"] + " OFF";
sqlCmd2.Transaction = sqlTran;
sqlCmd2.ExecuteNonQuery();
}
【问题讨论】:
-
这和 MS Access 有关系吗?另外,源表和目标表的定义是什么?您提到源中没有标识,那么您要在目标标识列中插入哪一列?可能不应该包含此列并留给自己填充。
-
实际任务是将MS Access数据复制到sql server。 sql 数据库架构已更改。MS Access 中的表只有字段 term,sql DB 有 ID(Identity),Term 字段。
标签: c# ms-access sql-server-2008-r2 database-schema