Sql Server CE - 临时禁用特定列上的自动增量

Posted

技术标签:

【中文标题】Sql Server CE - 临时禁用特定列上的自动增量【英文标题】:Sql Server CE - Temporary disable auto increment on a specific column 【发布时间】:2011-02-10 16:11:47 【问题描述】:

这个小问题一直在我脑海中萦绕。

这里是:

是否可以暂时禁用列 ID 上的 Auto_Increment。

这样我就可以在表中添加一个新行,并能够在插入行时指定 ID 值。

然后最后再次启用 Auto_Increment,让它照常工作?

如果可能的话,我该怎么做?

表结构很简单

列名(属性)

ID (Primary Key, Auto Increment, int, not null)
Name (nvarchar(100), not null)

注意:

表名是:People。 我们还要考虑表已经有数据并且不能更改。 数据库服务器是 SQL Server CE。 如果有帮助,SQL 命令将在 C# 程序中执行。

我真的希望它可能,它会非常方便。

谢谢

编辑

SqlActions SqlActions = new SqlActions();

SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection());

try

    SqlCmd.ExecuteNonQuery();

catch (SqlCeException Error)

    Console.WriteLine(Error.ToString());


string query = "INSERT INTO People SET (ID, Nome) VALUES (@ID, @Nome)";

SqlCeCommand SqlInsert = new SqlCeCommand(query, SqlActions.Connection());

SqlInsert.Parameters.AddWithValue("@ID", 15);
SqlInsert.Parameters.AddWithValue("@Nome", "Maria");

try

    SqlInsert.ExecuteNonQuery();

catch (SqlCeException Error)

    Console.WriteLine(Error.ToString());

连接字符串有效,我试过了。

他报告:

解析查询时出错。 [ 代币行数 = 1,代币行 抵消 = 20,令牌错误 = SET ]

解决方案 感谢OrbMan

        SqlActions SqlActions = new SqlActions();

        SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection());
        try
        
            SqlCmd.ExecuteNonQuery();

            string query = "INSERT INTO People (ID, Nome) VALUES (@ID, @Nome)";
            SqlCmd.CommandText = query;
            SqlCmd.Parameters.AddWithValue("@ID", 15);
            SqlCmd.Parameters.AddWithValue("@Nome", "Vania");
            SqlCmd.ExecuteNonQuery();
        
        catch (SqlCeException Error)
        
            Console.WriteLine(Error.ToString());
        

【问题讨论】:

已经回答here... 我已经尝试过了,没有成功。 【参考方案1】:

我相信你可以使用SET IDENTITY_INSERT。我不确定这是否适用于所有版本。

更新 2:

试试这个版本:

SqlActions SqlActions = new SqlActions();
SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection());
try

    SqlCmd.ExecuteNonQuery();
    string query = "INSERT INTO People (ID, Nome) VALUES (@ID, @Nome)";
    SqlCmd.CommandText = query;
    SqlCmd.Parameters.AddWithValue("@ID", 15);
    SqlCmd.Parameters.AddWithValue("@Nome", "Maria");
    SqlCmd.ExecuteNonQuery();

catch (SqlCeException Error)

    Console.WriteLine(Error.ToString());

【讨论】:

我尝试了“SET IDENTITY_INSERT People ON”,然后我尝试插入一些指定 ID 的行,但程序崩溃了。而VB只能这样说:“无法修改列。[Column name = id]” 如果我尝试添加一行并指定 ID 而不是运行“SET IDENTITY_INSERT”,也会发生同样的情况。对于我所看到的,我认为“SET IDENTITY_INSERT”没有任何影响。 您是否将其作为一个分号分隔的批处理语句执行? @Fabio:您将其作为两个查询进行,您需要在一个查询中进行,例如,string query = "SET IDENTITY_INSERT People ON;INSERT INTO People SET (ID, Nome) VALUES (@ID, @Nome)"; @Fabio:不,那很好!它现在抱怨您的 INSERT 查询语法。删除单词SET,它不应该用于INSERT,即UPDATE 查询。我更新了我的代码。

以上是关于Sql Server CE - 临时禁用特定列上的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在连接后获取列上的特定行值

DateTime 列上的 Mono InvalidOperationException (SQL Server)

SQL Server - 同一列上的多个 PIVOT

为啥 SQL Server 不使用计算列上的索引?

提高大型表上的 SQL Server 查询性能

SQL Server XML 列上的 Where 子句过滤属性 AND 值