Как мне обойти эту распространенную проблему SQL - PullRequest
0 голосов
/ 16 марта 2011

Давным-давно не сталкивался с этим, и когда я искал решение, я не мог его найти. Я думаю, что это называется перегрузкой в ​​SQL. Обычно, когда у меня есть «» (пустая строка) для любого параметра в этом SQL, я не хочу устанавливать значение в базе данных ...

ПРИМЕЧАНИЕ. Я хочу сделать это на уровне SQL, а не на уровне C #, потому что это небрежно.

string Sql = "IF NOT EXISTS (SELECT * FROM tbl_FileSystemReferences) "
            + "INSERT INTO tbl_FileSystemReferences (UploadDir) VALUES (null) "
            + "UPDATE tbl_FileSystemReferences SET "
            + "UploadDir=@UploadDir, "
            + "ThumbnailDir=@ThumbnailDir, "
            + "ArchiveDir=@ArchiveDir, "
            + "RealDir=@RealDir, "
            + "FlashDir=@FlashDir, "
            + "AssociatedFilesDir=@AssociatedFilesDir, "
            + "EnableArchiving=@EnableArchiving, "
            + "AppWideDir=@AppWideDir, "
            + "FFmpegDir=@FFmpegDir, "
            + "InstallationDir=@InstallationDir ";

SqlCommand Command = new SqlCommand(Sql);
Command.Parameters.AddWithValue("@UploadDir", f.UploadDir);
Command.Parameters.AddWithValue("@ThumbnailDir", f.ThumbnailDir);
Command.Parameters.AddWithValue("@ArchiveDir", f.ArchiveDir);
Command.Parameters.AddWithValue("@RealDir", f.RealDir);
Command.Parameters.AddWithValue("@FlashDir", f.FlashDir);
Command.Parameters.AddWithValue("@AssociatedFilesDir", f.AssociatedFilesDir);
Command.Parameters.AddWithValue("@EnableArchiving", f.EnableArchiving);
Command.Parameters.AddWithValue("@AppWideDir", f.AppWideDir);
Command.Parameters.AddWithValue("@FFmpegDir", f.FFmpegDir);
Command.Parameters.AddWithValue("@InstallationDir", f.InstallationDir);

ExecuteNonQuery(Command);

Я знаю, что есть способ сделать это с помощью хранимой процедуры, я просто не могу вспомнить, как (я думаю, это называется перегрузкой) ....

Приветствия

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Можно ли создать хранимую процедуру вместо передачи команды в виде текста?

Таким образом, вы можете разбить каждую из строк, таких как «UploadDir = @ UploadDir», на ее собственную переменную и добавить ее в команду, только если она не пуста или не пуста

0 голосов
/ 16 марта 2011

в одну сторону будет в хранимой процедуре, где вы получите все эти параметры, затем перед запросом либо:

  • вы разрешите передать ноль
  • выпреобразовать каждый параметр в ноль, если они пусты какпри обновлении запроса:

    IF NOT EXISTS (SELECT * FROM tbl_FileSystemReferences)
    INSERT INTO tbl_FileSystemReferences (UploadDir) VALUES (null)
    UPDATE tbl_FileSystemReferences SET
    UploadDir=coalesce(@UploadDir, UploadDir),
    ThumbnailDir=coalesce(@ThumbnailDir, ThumbnailDir),
    ArchiveDir=coalesce(@ArchiveDir, ArchiveDir),
    RealDir=coalesce(@RealDir, RealDir),
    FlashDir=coalesce(@FlashDir, FlashDir),
    AssociatedFilesDir=coalesce(@AssociatedFilesDir, AssociatedFilesDir),
    EnableArchiving=coalesce(@EnableArchiving, EnableArchiving),
    AppWideDir=coalesce(@AppWideDir, AppWideDir),
    FFmpegDir=coalesce(@FFmpegDir, FFmpegDir),
    InstallationDir=coalesce(@InstallationDir, InstallationDir)
    
...