복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  6. from https://stackoverflow.com/questions/10898737/parameterize-sql-query by cc-by-sa and MIT license