2012-08-25 2 views
0

다른 모든 공백을 전자 메일로만 업데이트 할 때 문제가 발생하면 null이 반환됩니다. 내가 SQL Server의 널 (null) 허용 선택 취소해도 2008 누군 코드는 내가 그것을 확인하고일부 데이터베이스 열만 업데이트하는 방법?

그것을 밖으로 정렬 take.Please 그것을 언급하는 경우
protected void Updateinfo_Click(object sender, EventArgs e) 
{ 
    string radiogender; 
    if (Radiochngmale.Checked == true) 
     radiogender = Radiochngmale.Text.ToString(); 
    else 
     radiogender = Radiochngfemale.Text.ToString(); 
    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = ConfigurationManager.ConnectionStrings["Con"].ConnectionString; 
    con.Open(); 
    if (con.State == ConnectionState.Open) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     Random r = new Random(); 
     int next = r.Next(); 
     if (FileUpload2.HasFile) 
     { 
      string myMap = MapPath("~/").ToLower(); 
      string ImageName = FileUpload2.PostedFile.FileName; 
      sImageFileExtension = ImageName.Substring(ImageName.LastIndexOf(".")).ToLower(); 
      if (sImageFileExtension == ".gif" || sImageFileExtension == ".png" || sImageFileExtension == ".jpg" || sImageFileExtension == ".jpeg" || sImageFileExtension == ".bmp") 
      { 
       string ImageSaveURL = myMap + "UserImage/" + next + sImageFileExtension; 
       FileUpload2.PostedFile.SaveAs(ImageSaveURL); 
      } 
      else 
       Response.Write("Invalid File"); 
     } 
     cmd.Connection = con; 
     if(chngfname.Text==null) 
      chngfname.Text="Select Firstname from Login where Email='"+Session["UserName"]+"'"; 
     if (chnglastname.Text == null) 
      chnglastname.Text = "Select Lastname from Login where Email='" + Session["UserName"] + "'"; 
     if (chngage.Text == null) 
      chngage.Text = "Select age from Login where Email='" + Session["UserName"] + "'"; 
     if (chngemail.Text == null) 
      chngemail.Text = "Select Email from Login where Email='" + Session["UserName"] + "'"; 
     if (radiogender == null) 
      radiogender = "Select gender from Login where Email='" + Session["UserName"] + "'"; 
     if (chngpassword.Text == null) 
      chngpassword.Text = "Select Password from Login where Email='" + Session["UserName"] + "'"; 
     if (FileUpload2.HasFile==null) 
      sImageFileExtension = "Select profile_pic from Login where Email='" + Session["UserName"] + "'"; 
     if (chngfname.Text == null) 
      chngfname.Text = "Select Firstname from Login where Email='" + Session["UserName"] + "'"; 
     cmd.CommandText = "Update Login set FirstName = '"+chngfname.Text+"',LastName='"+chnglastname.Text+"',Email='"+chngemail.Text+"',Password='"+chngpassword.Text+"' ,gender='"+radiogender+"',age='"+chngage.Text+"' , profile_pic='"+ next + sImageFileExtension + "' where Email='"+Session["UserName"]+"'"; 
     cmd.CommandType = CommandType.Text; 
     cmd.ExecuteNonQuery(); 
     } 
    } 

이 왜 심지어 이전 값을 복용하지 않았다 - 이것도
+2

코드 논리를 이해하지 못합니다. 왜, 텍스트 상자 (?) chngfname.Text가 null 인 경우 (그리고 그것은 null이 아닌 빈 문자열 만) SQL 문자열로 설정됩니다. 그런 다음 해당 텍스트를 로그인 테이블을 업데이트하는 데 사용되는 다른 SQL 문자열에 삽입하려고합니까? – Steve

+1

매개 변수가있는 쿼리 만 사용하십시오. 사용하기가 훨씬 쉬우 며 주사에 취약하지 않습니다. – LittleBobbyTables

+0

당신이 Page_load 메서드에서 뭔가를 사용하고 있다고 생각합니다. 너는? –

답변

2

당신의 SQL 쿼리는 다음과 같이보고 끝나는 있도록 TextBox.Text가 null 적이 없기 때문에 이런 일이 : 데이터가 실제로 무언가로 설정되어있는 하나 개 또는 두 개의 필드를 제외하고

Update Login 
    set FirstName = '', 
     LastName = '', 
where Email = '[email protected]' 

-- etc... 

. 아마 다음과 같이 보이길 원했을 것입니다 :

update login 
    set FirstName = 'John', 
     LastName = (select Lastname from login where email = '[email protected]'), 
     etc... 
where email = '[email protected]' 

