2016-04-20 11 views
-1

Ich möchte eine Variable ändern, die in meinem SQL-Skript ist c:\script.sql unter @db durch den Benutzer zu einem anderen Pfad navigieren.Wie deklariere ich eine *. SQL-Variable in C#

SQL-Skript:

DECLARE @Table TABLE 
(
    BackupName    NVARCHAR (128) , 
    BackupDescription  NVARCHAR (255) , 
    BackupType    SMALLINT  , 
    ExpirationDate   DATETIME  , 
    Compressed    BIT    , 
    Position    SMALLINT  , 
    DeviceType    TINYINT   , 
    UserName    NVARCHAR (128) , 
    ServerName    NVARCHAR (128) , 
    DatabaseName   NVARCHAR (128) , 
    DatabaseVersion  INT    , 
    DatabaseCreationDate DATETIME  , 
    BackupSize    NUMERIC (20, 0) , 
    FirstLSN    NUMERIC (25, 0) , 
    LastLSN    NUMERIC (25, 0) , 
    CheckpointLSN   NUMERIC (25, 0) , 
    DatabaseBackupLSN  NUMERIC (25, 0) , 
    BackupStartDate  DATETIME  , 
    BackupFinishDate  DATETIME  , 
    SortOrder    SMALLINT  , 
    CodePage    SMALLINT  , 
    UnicodeLocaleId  INT    , 
    UnicodeComparisonStyle INT    , 
    CompatibilityLevel  TINYINT   , 
    SoftwareVendorId  INT    , 
    SoftwareVersionMajor INT    , 
    SoftwareVersionMinor INT    , 
    SoftwareVersionBuild INT    , 
    MachineName   NVARCHAR (128) , 
    Flags     INT    , 
    BindingID    UNIQUEIDENTIFIER, 
    RecoveryForkID   UNIQUEIDENTIFIER, 
    Collation    NVARCHAR (128) , 
    FamilyGUID    UNIQUEIDENTIFIER, 
    HasBulkLoggedData  BIT    , 
    IsSnapshot    BIT    , 
    IsReadOnly    BIT    , 
    IsSingleUser   BIT    , 
    HasBackupChecksums  BIT    , 
    IsDamaged    BIT    , 
    BeginsLogChain   BIT    , 
    HasIncompleteMetaData BIT    , 
    IsForceOffline   BIT    , 
    IsCopyOnly    BIT    , 
    FirstRecoveryForkID UNIQUEIDENTIFIER, 
    ForkPointLSN   NUMERIC (25, 0) NULL, 
    RecoveryModel   NVARCHAR (60) , 
    DifferentialBaseLSN NUMERIC (25, 0) NULL, 
    DifferentialBaseGUID UNIQUEIDENTIFIER, 
    BackupTypeDescription NVARCHAR (60) , 
    BackupSetGUID   UNIQUEIDENTIFIER NULL, 
    CompressedBackupSize NUMERIC (20, 0) 
); 

INSERT INTO @table 
EXECUTE ('RESTORE HEADERONLY FROM DISK = '@db''); 

SELECT ServerName, 
     DatabaseName, 
     SoftwareVersionMajor, 
     SoftwareVersionMinor 
FROM @table; 

ich die @ DB zu wollen = meine Variable in C#

C# -Code:

public void PullData() 
      { 
       string connString = @"server=.\sqlserver2012; database = master; user =sam; pwd =sam; Connection Timeout = 15; MultipleActiveResultSets = true"; 
       string script = File.ReadAllText(@"C:\Temp Table.sql"); 
       string db = tb_bak_location.Text; 

       SqlConnection conn = new SqlConnection(connString); 
       SqlCommand cmd = new SqlCommand(script, conn); 
       try 
       { 
        conn.Open(); 

        SqlDataAdapter da = new SqlDataAdapter(cmd); 

        da.Fill(datatable); 
        dataGridView1.DataSource = datatable; 
        da.Dispose(); 
       } 

       catch (Exception ex) 
       { 
        MessageBox.Show(ex.ToString()); 
       } 

       finally 
       { 
        conn.Close(); 
       } 
      } 

Ich möchte nur in der Lage sein, den SQL-Skript zu lesen von diesem Ort dann implementieren Sie meine db Variable, wenn ich Funktion ausführen.

Hope this Sinn

Dank

Antwort

1
string db = tb_bak_location.Text; 
    string script = File.ReadAllText(@"C:\Temp Table.sql").Replace("@db", db); 
+0

Die Ersatzmethode ist, was ich vorschlagen würde. Ich schlage jedoch vor, einen SQLCMD-Variablennamen wie '$ (db)' zu verwenden, damit das gleiche Skript von SQLCMD oder SSMS mit dem gewünschten Wert ausgeführt werden kann. SQLCMD Variablen sind ausführlich in https://msdn.microsoft.com/en-us/library/ms188714.aspx –

+0

Vielen Dank dafür! Ich habe nicht über einen Ersatz nachgedacht. Prost - jede Idee, warum ich gewählt worden bin ...? – SCramphorn

+0

Wenn 'tb_bak_location' ein Textfeld ist, haben Sie gerade eine Sicherheitslücke für Sql Injection geöffnet. –

0

Um den Parameter von einem externen Wert zu ändern, die Sie mögen, dass macht, können Sie Wert zuweisen in Ihrem in dem Parameter Code-Behind. Nach

SqlCommand cmd = new SqlCommand(script, conn); 

Verwenden

cmd.Parameters.AddWithValue(ParamName, Value); 

Auch Ihre SqlConnection und SqlCommand in der Verwendung von Block zum automatischen Handhabung Schließen und Öffnen der Verbindungen prüfen zu schaffen.

nur Google: Hinzufügen von Parametern zu SQL-Skript

Beispiel Link: http://www.csharp-station.com/Tutorial/AdoDotNet/Lesson06

+0

Das ist nicht das, was die OP überhaupt gefragt. Die Frage ist, wie man einen Befehl ausführt, nicht wie Parameter übergeben werden. Das OP sollte definitiv ein ADO.NET-Tutorial überprüfen, obwohl –

+0

Danke für den obigen Tipp. Ich werde es mir ansehen. Da ich immer noch über all das lerne, ist es nützlich zu wissen. – SCramphorn

Verwandte Themen