C # SMO - Скрипт таблицы данных в файл. Бросая ошибка - PullRequest
5 голосов
/ 20 марта 2011

Я пытаюсь создать резервную копию данных, содержащихся в моей базе данных, прежде чем заново создавать таблицы.Я так далеко, чтобы подключиться к серверу и создать файл для хранения SQL.Проблема в том, что он выдает ошибку в последней строке.

"Ссылка на объект не установлена ​​для экземпляра объекта"

Я был в этом проекте весь день, поэтому, возможно, что-то упустилчто поможет свежая пара глаз.

Вот код:

public void scriptTables()
    {
        string folder = HttpContext.Current.Server.MapPath("/Scripts/SQLScripts/");

        Server myServer = new Server(".\\SQLEXPRESS");
        Database CMSDB = myServer.Databases["CMSDB"];

        Scripter script = new Scripter(myServer);
        ScriptingOptions so = new ScriptingOptions();
        so.ScriptData = true;
        so.ScriptSchema = true;
        so.ScriptDrops = false;

        foreach (Table table in CMSDB.Tables)
        {
            string tables = table.ToString();
            string filename = folder + table + ".sql";
            FileStream fs = File.Create(filename);
            so.FileName = filename;

            CMSDB.Tables[tables].EnumScript(so);
        }
    }
}

Некоторые сведения о том, что я делаю:

Я хочу получить данныекоторый уже существует в БД, а затем изменить модели сущностей.Когда приложение перезапустит EF Framework, он упадет и заново создаст базу данных, после чего я снова введу данные, которые были там ранее.Не слишком уверен, что весь процесс сработает, но это нужно будет делать до тех пор, пока они не выпустят функцию миграции в EF.

Надеюсь, кто-то может помочь.Спасибо

Ответы [ 3 ]

3 голосов
/ 20 марта 2011

Я думаю, что ваша проблема, вероятно, в table.ToString ().Попробуйте вместо этого использовать table.Name.

1 голос
/ 12 октября 2015
public void CreateScriptTable() 
{
    ServerConnection serverConnection = new ServerConnection(".");
    Server server = new Server(serverConnection);
    Database database = server.Databases["ff"];
    Table tb = database.Tables["t"];
    Scripter scripter = new Scripter(server);
    scripter.Options.ScriptData = true;
    var sb = new StringBuilder();
    foreach (string s in scripter.EnumScript(new Urn[] { tb.Urn }))
    sb.Append(s);

    System.IO.StreamWriter fs = System.IO.File.CreateText(@"ScriptTable");
    fs.Write(sb);
    fs.Close();
}
1 голос
/ 20 марта 2011

Как вы планируете вернуть данные обратно? Мне еще предстоит сначала использовать код EF, и я довольно хорошо чувствую себя на SQL-сервере, поэтому я бы определенно остановился на решении, использующем либо SSMS, либо хороший T-SQL , если бы я был на вашем месте.

Какова природа изменений схемы, которые вы делаете? Вы бросаете колонки, переставляете колонки или что-то более сложное? Если вы отбрасываете столбцы, эти столбцы можно удалить в T-SQL довольно тривиально. Если вы реорганизуете столбцы, вам придется перенести данные в временную (или стандартную / постоянную) таблицу, внести изменения, а затем записать изменения обратно. Это довольно легко сделать. Если вы расширите свои потребности, возможно, кто-то может помочь вам прийти к простому решению SQL.

...