我有一个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);
答案 0 :(得分:0)
我认为你在寻找的是:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
msdn:"指定语句可以读取已被其他事务修改但尚未提交的行。"
所以将脚本工作包装在具有隔离级别" ReadUncommited"的事务中。
这是一个很好的例子,如何在c#中使用事务:
https://msdn.microsoft.com/en-us/library/5ha4240h(v=vs.110).aspx