脚本使用SMO从表中提交未提交的数据

时间:2015-09-28 06:04:36

标签: c# sql-server smo

我有一个C#win表单应用程序,它可以在应用程序运行时将数据库数据备份到脚本文件。

我使用以下代码使用SMO;

编写数据库脚本
public StringCollection GenerateDatabaseScript(string databaseName)
    {
        //Validate database name goes here  

        StringCollection dbScript = new StringCollection();

        //Create db connection                
        sqlDataAccess.DBConnect(databaseName); //Custom class to do SQL data operations (sqlDataAccess)

        //Create server and database objects
        var serverConn = new ServerConnection(sqlDataAccess.Connection);
        var dbServer = new Server(serverConn);
        var database = dbServer.Databases[databaseName];

        //Set script database options here
        //--

        //Set script database tables option here
        //--

        //Script database creation
        //I also use a method 'ScriptObjectWithBatchDelimiter' to add GO delimiter for each command manually.
        dbScript.AddRange(ScriptObjectWithBatchDelimiter(database.Script(dbScriptingOptions)).ToArray());

        //Set focus to new db                
        dbScript.Add(string.Format("USE [{0}]", databaseName));
        dbScript.Add("GO");

        foreach (Table table in database.Tables)
        {
            //Skip scripting system tables
            if (table.IsSystemObject)
                continue;

            //Script table
            dbScript.AddRange(ScriptObjectWithBatchDelimiter(table.EnumScript(tableScriptingOptions)).ToArray());
        }

        return dbScript;
    }

当遇到数据库数据中的表未提交时,此行中出现问题 ROWLOCK;

table.EnumScript(tableScriptingOptions)

问题是如何使用READUNCOMMITTED编写数据脚本?我可以设置任何属性来实现这一目标吗? 同样的问题被问到here,但唯一的答案是不合适的。

更新:尝试以下代码(假设名称中包含隔离部分),但仍无效。

database.SetSnapshotIsolation(true);

1 个答案:

答案 0 :(得分:0)

我认为你在寻找的是:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

msdn:"指定语句可以读取已被其他事务修改但尚未提交的行。"

所以将脚本工作包装在具有隔离级别" ReadUncommited"的事务中。

这是一个很好的例子,如何在c#中使用事务:

https://msdn.microsoft.com/en-us/library/5ha4240h(v=vs.110).aspx