2013-08-16 28 views
5

Ho un problema in cui sono in grado di recuperare i dati dal database su una singola casella di testo. Quello che voglio è, voglio recuperare i dati di ogni caselle di testo dal database, ma quando ho provato, ottenendo l'errore:Impossibile convertire da una stringa a int32

Ecco il codice:

string connectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\Archives\Projects\Program\Sell System\Sell System\App_Data\db1.accdb;Persist Security Info=False;"); 

private List<List<TextBox>> textBoxCodeContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxQuantityContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxDescContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxSubTotalContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxTotalContainer = new List<List<TextBox>>(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    UpdateTextPosition(); 

    OleDbDataReader dReader; 
    OleDbConnection conn = new OleDbConnection(connectionString); 
    conn.Open(); 
    OleDbCommand cmd = new OleDbCommand("SELECT [Code] FROM [Data]", conn); 

    dReader = cmd.ExecuteReader(); 

    AutoCompleteStringCollection codesCollection = new AutoCompleteStringCollection(); 

    while (dReader.Read()) 
    { 
     string numString = dReader[0].ToString().PadLeft(4, '0'); 
     codesCollection.Add(numString); 
    } 

    dReader.Close(); 
    conn.Close(); 
} 

private void UpdateDatas() 
{  
    OleDbDataReader dReader; 
    OleDbConnection conn = new OleDbConnection(connectionString); 
    conn.Open(); 
    OleDbCommand cmd = new OleDbCommand("SELECT DISTINCT [Description], [Price] FROM [Data] WHERE [Code][email protected]", conn); 

    cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
    cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

    dReader = cmd.ExecuteReader(); 

    while (dReader.Read()) 
    { 
     this.textBoxDescContainer[0][0].Text = dReader["Description"].ToString(); 
     this.textBoxSubTotalContainer[0][0].Text = dReader["Price"].ToString(); 
    } 

    dReader.Close(); 
    conn.Close(); 
} 

Ho già provato aggiuntivo:

cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][1].Text; 

e

while (dReader.Read()) 
{ 
    this.textBoxDescContainer[0][1].Text = dReader["Description"].ToString(); 
    this.textBoxSubTotalContainer[0][1].Text = dReader["Price"].ToString(); 
} 

ma ho ottenuto un errore che dice: "Impossibile convertire il valore di parametro da una strin g ad un Int32"

+0

Formato di codice errato. –

+0

dove ottieni l'errore? – Default

+0

Dai suggerimenti non riusciti, sembra che tu abbia un problema con i dati. Mostraci i dati di esempio? Potrebbe essere Codice o Prezzo contenere non interi. – cjb110

risposta

2

Prova questo

si devono analizzare la stringa a Int32 DataType

cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value =int.Parse(this.textBoxCodeContainer[0][1].Text); 

Questo dovrebbe funzionare se l'utente entra in un intero valido

Per esempio

int Val=int.Parse("45");//Works for me 

Nota: Questo non funziona per i valori decimali

alternativa Se il valore Price contiene decimale che cosa si può fare è

cmd.Parameters["Code"].Value = Convert.ToInt32(Convert.ToDouble(this.textBoxCodeContainer[0][1].Text)); 

Questo dovrebbe funzionare

+0

ho già provato, ma l'errore dice: stringa di input non era nel formato corretto. cosa succede? - " – Reinhardt

+0

@Fuhans Dai un'occhiata alla mia risposta aggiornata il tuo input contiene valori decimali ?? come 45.21 o 79.45 ?? qualcosa del genere ?? – Rohit

+0

per il codice, il numero non è nel valore decimale, ma per il prezzo, contiene valori decimali nel database, che sono "10.000,00" – Reinhardt

1

Cambiare la linea

cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

a

cmd.Parameters["Code"].Value = Convert.ToInt32(this.textBoxCodeContainer[0][0].Text); 
+0

ho già provato, ma l'errore dice: stringa di input non era nel formato corretto, cosa succede? - " – Reinhardt

+0

Vorrei suggerire http://stackoverflow.com/a/18267369/503110 risposta. Possa tutto il testo nella casella di testo 'textBoxCodeContainer' non verrà convertito in int e in tal caso il tuo codice esploderà. Usa invece 'int.TryParse'. – PawanS

0
this.textBoxSubTotalContainer[0][0].Text=Convert.ToInt32(dReader["Price"].ToString()); 

La dichiarazione di cui sopra dovrebbe aiutare a ...

saluti

Anurag

+0

ho già provato, ma l'errore dice: non può implicity convertire il tipo int in stringa – Reinhardt

+0

Quale riga si ottiene l'errore a ?? – Anurag

1

questa linea

cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][1].Text; 

ha bisogno di essere modificati per

int codeValue; 
if(int.TryParse(this.textBoxCodeContainer[0][1].Text,out codeValue)) 
    cmd.Parameters["Code"].Value = codeValue; 
else 
    { 
    //do some error handling of invalid input 
    } 

come si sta cercando di passare una stringa di parametro di tipo ineteger.

0

In base al codice, in cui in realtà non si specifica dove viene generato l'errore, questa sembra essere la fonte del problema.

  cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
      cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

si è dichiarato "Code" come Integer, ma si sta assegnando un valore Text. Converti questo in Int32.

Int32 codeValue = 0; 
Int32.TryParse(this.textBoxCodeContainer[0][0].Text, out codeValue); 
cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value = codeValue; 
+0

ho già provato in questo modo, ma l'errore dice: la stringa di input non era nel formato corretto. cosa succede? - " – Reinhardt

+0

Ho modificato il codice. – SollyM

+0

Grazie, ora funziona – Reinhardt

Problemi correlati