[SQL] 매개 변수화 SQL 쿼리
SQL매개 변수화 SQL 쿼리
C #과 SQL에서 매개 변수하지만 난 여전히 뭔가를 놓친 거지에 대한 많은 글. 나는 오류 메시지를 받고 있지 않다 그러나 데이터가 삽입되지 않습니다. 없어진 물건 있어요? 나는 FNAME, LNAME, 주소, 도시, 주 및 우편라는 이름의 텍스트 상자가 있습니다.
private void enter_button_Click(object sender, EventArgs e)
{
string first, last, addy, city1, stat, zippy;
first = fname.Text;
SqlParameter firstparam;
firstparam = new SqlParameter();
firstparam.ParameterName = "@first";
firstparam.Value = first;
last = lname.Text;
SqlParameter lastparam;
lastparam = new SqlParameter();
lastparam.ParameterName = "@last";
lastparam.Value = last;
addy = address.Text;
SqlParameter addressparam;
addressparam = new SqlParameter();
addressparam.ParameterName = "@addy";
addressparam.Value = addy;
city1 = city.Text;
SqlParameter cityparam;
cityparam = new SqlParameter();
cityparam.ParameterName = "@city1";
cityparam.Value = city1;
stat = state.Text;
SqlParameter stateparam;
stateparam = new SqlParameter();
stateparam.ParameterName = "@stat";
stateparam.Value = stat;
zippy = zip.Text;
SqlParameter zipparam;
zipparam = new SqlParameter();
zipparam.ParameterName = "@zippy";
zipparam.Value = zippy;
try
{
Validate(fname);
Validate(lname);
Validate(city);
Validate(state);
}
catch (Exception ex)
{
throw new Exception(ex.ToString(), ex);
}
try
{
exValidate(address);
}
catch (Exception ex1)
{
throw new Exception(ex1.ToString(), ex1);
}
try
{
numValidate(zip);
}
catch (Exception ex2)
{
throw new Exception(ex2.ToString(), ex2);
}
string connection = "Data Source=TX-MANAGER;Initial Catalog=Contacts;Integrated Security=True";
var sqlstring = string.Format("INSERT INTO Contacts ([First] ,[Last] ,[Address] ,[City] ,[State],[ZIP]) VALUES {0}, {1}, {2}, {3}, {4}, {5})", @first, @last, @addy, @city1, @stat, @zippy);
SqlConnection conn = new SqlConnection(connection);
SqlCommand comm = new SqlCommand();
comm.CommandText = sqlstring;
try
{
conn.Open();
//SqlTransaction trans = conn.BeginTransaction();
//comm.Transaction = trans;
comm.Parameters.Add("@first", SqlDbType.Text);
comm.Parameters.Add("@last", SqlDbType.Text);
comm.Parameters.Add("@addy", SqlDbType.Text);
comm.Parameters.Add("@city1", SqlDbType.Text);
comm.Parameters.Add("@stat", SqlDbType.Text);
comm.Parameters.Add("@zippy", SqlDbType.SmallInt);
}
catch (Exception commex)
{
throw new Exception(commex.ToString(), commex);
}
conn.Close();
}
나는이로 변경하고 그래서 여전히 아무 반응이 없습니다.
string connection = "Data Source=TX-MANAGER;Initial Catalog=Contacts;Integrated Security=True";
var sqlstring = string.Format("INSERT INTO Contacts ([First] ,[Last] ,[Address] ,[City] ,[State],[ZIP]) VALUES {0}, {1}, {2}, {3}, {4}, {5})", @first, @last, @addy, @city1, @stat, @zippy);
SqlConnection conn = new SqlConnection(connection);
SqlCommand comm = conn.CreateCommand();
comm.CommandText = sqlstring;
try
{
conn.Open();
//SqlTransaction trans = conn.BeginTransaction();
//comm.Transaction = trans;
comm.Parameters.AddWithValue("@first", first);
comm.Parameters.AddWithValue("@last", last);
comm.Parameters.AddWithValue("@addy", addy);
comm.Parameters.AddWithValue("@city1", city1);
comm.Parameters.AddWithValue("@stat", stat);
comm.Parameters.AddWithValue("@zippy", zippy);
comm.ExecuteNonQuery();
해결법
-
==============================
1.당신은 명령을 실행하는 것을 잊었다)
당신은 명령을 실행하는 것을 잊었다)
편집 : 당신은 또한 당신이 방법의 시작 부분에 만든 매개 변수를 사용하지 않았다.
... try { conn.Open(); //SqlTransaction trans = conn.BeginTransaction(); //comm.Transaction = trans; comm.Parameters.Add(firstparam); comm.Parameters.Add(lastparam); comm.Parameters.Add(addressparam); comm.Parameters.Add(cityparam); comm.Parameters.Add(stateparam); comm.Parameters.Add(zipparam); // This is what you forgot: comm.ExecuteNonQuery(); } ...
BTW, 그런 일을하지 않습니다
catch (Exception ex1) { throw new Exception(ex1.ToString(), ex1); }
그것은 그냥 아무것도 유용을 추가하지 않고 예외의 새로운 수준을 추가, 쓸모. 실제로 유용한 무언가를하는 catch 블록에 도달 할 때까지 그냥 스택까지 예외 거품을 할 수 있습니다.
-
==============================
2.제공된 샘플의 주요 문제는 다음과 같습니다
제공된 샘플의 주요 문제는 다음과 같습니다
나는 다음과 같이 코드를 리팩토링 것입니다 :
private void enter_button_Click(object sender, EventArgs e) { var first = fname.Text; var last = lname.Text; var addy = address.Text; var city1 = city.Text; var stat = state.Text; var zippy = zip.Text; Validate(fname); Validate(lname); Validate(city); Validate(state); exValidate(address); numValidate(zip); using (var conn = new SqlConnection("Data Source=TX-MANAGER;Initial Catalog=Contacts;Integrated Security=True")) using (var cmd = new SqlCommand(@"INSERT INTO Contacts ([First], [Last], [Address], [City], [State], [ZIP]) VALUES (@first, @last, @addy, @city1, @stat, @zippy)", conn)) { cmd.Parameters.AddRange( new[] { new SqlParameter(@"first", SqlDbType.VarChar).Value = first, new SqlParameter(@"last", SqlDbType.VarChar).Value = last, new SqlParameter(@"addy", SqlDbType.VarChar).Value = addy, new SqlParameter(@"city1", SqlDbType.VarChar).Value = city1, new SqlParameter(@"state", SqlDbType.VarChar).Value = stat, new SqlParameter(@"zippy", SqlDbType.SmallInt).Value = zippy }); conn.Open(); cmd.ExecuteNonQuery(); } }
참고 : 유형이 제공되지 않는 경우에 SQLCE 항상 제대로 작동하지 않기 때문에 나는 매개 변수의 데이터 유형을 공급 선호합니다.
-
==============================
3.이 훨씬 짧아집니다 :
이 훨씬 짧아집니다 :
using (SqlConnection connection = new SqlConnection(connectionString)) using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "INSERT INTO Contacts ([First], [Last], [Address], [City], [State], [ZIP]) VALUES (@first, @last, @address, @city, @state, @zip)"; command.Parameters.AddWithValue("@first", first); // or // command.Parameters.Add("@first", SqlDbType.Type).Value = first; // ... connection.Open(); command.ExecuteNonQuery(); }
그러나 모든 여기의 첫 번째는 당신이 놓친 내용은 다음과 같습니다
comm.Parameters.Add(firstparam); // instead of // comm.Parameters.Add("@first", SqlDbType.Text);
과
command.ExecuteNonQuery();
-
==============================
4.그것에 대해가는 방법은 여러 가지가 있습니다. 방법 중 하나는 try 블록과의 라인을 교체하는 것입니다 :
그것에 대해가는 방법은 여러 가지가 있습니다. 방법 중 하나는 try 블록과의 라인을 교체하는 것입니다 :
comm.Parameters.AddWithValue("@first", first); comm.Parameters.AddWithValue("@last", last); comm.Parameters.AddWithValue("@addy", addy); comm.Parameters.AddWithValue("@city1", city1); comm.Parameters.AddWithValue("@stat", stat); comm.Parameters.AddWithValue("@zippy", zippy);
당신이 할 경우, 당신은 모든 SqlParameter에의 초기화를 필요 없어요
그리고 당신은 분명히 명령을 실행해야합니다
comm.ExecuteNonQuery();
-
==============================
5.첫째 명령을 실행하지 않는, 당신은 둘째로 당신의 SQL 문자열이 잘못 될 것 ;, comm.ExecuteNonQuery ()를 호출해야합니다. 이 줄 :
첫째 명령을 실행하지 않는, 당신은 둘째로 당신의 SQL 문자열이 잘못 될 것 ;, comm.ExecuteNonQuery ()를 호출해야합니다. 이 줄 :
var sqlstring = string.Format("INSERT INTO Contacts ([First] ,[Last] ,[Address] ,[City], [State],[ZIP]) VALUES {0}, {1}, {2}, {3}, {4}, {5})", @first, @last, @addy, @city1, @stat, @zippy)
단지 일 수 있습니다
var sqlstring = "INSERT INTO Contacts ([First] ,[Last] ,[Address] ,[City] ,[State],[ZIP]) VALUES (@first, @last, @addy, @city1, @stat, @zippy)";
Thridly 당신은 실제로 당신의 명령에 매개 변수를 추가하지 않습니다. 당신은 너무 같은 매개 변수를 만들 :
SqlParameter zipparam; zipparam = new SqlParameter(); zipparam.ParameterName = "@zippy"; zipparam.Value = zippy;
하지만 당신은이를 추가 :
comm.Parameters.Add("@zippy", SqlDbType.SmallInt);
zipparam없이 참조. 이 방법은 값 기운찬 실제로 명령에 추가되지 않습니다 것을. 당신은 모든 사용하여 한 줄에서이 작업을 수행 할 수 있습니다 :
comm.Parameters.Add(new SqlParameter(@Zippy, SqlDbType.SmallInt)).Value = zippy;
from https://stackoverflow.com/questions/10898737/parameterize-sql-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MS Access에서 한 줄에 거기에 여러 값을 가진 여러 행을, 합치 (0) | 2020.06.18 |
---|---|
[SQL] SQL에서 쿼리 이상한 결과를 생성 (0) | 2020.06.18 |
[SQL] 두 테이블 사이의 SQL 동일한 단위는 1 개 셀에서 주문 번호를 필요로 (0) | 2020.06.18 |
[SQL] 에서의 SQL 서버 방법 피벗에 여러 컬럼 (0) | 2020.06.18 |
[SQL] 포스트 그레스 기능에 대한 사용자 정의 유형의 배열을 전달하는 방법 (0) | 2020.06.18 |