2011-04-25 3 views
0

이 나에게 오류 System.FormatException 제공이MySQL은/​​C# 삽입 문제

//Setup MySQL 
    private MySqlConnection datconnection = new MySqlConnection(); 
    //private MySqlDataAdapter datdata = new MySqlDataAdapter(); 
    DataGrid datgridInfo = new DataGrid(); 
    int connect; 
    private Form_NewEnquiry frm_parent; 

    public Form_AddVenue(Form_NewEnquiry frm1) 
    { 
     InitializeComponent(); 
     frm_parent = frm1; 
    } 

    private void btnAdd_Click(object sender, EventArgs e) 
    { 
     connect = 0; 
     try 
     { 
       datconnection.ConnectionString = 
       "server=127.0.0.1;" 
       + "database=as;" 
       + "uid=a;" 
       + "password=a;"; 
       connect = 1; 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Connection Unavailable"); 
     } 


     //INSERT SQL Code to Insert Venue 
     if (connect == 1) 
     { 
      try 
      { 
       datconnection.Open(); 
       MySqlCommand command = new MySqlCommand("INSERT INTO venues (venue_name,venue_address1,venue_address2,venue_town,venue_county,venue_postcode,venue_telephone,venue_fax,venue_email,venue_web,venue_maxguests) VALUES (?,?,?,?,?,?,?,?,?,?,?)", datconnection); 
       command.Parameters.Add("name", MySqlDbType.VarChar, 45, tbName.Text.ToString()); 
       command.Parameters.Add("address1", MySqlDbType.VarChar, 45, tbAddress1.Text.ToString()); 
       command.Parameters.Add("address2", MySqlDbType.VarChar, 45, tbAddress2.Text.ToString()); 
       command.Parameters.Add("town", MySqlDbType.VarChar, 45, tbTown.Text.ToString()); 
       command.Parameters.Add("county", MySqlDbType.VarChar, 45, tbCounty.Text.ToString()); 
       command.Parameters.Add("postcode", MySqlDbType.VarChar, 10, tbPostcode.Text.ToString()); 
       command.Parameters.Add("telephone", MySqlDbType.VarChar, 15, tbTelephone.Text.ToString()); 
       command.Parameters.Add("fax", MySqlDbType.VarChar, 15, tbFax.Text.ToString()); 
       command.Parameters.Add("email", MySqlDbType.VarChar, 255, tbEmail.Text.ToString()); 
       command.Parameters.Add("web", MySqlDbType.VarChar, 255, tbWeb.Text.ToString()); 
       command.Parameters.Add("maxguests", MySqlDbType.Int32, 11, nudNoOfGuests.Value.ToString()); 
       command.ExecuteNonQuery(); 
       //datdata.InsertCommand = command; 
      } 
      catch (Exception eea) 
      { 
       MessageBox.Show("Error storing data"); 
       MessageBox.Show(eea.ToString()); 
       connect = 0; 
      } 
      finally 
      { 
       datconnection.Close(); 
      } 
     } 
     if (connect == 1) 
     { 
      MessageBox.Show("Data Saved"); 

      //Print 

      //Close Window 
      frm_parent.reloadVenue(); 
      this.Close(); 
     } 
    } 

에 어떤 문제가 있는지 확실하지 : 인덱스 (0부터)의 크기보다보다 크거나 같은 제로 적은이어야합니다 인수리스트

+0

예외를 throw하는 행은 무엇입니까? –

+0

Command.ExecuteNonQuery();에서 –

+0

나는 command.Parameters.Add없이 SQL 문자열을 코딩하여이를 수정했다. 대신 SQL 문자열에 연결된 값이있다. 그렇게함으로써 SQL Injection의 위험이 있음을 알고있다. 그러나 이것은 작은 내부 시스템입니다. –

답변

2

일부 데이터의 크기는 지정한 매개 변수의 크기보다 큽니다. 예를 들어

command.Parameters.Add("name", MySqlDbType.VarChar, 45, tbName.Text); 

미만 45 그것이 무엇 이미 Text 속성에) 당신은 ToString을 (필요가 없습니다

command.Parameters.Add("name", MySqlDbType.VarChar, tbName.Text.Length, tbName.Text); 
+0

안녕하세요,이 주셔서 감사합니다 -하지만 같은 오류를 변경하면 던졌습니다. 나는 길이가 길어 때 적절한 예외를 던져 MySQL의 길이이기 때문에 여기에 정적 길이를 사용했습니다 MySQL이 받아 들일 것보다. –

1

사용에 대한 tbName.Text 문자열의 크기는 끈은 피해주십시오.

또한

command.Parameters.Add("maxguests", MySqlDbType.Int32, 11, nudNoOfGuests.Value.ToString()) 

이것은 INT 매개 변수를 기대하고 문자열을 전달하는, 값을 전달하는 Convert.ToInt32을 사용하십시오.

일반적으로 이러한 오류는 명령에 선언되고 전달 된 매개 변수의 수의 차이로 인해 발생하지만 귀하의 경우에는 문제가없는 것으로 보입니다. 어떤 종류의 컨트롤입니까 nudNoOfGuests 어쩌면 형식 오류의 원인이되는 것입니까

+0

도와 주셔서 감사합니다. 그러나 .Value.ToString()은 Parameters.Add가 있어야만 4 번째 매개 변수가 항상 String이 될 것으로 예상됩니다. 이것을'command.Parameters.Add ("maxguests", MySqlDbType.Int32, 11, 10);' "인수 4가 int에서 문자열로 변환 할 수 없습니다"를 던졌습니다. 그러나 Text 속성에 ToString()이 필요 없다는 것에 동의합니다. -habbit의 힘 –

+0

그래서 nudNoOfGuests가 유효한 값을 반환하고 있습니까? – V4Vendetta

+0

예 - 단단한 코딩을해도 정수에 문자열이없는 경우 –