我的一個客戶誤刪除了一個項目站點,其中有大量的文檔需要恢復。由於,這個站點構建在他的SPS之下,而他們的sps數據庫非常大,我費了一天的時間將他前天的數據庫備份恢復到另一個數據庫服務器上。我在試圖重新架設一個同樣的門戶時遇到了一些問題,於是,我想,是否通過sql直接送庫中恢復文檔來得更加直接
sps的文檔都存放在***_SITE數據庫的docs表中,表中dirname字段存放了站點的URL後邊的部分,leafname則存放的是文件或文件夾的名稱,content中存放的是文件的內容,type中標識了該條目是文件還是文件夾(0表示是文件,1表示是文件夾),於是,我編寫了一段代碼對這個文檔庫下的文檔進行恢復:
string strFilesID="";
int nCount=0;
System.Data.SqlClient.SqlCommand myCmm=new SqlCommand();
myCmm.Connection=sqlConnection2;
myCmm.CommandText="select dirname,leafname,content from docs where dirname like '%%projectserver_120/doclib%%' and type='0'";
myCmm.Connection.Open();
System.Data.SqlClient.SqlDataReader myReader;
byte[] MyData=new byte [0];
try
{
myReader=myCmm.ExecuteReader();
while (myReader.Read() )
{
nCount=nCount+1;
string strFileName="";
string strFolderId="";
//
string strFolderName="dev";
string strPath=@"d:/guangzhou/";
//
strPath=@"h:/test/";
strFileName=myReader.GetString(1);
{
strFolderId=myReader.GetString(0).ToString();
strFilesID=strFolderId;
//
strFolderName=strFolderName+strFolderId;
//
strPath=strPath+strFolderName;
strPath=strPath + strFolderId;
Directory.CreateDirectory(strPath);
strPath=strPath+@"/"+strFileName;
MyData=(byte[])myReader.GetValue(2);
int ArraySize=new int();
ArraySize=MyData.GetUpperBound(0);
if (ArraySize>=0)
{
FileStream fs=new FileStream(@strPath,@FileMode.OpenOrCreate,FileAccess.Write);
fs.Write(MyData,0,ArraySize);
fs.Close();
}
else
{
//eventLog1.WriteEntry ();
string strMyLogName="BatUploadApp";
if (!EventLog.SourceExists("BatUpload") )
{
EventLog.CreateEventSource("BatUpload",strMyLogName);
}
else
{
strMyLogName=EventLog.LogNameFromSourceName("BatUpload",".");
}
eventLog1.Source="BatUpload";
eventLog1.Log =strMyLogName;
eventLog1.WriteEntry(strFilesID,EventLogEntryType.Information);
}
}
}
MessageBox.Show(nCount.ToString());
}
catch(Exception ex)
{
MessageBox.Show(strFilesID +":" + ex.Message);
}
}