¿Cómo ejecutar directamente la consulta SQL en C #? Tener archivo de muestra por lotes

Ok, tengo un viejo archivo por lotes que hace exactamente lo que necesito. Sin embargo, con la nueva administración no podemos ejecutar el archivo por lotes más, así que necesito comenzar con C #.

Estoy usando Visual Studio C # y ya tengo los formularios configurados para la aplicación que necesito comstackr. (Estoy aprendiendo sobre la marcha)

Esto es lo que necesito lograr en C # (Este es el lote de agallas)

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%' " 

Básicamente, utiliza SQLCMD.exe con el origen de datos ya existente llamado PDATA_SQLExpress .
He buscado y me he acercado, pero todavía no sé dónde comenzar.

Para ejecutar su comando directamente desde C #, usaría la clase SqlCommand .

El código de muestra rápido que utiliza SQL patwigterizado (para evitar ataques de inyección) podría verse así:

 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(); } } 

Algo así debería bastar, para hacer lo que estaba haciendo su archivo por lotes (volcar el conjunto de resultados como texto delimitado por punto y coma en la consola):

 // 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() .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); } } 

NOTA IMPORTANTE: No debe concatenar consultas SQL a menos que confíe por completo en el usuario. La concatenación de consultas implica el riesgo de que la inyección SQL se utilice para dominar el mundo, … khem, su base de datos.

Si no desea entrar en detalles sobre cómo ejecutar consultas utilizando SqlCommand , puede llamar a la misma línea de comandos de esta manera:

 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(); 

Solo asegúrate de escapar de cada comilla doble " con ""