Search code examples
sqlsql-servervb.netiissmo

The directory 'LocalApplicationData' does not exist. - SQL SMO ASP.NET Copy Database


So I have a problem. I have an ASP.NET Webforms application. I'm using SMO to do some simple copying to another database. The whole routine works perfectly through my local IIS. I have a Try Catch around the whole statement. It returns me the error: The directory 'LocalApplicationData' does not exist.

Can anyone help me with this? I have traversed Google but can't find anything (I read https://social.technet.microsoft.com/Forums/systemcenter/en-US/34fd1bce-e9a3-40bc-8d18-f80fe4ec7aaf/localapplicationdata-does-not-exist?forum=sqlsmoanddmo but need a better explaination).

My Code:

Imports System.Data.SqlClient
Imports System.Runtime.InteropServices
Imports System.Security.Principal
Imports Microsoft.SqlServer.Management.Smo
Public Class betatolive

Inherits System.Web.UI.Page

Public Shadows User As clsUser = New clsUser(Me.Page)

Private Sub betatolive_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    If User.Data.fUserLevel < 98 Then Response.Redirect("~/Admin/")
End Sub

Private Sub lnkTransferData_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim feedback As String = "Transfer successful."

    Try

        Dim dbSrcServer = New Server("123.192.4.567,1337")
        With dbSrcServer.ConnectionContext
            .LoginSecure = False
            .Login = "username"
            .Password = "password"
            .Connect()
        End With

        Dim dbSource As Database = dbSrcServer.Databases("dTransferSource")
        Dim dbDest As Database = dbSrcServer.Databases("dTransferDest")

        Dim dbTransfer As New Transfer(dbSource)

        For Each t As Table In dbSource.Tables
            If Not t.Name.Contains("OBSOLETE") And Not t.Name = "name" Then
                dbTransfer.ObjectList.Add(t)
            End If
        Next

        Dim dropDestTables As New List(Of Table)

        For Each t As Table In dbDest.Tables
            If Not t.Name = "name1" And Not t.Name = "name2" And Not t.Name = "name3" Then
                dropDestTables.Add(t)
            End If
        Next

        For Each t As Table In dropDestTables
            dbDest.Tables(t.Name).Drop()
        Next

        Dim transferOpts As New ScriptingOption
        With transferOpts
            .ClusteredIndexes = True
            .Default = True
            .FullTextIndexes = True
            .Indexes = True
            .NonClusteredIndexes = True
        End With

        With dbTransfer
            .CopySchema = True
            .CopyData = True
            .CopyAllObjects = False
            .CopyAllTables = False
            .Options = transferOpts
            .DestinationServer = dbSrcServer.Name
            .DestinationDatabase = dbVaDest.Name
            .DestinationLoginSecure = False
            .DestinationLogin = "username"
            .DestinationPassword = "password"
        End With

        dbTransfer.TransferData()

    Catch ex As Exception
        feedback = String.Format("Please do not attempt the transfer again until further notice. <br /> Transfer Error: " & ex.InnerException.Message())
    End Try

    lnkTransferData.Text = feedback
    lnkTransferData.Enabled = False
End Sub

End Class

Solution

  • Fixed.

    With dbTransfer
        .CopySchema = True
        .CopyData = True
        .CopyAllObjects = False
        .CopyAllTables = False
        .Options = transferOpts
        .TemporaryPackageDirectory = Server.MapPath("~/dbtemp")   ' This is the fix, had to create a temp folder and set that property to the path
        .DestinationServer = dbSrcServer.Name
        .DestinationDatabase = dbVaDest.Name
        .DestinationLoginSecure = False
        .DestinationLogin = "username"
        .DestinationPassword = "password"
    End With
    

    @jmcilhinney - Just FYI, I did what you said and it returns a blank string, which pointed me to the idea that maybe it needs to be set, so I checked the reference and found that property above.

    Thanks for your input, I didn't think of doing what you suggested and it lead me to solve the issue.