Como executar diretamente a consulta SQL em c #? Tem um arquivo de lote de exemplo

Ok, eu tenho um arquivo de lote antigo que faz exatamente o que eu preciso. No entanto, sem a nova administração, não podemos mais executar o arquivo de lote, por isso preciso iniciar com o C #.

Estou usando o Visual Studio C # e já tenho os formulários configurados para o aplicativo que preciso criar. (Estou aprendendo enquanto vou)

Aqui está o que eu preciso para realizar em c # (isso é o intestino lote)

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

Basicamente, ele usa o SQLCMD.exe com a fonte de dados já existente chamada PDATA_SQLExpress .
Eu procurei e cheguei perto, mas ainda estou perdendo por onde começar.

Para executar seu comando diretamente de dentro de C #, você usaria a class SqlCommand .

Um código de amostra rápido usando SQL parametrizado (para evitar ataques de injeção) pode ser assim:

 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 como isso deve ser suficiente para fazer o que seu arquivo de lote estava fazendo (descarregando o resultado como texto delimitado por ponto-e-vírgula no console):

 // 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: Você não deve concatenar consultas SQL, a menos que confie totalmente no usuário. A concatenação de consultas envolve o risco de SQL Injection ser usado para dominar o mundo, … khem, seu database.

Se você não quer entrar em detalhes como executar a consulta usando o SqlCommand então você pode chamar a mesma linha de comando como esta:

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

Apenas assegure-se de que você escape de cada aspas duplas " com ""