我试图使用SMO编写一个简单的实用程序来备份/恢复数据库.当备份文件中只有一个时间点时,这非常有效.但是,当存在定义了多个备份点的备份文件(而不是备份集)时,SMO总是选择最早的,而SSMS将始终选择最新的备份.
这导致数据的恢复不正确,我想弄清楚是否有一个我可以设置的属性会强制Restore类始终使用最新的备份点.
我已经尝试设置Restore.ToPointInTime但由于数据库的恢复模型很简单,因此无法正常工作.
我找到了一篇描述如何选择恢复时间的MSDN文章,其中包括将数据库设置为完全恢复模式:
http://technet.microsoft.com/en-us/library/ms179451(v=sql.105).aspx
这在使用SMO时是否必要,是否有办法使用纯SMO(没有C#sql命令)?我已经使用了Restore.ReadBackupHeaders,从中我可以及时提取可用的备份点,但无法设置要在任何地方恢复的备份点.
编辑:
这是我正在使用的代码,包括最近尝试通过smo设置数据库恢复模型的更改:
public void RestoreDatabase(string databaseName, string backupPath)
{
var server = new Server(GetServerConnection());
//If the database doesn't exist, create it so that we have something
//to overwrite.
if (!server.Databases.Contains(databaseName))
{
var database = new Database(server, databaseName);
database.Create();
}
var targetDatabase = server.Databases[databaseName];
targetDatabase.RecoveryModel = RecoveryModel.Full;
targetDatabase.Alter();
Restore restore = new Restore();
var backupDeviceItem = new BackupDeviceItem(backupPath, DeviceType.File);
restore.Devices.Add(backupDeviceItem);
restore.Database = databaseName;
restore.ReplaceDatabase = true;
restore.Action = RestoreActionType.Database;
var fileList = restore.ReadFileList(server);
var dataFile …Run Code Online (Sandbox Code Playgroud) 我为这些字段的命名道歉,但我必须阻止基于NDA的字段名称之类的内容.
所以基本上我在C#中,我使用Interop与外部库进行通信,这需要通过引用传递特定结构,其中一个使用union.这个结构似乎让我头疼,因为我在网上找到了一些关于如何将两种数据类型结合在一起而不是两种结构的引用.以下是两个结构的基础知识
struct datatype1
{
char field1;
char field2;
char field3;
char field4;
char field5;
char field6;
char field7;
};
struct datatype2
{
public uint field8;
public uint field9;
}
struct datatype3
{
unsigned int field10;
union
{
datatype1 field11;
datatype2 field12;
} field13;
uint field14;
unsigned char field15;
uint field16;
}
Run Code Online (Sandbox Code Playgroud)
结果结构在c#中会是什么样的?我有一些想法,其中一些似乎有效,但在一段时间后会产生一个带有reference_by_pointer消息的蓝屏,我想我的结构定义可能有些错误,而且数据不合适在结构中正确.这是我目前拥有的:
[StructLayout( LayoutKind.Sequential )]
public struct datatype1
{
public byte field1;
public byte field2;
public byte field3;
public byte field4;
public byte field5;
public byte field6;
public byte …Run Code Online (Sandbox Code Playgroud) 我花了很多时间今天和昨天试图决定是否在SQL中使用循环或游标,或者弄清楚如何使用基于集合的逻辑来解决问题.我不是新手设置逻辑,但这个问题似乎特别复杂.
我的想法是,如果我有一个所有交易的列表(10个,100个百万个)和它们发生的日期,我可以开始将一些数据组合到每日总计表中,以便通过报告和分析更快地查看它系统.伪代码就是这样的:
foreach( row in transactions_table )
if( row in totals_table already exists )
update totals_table, add my totals to the totals row
else
insert into totals_table with my row as the base values
delete ( or archive ) row
Run Code Online (Sandbox Code Playgroud)
正如您所知,循环块实现起来相对简单,并且光标/循环迭代也是如此.但是,执行时间非常慢且不实用,我的问题是:是否有一种非迭代的方式来执行这样的任务,或者这是少数例外情况,我只需要"吮吸它"并使用游标?
关于该主题进行了一些讨论,其中一些似乎是相似的,但由于if/else语句和另一个表上的操作而无法使用,例如:
如何在基于列的逻辑上合并SQL数据行? 这个问题似乎不适用,因为它只返回所有总和的视图,并且实际上并未做出关于对另一个表的添加或更新的逻辑决策
SQL循环似乎有几个关于选择的想法,有几个case语句似乎可能,但我需要完成两个操作依赖于另一个表的状态,所以这个解决方案似乎不合适.
不使用游标的每一行的SQL调用存储过程 这个解决方案似乎最接近我需要做的事情,因为它可以处理每一行上的任意数量的操作,但似乎没有达成共识组.
有什么建议如何解决这个令人沮丧的问题?
我正在使用SQL Server 2008
架构设置如下:
总计:(id int pk,totals_date date,store_id int fk,machine_id int fk,total_in,total_out)
事务:(transaction_id int pk,transaction_date datetime,store_id int fk,machine_id int fk,transaction_type(IN或OUT),transaction_amount decimal)
总计应按商店,机器和日期计算,并应将所有IN交易总计为total_in,将OUT交易计入total_out.目标是获得一个伪数据立方体.