반응형
C#에서 SQL 쿼리를 직접 실행하는 방법
좋아, 내가 필요한 걸 정확히 하는 오래된 배치 파일이 있어.단, 새로운 관리를 하지 않으면 배치파일을 실행할 수 없기 때문에 C#부터 시작해야 합니다.
Visual Studio C#을 사용하고 있으며 빌드해야 하는 어플리케이션의 폼이 이미 설정되어 있습니다.(실행하면서 학습하고 있습니다)
C#에서 달성해야 할 것은 다음과 같습니다(이것은 배치 배짱입니다).
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%' "
기본적으로는SQLCMD.exe
이미 존재하는 데이터 소스에 의해PDATA_SQLExpress
.
찾아보고 가까워졌지만 어디서부터 시작해야 할지 모르겠어요.
C# 내에서 직접 명령을 실행하려면 SqlCommand 클래스를 사용합니다.
(주입 공격을 피하기 위해) 매개 변수화된 SQL을 사용하는 빠른 샘플 코드는 다음과 같습니다.
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();
}
}
다음과 같은 방법으로 배치 파일이 수행하던 작업을 수행할 수 있습니다(결과 세트를 세미콜론으로 구분된 텍스트로 콘솔에 덤프).
// 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);
}
}
중요: 사용자를 완전히 신뢰하지 않는 한 SQL 쿼리를 연결하지 마십시오.쿼리 연결에는 SQL Injection을 사용하여 전 세계 데이터베이스(...khem)를 인수할 위험이 있습니다.
다음을 사용하여 쿼리를 실행하는 방법에 대해 자세히 설명하지 않을 경우SqlCommand
같은 명령줄을 다음과 같이 호출할 수 있습니다.
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();
각 큰따옴표는 피해주세요."
와 함께""
언급URL : https://stackoverflow.com/questions/21709305/how-to-directly-execute-sql-query-in-c
반응형
'programing' 카테고리의 다른 글
EPPlus를 사용하여 셀을 병합하시겠습니까? (0) | 2023.04.13 |
---|---|
Swift에서 문자열을 Base64로 인코딩하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
Windows Powershell에서의 Unix tail 등가 명령어 (0) | 2023.04.13 |
n행부터 마지막행까지의 합계 (0) | 2023.04.13 |
'컷'을 사용하여 마지막 필드를 찾는 방법 (0) | 2023.04.13 |