it-swarm.com.de

Wie kann man eine SQL-Abfrage direkt in C # ausführen?

Ok, ich habe eine alte Batch-Datei, die genau das tut, was ich brauche. Ohne neue Administration können wir die Batch-Datei jedoch nicht mehr ausführen, sodass ich mit C # starten muss.

Ich verwende Visual Studio C # und habe bereits die Formulare für die zu erstellende Anwendung eingerichtet. (Ich lerne wie ich gehe)

Hier ist, was ich in C # erreichen muss (Dies ist der Batch-Mut)

sqlcmd.exe -S .\PDATA_SQLEXPRESS -U sa -P 2BeChanged! -d PDATA_SQLEXPRESS  -s ; -W -w 100 -Q "SELECT tPatCulIntPatIDPk, tPatSFirstname, tPatSName, tPatDBirthday  FROM  [dbo].[TPatientRaw] WHERE tPatSName = '%name%' "

Grundsätzlich verwendet es SQLCMD.exe mit der bereits vorhandenen Datenquelle PDATA_SQLExpress.
Ich habe gesucht und bin näher gekommen, weiß aber immer noch nicht, wo ich anfangen soll.

43
Redracer68

Um Ihren Befehl direkt in C # auszuführen, verwenden Sie die Klasse SqlCommand .

Ein kurzer Beispielcode mit parametrisiertem SQL (um Injection-Attacken zu vermeiden) könnte folgendermaßen aussehen:

string queryString = "SELECT tPatCulIntPatIDPk, tPatSFirstname, tPatSName, tPatDBirthday  FROM  [dbo].[TPatientRaw] WHERE tPatSName = @tPatSName";
string connectionString = "Server=.\PDATA_SQLEXPRESS;Database=;User Id=sa;Password=2BeChanged!;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(queryString, connection);
    command.Parameters.AddWithValue("@tPatSName", "Your-Parm-Value");
    connection.Open();
    SqlDataReader reader = command.ExecuteReader();
    try
    {
        while (reader.Read())
        {
            Console.WriteLine(String.Format("{0}, {1}",
            reader["tPatCulIntPatIDPk"], reader["tPatSFirstname"]));// etc
        }
    }
    finally
    {
        // Always call Close when done reading.
        reader.Close();
    }
}
91
Nate

So etwas sollte ausreichen, um das zu tun, was Ihre Batch-Datei getan hat (das Ergebnis als durch Semikolon getrennten Text an die Konsole ausgeben):

// sqlcmd.exe
// -S .\PDATA_SQLEXPRESS
// -U sa
// -P 2BeChanged!
// -d PDATA_SQLEXPRESS
// -s ; -W -w 100
// -Q "SELECT tPatCulIntPatIDPk, tPatSFirstname, tPatSName, tPatDBirthday  FROM  [dbo].[TPatientRaw] WHERE tPatSName = '%name%' "

DataTable dt            = new DataTable() ;
int       rows_returned ;

const string credentials = @"Server=(localdb)\.\PDATA_SQLEXPRESS;Database=PDATA_SQLEXPRESS;User ID=sa;Password=2BeChanged!;" ;
const string sqlQuery = @"
  select tPatCulIntPatIDPk ,
         tPatSFirstname    ,
         tPatSName         ,
         tPatDBirthday
  from dbo.TPatientRaw
  where tPatSName = @patientSurname
  " ;

using ( SqlConnection connection = new SqlConnection(credentials) )
using ( SqlCommand    cmd        = connection.CreateCommand() )
using ( SqlDataAdapter sda       = new SqlDataAdapter( cmd ) )
{
  cmd.CommandText = sqlQuery ;
  cmd.CommandType = CommandType.Text ;
  connection.Open() ;
  rows_returned = sda.Fill(dt) ;
  connection.Close() ;
}

if ( dt.Rows.Count == 0 )
{
  // query returned no rows
}
else
{

  //write semicolon-delimited header
  string[] columnNames = dt.Columns
                           .Cast<DataColumn>()
                           .Select( c => c.ColumnName )
                           .ToArray()
                           ;
  string   header      = string.Join("," , columnNames) ;
  Console.WriteLine(header) ;

  // write each row
  foreach ( DataRow dr in dt.Rows )
  {

    // get each rows columns as a string (casting null into the nil (empty) string
    string[] values = new string[dt.Columns.Count];
    for ( int i = 0 ; i < dt.Columns.Count ; ++i )
    {
      values[i] = ((string) dr[i]) ?? "" ; // we'll treat nulls as the nil string for the nonce
    }

    // construct the string to be dumped, quoting each value and doubling any embedded quotes.
    string data = string.Join( ";" , values.Select( s => "\""+s.Replace("\"","\"\"")+"\"") ) ;
    Console.WriteLine(values);

  }

}
5
Nicholas Carey

WICHTIGER HINWEIS: Sie sollten keine SQL-Abfragen verketten, es sei denn, Sie vertrauen dem Benutzer vollständig. Die Verkettung von Abfragen birgt das Risiko, dass SQL Injection verwendet wird, um die Welt, ... khem, Ihre Datenbank zu übernehmen.

Wenn Sie nicht näher auf die Ausführung von Abfragen mit SqlCommand eingehen möchten, können Sie dieselbe Befehlszeile wie die folgende aufrufen:

string userInput = "Brian";
var process = new Process();
var startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = string.Format(@"sqlcmd.exe -S .\PDATA_SQLEXPRESS -U sa -P 2BeChanged! -d PDATA_SQLEXPRESS  
     -s ; -W -w 100 -Q "" SELECT tPatCulIntPatIDPk, tPatSFirstname, tPatSName,
     tPatDBirthday  FROM  [dbo].[TPatientRaw] WHERE tPatSName = '{0}' """, userInput);

process.StartInfo = startInfo;
process.Start();

Stellen Sie einfach sicher, dass Sie jedes doppelte Anführungszeichen " mit ""

3
Kaspars Ozols