그러나 하위 쿼리는 필요 없습니다. 값이 null 또는 빈 문자열 인 값을 덮어 쓰지 않으려면 SQL을 다음과 같이 만들고 매개 변수를 사용하고 텍스트 상자가 비어 있으면 DbNull로 설정합니다.

cmd.Parameters.AddWithValue("@FirstName", (chngfname.Text == String.Empty) ? DbNull.Value : chngfname.Text; 

update login 
    set FirstName = coalesce(@firstName, FirstName), 
     LastName = coalesce(@LastName, LastName), 
     etc... 
where Email = @Email 

다른 옵션은 먼저 레코드를 선택 (난 당신이 이미 완료했습니다 확신하는) 단순히 데이터베이스에 이미 동일한 값을 사용합니다.

if (chngfname.Text == String.Empty) chngfname.Text = Session["CurrentUserEntity"].FirstName; 

은 또한, 당신은 매개 변수화 쿼리로 변경해야합니다

string sql = "update login set FirstName = @firstName, LastName = @lastName, etc... where email = @email; 
cmd.Parameters.Add(...); 
+0

"(chngfname.Text == String.Empty) chngfname.Text = 세션 ["CurrentUserEntity "]. FirstName;"을 허용하지 않습니다. error with session.firstname – jeneous

+0

처음에는 DbNull을 정의하는 방법 – jeneous

+0

@jeneous - Session [ "UserName"]을 설정 한 것과 비슷한 Session [ "UserEntity"]가 현재 사용자 엔터티로 설정되어야합니다. 엔티티'public class UserEntity'를 만들고 select 문을 반환하여 모든 값을 설정하십시오 :'select * from login where ...'를 세션에 저장하십시오. DbNull은 .NET 라이브러리에서 제공되는 정적 개체입니다. 이것이 Coalesce와 함께 사용하기 위해 DbParam을 Null로 설정할 수있는 것입니다. –

1

당신은 현재의 문자열 연결 방법 대신 매개 변수화 쿼리를 사용하려고합니다.
이는 인용 문제를 해결하고 내 이전의 코멘트에 말했듯이, 그러나 SQL injiection 공격

cmd.CommandText = "Update Login set FirstName = @First, [email protected], " + 
        "[email protected], [email protected], [email protected],[email protected], " + 
        "[email protected] " + 
        "where [email protected]"; 
cmd.Parameters.AddWithValue("@First", chngfname.Text); 
cmd.Parameters.AddWithValue("@Last", chnglastname.Text); 
cmd.Parameters.AddWithValue("@Mail", chngemail.Text); 
cmd.Parameters.AddWithValue("@Pass", chngpassword.Text); 
cmd.Parameters.AddWithValue("@Gend", radiogender); 
cmd.Parameters.AddWithValue("@Age", chngage.Text); 
cmd.Parameters.AddWithValue("@Prof", next + sImageFileExtension); 
cmd.Parameters.AddWithValue("@oldMail", +Session["UserName"]); 

을 방지 할 수 있습니다, 당신의 코드가 올바르지 보인다 않습니다.
먼저 TextBox.Text는 null 일 수 없으며 빈 문자열입니다. 위의 null 값에 대한 텍스트를 건너 뛰고 데이터베이스에 공백 값을 설정하는 것으로 끝납니다. 적어도 시험을 변경하려고 시도하십시오.

if(string.IsNullOrEmpty(chngfname.Text)) 
    ...... 

그러나이 경우 위의 경우 각 내부의 코드를 변경해야합니다. 데이터베이스에서 이전 값을 검색하여 빈 문자열의 경우 사용하려면 문자열을 저장하고 텍스트 상자에 저장하지 않아야합니다.

편집 : 업데이트 프로세스를 시작하기 전에 업데이트하려는 레코드의 이전 값을로드해야합니다. 이것은 당신이 이전 값의 확인에 도달했을 때 그래서 당신이

if(string.IsNullOrEmpty(chngfname.Text)) 
    cngfname.Text = (dt.Rows["FirstName"] == DBNull.Value ? string.Empty : dt.Rows["FirstName"].ToString()); 
같은 것을 쓸 수, 해당 사용자에 대한 이전의 모든 값을 데이터 테이블에있는 지금 같은 연결

SqlDataAdapter da = new SqlDataAdapter("SELECT * from Login where EMail = @oldMail", con); 
    da.SelectCommand.Parameters.AddWithValue("@oldMail", Session["UserName"); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 

을 사용하여 수행 할 수있다

이미 누락 된 모든 필드에 대한 값을 이미 검색 했으므로 해당 sql 문자열을 제거하십시오.

+0

이제 그 문자열을 실행하는 방법을 알려주십시오. – jeneous

+0

환상적인 당신 감사합니다. – jeneous

관련 문제