Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft.SqlServer.Smo更改列标识_C#_Sql Server - Fatal编程技术网

C# 使用Microsoft.SqlServer.Smo更改列标识

C# 使用Microsoft.SqlServer.Smo更改列标识,c#,sql-server,C#,Sql Server,我试图使用Microsoft.SqlServer.Smo从一个没有依赖项的表以及以前加载的所有数据(从另一个数据库)中更改列标识,但我遇到了如下错误:“不允许修改列对象的标识属性。必须删除并重新创建具有所需属性的对象”。问题是,我曾尝试与ManagementStudio合作,但它没有任何问题。你有什么建议吗?。提前谢谢 代码如下: foreach (Column source in sourcetable.Columns) { try { if(source.Id

我试图使用Microsoft.SqlServer.Smo从一个没有依赖项的表以及以前加载的所有数据(从另一个数据库)中更改列标识,但我遇到了如下错误:“不允许修改列对象的标识属性。必须删除并重新创建具有所需属性的对象”。问题是,我曾尝试与ManagementStudio合作,但它没有任何问题。你有什么建议吗?。提前谢谢

代码如下:

foreach (Column source in sourcetable.Columns)
{
    try
    {
        if(source.Identity)
        {
            Column column = copiedtable.Columns[source.Name];

            // column.Computed = source.Computed;
            // column.ComputedText = source.ComputedText;

            column.Identity = source.Identity;
            column.IdentityIncrement = source.IdentityIncrement;
            column.IdentitySeed = source.IdentitySeed;

            column.Alter();
        }
    }
    catch { }
}

您正在尝试更新现有记录,还是添加新记录?如果要添加新记录,请执行插入。如果要更新现有记录,请不要覆盖标识列值

若要在SQL Server中的表中插入标识值,必须告诉数据库允许您这样做。语法是:

Set Identity_Insert [table] ON
完成后,您需要再次将其关闭

Set Identity_Insert [table] OFF

再次尝试在SSMS中执行此操作,并选择将操作脚本化,而不是直接应用它。您会发现它创建了一个临时表,其identity属性设置为true(其他所有属性都相同),将数据从活动表复制到临时表中,删除活动表,并将临时表重命名为活动表。您需要对SMO执行类似的操作

复制表非常简单:迭代列、索引、外键等,然后以这种方式创建新表(在调用
create()
之前,请注意正确设置identity属性)。要移动数据,请查看Transfer类。一旦完成,它就是一个删除和重命名(或者重命名和重命名,如果你想安全的话)


我有点惊讶,SMO并没有以某种方式在封面下这样做(因为SSMS在封面下使用SMO)。如果我发现有其他东西使它自动执行此操作,我会告诉你。

我不想更新或插入新记录。我想用另一个数据库中的数据为预加载的列创建一个标识,但是这个新表没有任何依赖项,我不知道management studio如何在不删除任何对象的情况下做到这一点如果您从另一个数据库复制数据,那么您在数据库中所做的就是将数据插入表中。为此,您需要将Identity Insert设置为on。请参阅我对上述答案的编辑。您不能在现有列中添加或删除
标识。因为这在T-SQL中是不可能的,所以使用SMO也是不可能的……如果没有所有的复制把戏,就有一个好方法,但我不确定是否有一个合适的方法通过SMO复制该技术。谢谢,事实上,SSMS会像你说的那样删除并复制一个新表。我必须为我试图导出的每个表制作一个类似于SSMS的脚本